gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:14:01 26 4
gpt4 key购买 nike

这让我发疯,我正在尝试基于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com