我正在运行一个 shell 脚本来将指纹添加到 known_hosts。
代码如下:
status=$(ssh-keyscan -T 5 $remotehost >> ~/.ssh/known_hosts 2>&1)
if [[ $? != 0 ]]; then
echo -n Error: ""
echo "$status"
exit 1
fi
结果是这样的:
ssh-keyscan -T 5 example.com
# example.com SSH-2.0-OpenSSH_5.3
example.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAA.....o9sgjFlqfli7ZQ==
直到最近我还没有遇到任何问题,但最近ssh-keyscan
成功时会在 stderr 中添加注释,并在我的 hosts 文件中填充垃圾。这最终导致 hosts 文件在两次使用同一个主机后出错,因为ssh-keygen -R example.com
命令提前运行以确保没有重复。
我一直无法找到禁用该 stderr 注释的方法。
答案1
原始脚本(我认为)是正确的,除了重定向的顺序。交换它们,以便首先将 stderr 发送到 stdout,然后将 stdout 重定向到文件(保持 stderr 不变)。这样会为您提供一个干净的输出文件和存储在变量中的所有错误。
未经测试但它应该如此工作。
因此脚本的第一行应该是...
status=$(ssh-keyscan -T 5 $remotehost 2>&1 >> ~/.ssh/known_hosts )
答案2
我可能在这里遗漏了一些东西,但改变 2>&1
它2>/dev/null
肯定可以解决问题。
我可能会做你想做的事情,就像这样,正如你所写,你的 $status 永远不会包含任何内容,因为你将所有输出重定向到 ~/.ssh/known_hosts
ssh-keyscan -T 5 $remotehost >> ~/.ssh/known_hosts 2>~/.ssh/error.log
if [[ $? != 0 ]]; then
echo -n Error: ""
cat ~/.ssh/error.log
exit 1
fi