shell 和脚本中的不同 MD5 输出

Fig*_*edi 5 bash shell echo fritzbox

这让我发疯,我试图根据 fritzbox SPEC 进行一些 MD5 计算来登录。基本上你必须将挑战和密码转换为 UTF-16LE,然后通过 md5 对其进行哈希处理,然后 concatchallenge-md5(uft -16le(挑战密码))

为此,我在脚本中使用 mac OSX 中的 iconv 和 md5

echo -n "challenge-password1234" | iconv -f ISO8859-1 -t UTF-16LE | md5
Run Code Online (Sandbox Code Playgroud)

哪个输出到2f42ad272c7aec4c94f0d9525080e6de

只需将其粘贴到 shell 输出中即可完成确切的操作1722e126192656712a1d352e550f1317

后一个是正确的(被 fritzbox 接受),第一个是错误的。

调用脚本时会产生bash script.sh正确的哈希值,调用脚本时会产生sh script.sh错误的哈希值,这会带来新的问题:sh 和 bash 之间的输出有何不同?

Gor*_*son 4

不同版本的echo行为方式截然不同。有些采用命令选项(例如-n)来修改其行为(包括-n抑制尾随换行符),而有些则不这样做。有些解释字符串本身中的转义序列(包括\c在字符串末尾抑制尾随换行符)...有些则不解释。有些人两者兼而有之。您系统上的 (/bin/echo)版本似乎echo不带选项,因此被视为-n要打印的字符串。如果您使用的是 bash,它的内置版本会覆盖 /bin/echo,并且解释标志。

基本上,echo是一堆不一致和可移植性陷阱。所以不要使用它,printf而是使用它。它有点复杂,因为您必须指定格式字符串,然后指定您想要打印的实际内容,但它可以节省很多麻烦。

$ printf "%s" "challenge-password1234" | iconv -f ISO8859-1 -t UTF-16LE | md5
1722e126192656712a1d352e550f1317
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这是echo命令实际打印的内容:

$ printf "%s\n" "-n challenge-password1234" | iconv -f ISO8859-1 -t UTF-16LE | md5
2f42ad272c7aec4c94f0d9525080e6de
Run Code Online (Sandbox Code Playgroud)