bash - shell 和脚本中的不同 MD5 输出

标签 bash shell echo fritzbox

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

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

echo -n "challenge-password1234" | iconv -f ISO8859-1 -t UTF-16LE | md5

输出到 2f42ad272c7aec4c94f0d9525080e6de

通过将其粘贴到 shell 输出中来完成确切的操作 1722e126192656712a1d352e550f1317

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

bash script.sh 调用脚本会得到正确的散列值,用 sh script.sh 调用它会得到错误的散列值,从而导致新问题: 为什么 sh 和 bash 的输出有什么不同?

最佳答案

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

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

$ printf "%s" "challenge-password1234" | iconv -f ISO8859-1 -t UTF-16LE | md5
1722e126192656712a1d352e550f1317

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

$ printf "%s\n" "-n challenge-password1234" | iconv -f ISO8859-1 -t UTF-16LE | md5
2f42ad272c7aec4c94f0d9525080e6de

关于bash - shell 和脚本中的不同 MD5 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29277921/

相关文章:

linux - 将目录中每个文件的标签之间的文件内容提取到新位置

shell - 我如何回显相同的字符直到行尾

bash - 开始时使用 echo -n 命令的有趣行为

linux - 将循环索引的值(增量)分配给bash中的变量

bash - 如何使用批处理和登录打开腻子然后在 bash 上执行命令列表

shell - 需要有关 unix 脚本的帮助以从特定位置读取数据并使用查询中提取的数据

shell - 快速的 emacs shell 模式?

php - PHP中可以操作echo来写入文件吗

bash - bash 中的 perl : How to call perl on a script saved in a string

shell - 如何通过shell脚本导出多行环境变量