Base64编码换行

26

我正在尝试在shell脚本中将一些十六进制值编码为base64。

nmurshed@ugster05:~$ echo -n  "1906 1d8b fb01 3e78 5c21 85db 58a7 0bf9 a6bf 1e42 cb59 95cd 99be 66f7 8758 cf46 315f 1607 66f7 6793 e5b3 61f9 fa03 952d  9101 b129 7180 6f1d ca93 3494 55e0 0e2e" | xxd -r -p | base64
GQYdi/sBPnhcIYXbWKcL+aa/HkLLWZXNmb5m94dYz0YxXxYHZvdnk+WzYfn6A5UtkQGxKXGAbx3K
kzSUVeAOLg==

我在76个字符后自动换行,有什么方法可以避免这种情况吗?

我在网上找到,可以使用"-n"来忽略换行...有人能提供其他建议吗?


3
这实际上不是一个Bash问题——它取决于您的xxdbase64实现,这些实现由您的操作系统提供,而不是由Bash提供。 - Charles Duffy
我有一个通过base64编码的cookie值,当我解码它时,我得到了64个十六进制值...现在我正在尝试将其重新编码以获取该cookie值...不应该有任何换行符... - Niyaz Murshed
此外,echo -n 实际上是未定义行为(根据 POSIX 标准的 echo);例如,如果运行了 set -o posix; shopt -s xpg_echo 命令,则命令 echo -n hello 将在其输出中发出 -n hello。如果您想要可靠和一致的行为,请考虑使用 printf,并参见 http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html。 - Charles Duffy
2个回答

42

echo -n在这里实际上并不重要:它控制echo的输出是否有换行符,但echo是否发出换行符与xxdbase64是否发出换行符无关。

因为xxd忽略输入中的任何尾随换行符,所以echoecho -n在这里的行为完全相同;echo是否输出换行符没有影响,因为当读取其输入时,xxd会消耗该换行符(如果存在)。相反,你最终关心的是base64的输出,这是生成最终结果的内容。


假设你拥有GNU版本的base64,则添加-w 0以禁用其输出中的换行符。因此:

printf '%s' "1906 1d8b fb01 3e78 5c21 85db 58a7 0bf9 a6bf 1e42 cb59 95cd 99be 66f7 8758 cf46 315f 1607 66f7 6793 e5b3 61f9 fa03 952d  9101 b129 7180 6f1d ca93 3494 55e0 0e2e" \
  | xxd -r -p \
  | base64 -w 0

谢谢...解决了我第一个问题,还有很多问题需要解决...再次感谢您如此迅速的回复。 - Niyaz Murshed
echo "foo" | base64 -w 0; echo "bar" | base64 -w 0 返回将两个结果连接到一行的结果。echo "foo" | base64 -w 99999; echo "bar" | base64 -w 99999 将返回2行,每个结果占用1行。如果您有一个字符串列表要进行 base64 编码,则此方法非常有用。 - ckeeney
那么,我更倾向于使用base64 -w 0 <<<"foo"; echo; base64 -w 0 <<<"bar"; echo来明确事情--这样你就不会遇到将Base64编码为长度超过99,999个字符的字符串的特殊情况了。 - Charles Duffy

17

我曾经遇到一个类似的问题,在这个问题中, var1=$(echo -n "$USER:$PASSWORD" | base64) 会导致一个错误的base64编码值,无法在脚本的下一步中使用,使用printf就没有问题了。下面是我的代码:

var1=$(printf "%s" "${USER}:${PASSWORD}" | base64)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接