我试图找出一些Bash-foo来检查三个不同命令的输出是否相同。我可以使用Bash脚本的几行来做到这一点,我只是想知道我想要做什么是在一行中进行一些花哨的shell I / O重定向。
我想要做的是检查SSL证书是否与特定密钥和证书签名请求匹配。
命令如下所示:
openssl x509 -noout -modulus -in certificate.crt | openssl md5
openssl rsa -noout -modulus -in privateKey.key | openssl md5
openssl req -noout -modulus -in CSR.csr | openssl md5
如果key,cert和csr匹配,那么所有这三个命令都应该吐出相同的输出,例如:“(stdin)= 95ce143e8418cf8a4f7dd718983ed4eb”。
这是一个原型:
[[ $(echo -e "blah\nblah\nblah" | uniq | wc -l) -eq 1 ]]
但我无法从那里得到最终产品。这不起作用:
[[ $(openssl x509 -noout -modulus -in certificate.crt | openssl md5 && openssl rsa -noout -modulus -in privateKey.key | openssl md5 && openssl req -noout -modulus -in CSR.csr | openssl md5 | uniq | wc -l) -eq 1 ]]
一个问题可能是我的原型从一个命令生成所有三行输出,但真实的东西使用&&
几次。
答案 0 :(得分:5)
cmp -s <( cmd1) <(cmd2) && cmp -s <( cmd1) <(cmd3)
请注意,此构造执行cmd1两次。
如果你需要每个cmd的单个exec,更复杂的行看起来像:
cmd1|tee >( cmp -s <(cmd2) )|cmp -s <(cmd3)
同样对于第二个,检查结果很复杂(你必须检查PIPESTATUS
数组)
答案 1 :(得分:1)
你可能意味着像
((1 == $( ( echo 1 && sleep 1; echo 1 && sleep 1) | sort -u | wc -l ) ))
但它可能更容易做到
x1=$( command1 )
x2=$( command2 )
x3=$( command3 )
if [[ $x1 == $x2 && $x2 == $x3 ]] ; then
echo The same.
fi
编辑: 此表单也应该有效,但减少了存储变量的数量。
x1=$(command1)
[[ $x1 == $(command2) && $x1 == $(command3) ]] && echo match
答案 2 :(得分:1)
问题是你只将最后一个命令“子管道”连接到uniq
。试试这个:
[[ $( { openssl x509 -noout -modulus -in certificate.crt | openssl md5 && openssl rsa -noout -modulus -in privateKey.key | openssl md5 && openssl req -noout -modulus -in CSR.csr | openssl md5; } | uniq | wc -l) -eq 1 ]]
花括号使得三个“子管道”就像uniq
一样,它们就像一个命令一样,类似于你的echo
原型。