Base64编码是添加一个新行。

8

我正在尝试在Linux命令行中使用base64对数据库字符串进行编码。

一旦完成编码,我会将该值添加到Kubernetes中的机密中,但是由于数据库字符串未被接受,我的应用程序无法连接到数据库。当我在镜头中检查该值时,似乎会添加一个换行符,并且在同一机密中的类似集群中不存在该换行符。

jdbc:postgresql://test.xxxxxxxx.eu-west-2.rds.amazonaws.com/test

deirdre$ echo jdbc:postgresql://test.xxxxxxxx.eu-west-2.rds.amazonaws.com/test | base64 | tr -d "\n"
amRiYzpwb3N0Z3Jlc3FsOi8vdGVzdC54eHh4eHh4eC5ldS13ZXN0LTIucmRzLmFtYXpvbmF3cy5jb20vdGVzdAo=

我是不是做错了什么?还是 / 存在问题?

4个回答

14

9
问题在于base64为了兼容具有最大行宽的旧系统而添加换行符。您可以添加-w 0选项到base64命令中以更改其行为,使其不再添加换行符。
在您的示例中,这将是:
echo "jdbc:postgresql://test.xxxxxxxx.eu-west-2.rds.amazonaws.com/test" | base64 -w 0

导致这样的结果

amRiYzpwb3N0Z3Jlc3FsOi8vdGVzdC54eHh4eHh4eC5ldS13ZXN0LTIucmRzLmFtYXpvbmF3cy5jb20vdGVzdAo=

编辑:

printf "%s" jdbc:postgresql://test.xxxxxxxx.eu-west-2.rds.amazonaws.com/test | base64 -w 0 

生成正确的输出,这会在base64编码字符串中添加一个额外的换行符,这显然是必要的,以便URL被识别为已正确结束


嗨,谢谢回复。我实际上尝试过了,但它产生了相同的编码值,你看你的输出与我的上面一样吗?这真的很奇怪。 - DeirdreRodgers
2
嗨,很抱歉,我似乎误读了问题。因为Base64在每76个字符后还会添加额外的'\n'字符。你可以尝试使用以下输出: “printf”%s“jdbc:postgresql:// test.xxxxxxxx.eu-west-2.rds.amazonaws.com/test | base64 -w 0”如果这不起作用,我目前没有其他想法。 - meaningqo

1
所以在重定向到base64之前,请使用echo -n来删除换行符;并且使用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
}

在我的系统上,base64似乎没有-w选项,它代表什么(空格)? - szeitlin
1
我正在使用 Ubuntu 和 base64 (GNU coreutils) 8.28。它代表着 -w, --wrap=COLS 在每个 COLS 字符后包装编码行(默认 76)。使用 0 禁用行包装 - WesternGun
好的。这不是我所使用的 macOS 版本上的选项。谢谢! - szeitlin
1
macOS默认使用-w0,所以我认为你不需要担心。在Stack Overflow上搜索一下,你就会看到它。 - WesternGun
1
从Google返回的这里。在这里搜索功能不太好用。 - WesternGun
显示剩余4条评论

1
另一种编码字符串的方法是使用cat而不是echo,这样你的字符串将被记录在你的bash历史记录($HOME/.bash_history)中。
使用这个命令,你的字符串不会被记录在你的历史记录中,这在你的字符串包含凭据时可能非常有用。
cat | tr -d "\n" | base64

输入您的字符串,然后按回车键,再按CTRL+D键。

示例:

user@computer$ cat | tr -d "\n" | base64
myuser:mypassword
bXl1c2VyOm15cGFzc3dvcmQ=

请注意,tr -d "\n" 是用来删除换行(LF)字符的。

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