为什么字符串的base64包含“\n”?

为什么字符串的base64包含“\n”?
$ echo -n "apfjxkic-omyuobwd339805ak:60a06cd2ddfad610b9490d359d605407" | base64
YXBmanhraWMtb215dW9id2QzMzk4MDVhazo2MGEwNmNkMmRkZmFkNjEwYjk0OTBkMzU5ZDYwNTQw
Nw==

输出之前有一个返回Nw==在 Linux 中生成 base64 的正确方法是什么?

终端截图

答案1

尝试:

echo -n "apfjxkic-omyuobwd339805ak:60a06cd2ddfad610b9490d359d605407" | base64 -w 0

man base64

-w,在字符--wrap=COLS
后换行(默认)。用于禁用换行。COLS760

将其设为默认的一个可能原因76是 Base64 编码旨在提供一种在电子邮件和 Usenet 帖子中包含二进制文件的方法,这种方法适用于使用 80 个字符宽度显示器的人。将 76 个字符宽度设为默认使该用例更容易实现。

答案2

在没有-w该选项的系统上(例如 Alpine Linux、Arch Linux钩子等),您可以手动处理 base64 的输出:base64initramfs

base64 some_file.txt | tr -d \\n

这是一种蛮力方法;我没有让程序合作,而是tr不加区别地删除标准输出上的每个换行符。

答案3

因此,请echo -n在重定向到 ; 之前使用 删除换行符base64,并使用base64 -w 0防止base64其自身在输出中添加换行符。

me@host:~ 
$ echo -n mypassword | base64 -w 0
bXlwYXNzd29yZA==me@host:~ # <<<<<<<<<<<<<<< notice that no line break added after "==" due to '-w 0'; so me@host is on the same line
$ echo -n 'mypassword' | base64 -w 0
bXlwYXNzd29yZA==me@host:~ # <<<<<<<<<<<<<<<<<< notice adding single quotes does not affect output, so you can use values containing spaces freely

一个很好的验证方法是用来od -c显示实际的字符。

me@host:~ 
$ echo -n bXlwYXNzd29yZA== | base64 -d | od -c
0000000   m   y   p   a   s   s   w   o   r   d
0000012

您会看到没有添加“\n”。但是,如果您使用不带“-n”的“echo”,od则会显示“\n”:

me@host:~ 
$ echo mypassword | base64 -w 0
bXlwYXNzd29yZAo=me@host:~ 
$ echo bXlwYXNzd29yZAo= | base64 -d | od -c
0000000   m   y   p   a   s   s   w   o   r   d  \n
0000013

最后,创建一个函数将会对你将来有所帮助:

base64-encode() {
    if [ -z "$@" ]; then
        echo "Encode string with base64; echoing without line break, and base64 does not print line break neither, to not introducing extra chars while redirecting. Provide the string to encode. "
        return 1
    fi
    echo -n "$@" | base64 -w 0  # here I suppose string if containing space is already quoted
}

答案4

对于任何使用 的人openssl base64,您可以使用该-A标志:

 -A                 Process base64 data on one line (requires -a)
 -a                 Perform base64 encoding/decoding (alias -base64)

以下对我有用:

echo -n '{string}' | openssl base64 -A

相关内容