我正在执行远程SSH请求,例如ssh root@server "cat somefile"
。
我如何确定它是否由于命令/文件问题(例如文件不存在,错误的命令,错误的参数等)或连接问题(例如SSH端口关闭,主机关闭,DNS无法解析)而失败等)?
我知道我可以使用特定的退出代码,但是有一些通用方法不指定每个退出代码吗?有点像
if [ $? -eq 1 ]; then
echo "command error"
elif [ $? -eq 2 ]; then
echo "connection error"
fi
来自man ssh
:
ssh以远程命令的退出状态退出,如果发生错误,则以255退出。
因此只有一个特殊的退出代码。您不必保留诸如“ SSH端口已关闭”,“主机已关闭”等之类的退出代码列表。
如果您的命令永远不会以255退出,或者您不关心可以使用的特定代码,则>]
ssh root@server 'some command' sshstatus=$? if (( status == 255 )); then echo "connection error" elif (( status != 0 )); then echo "command error" fi
如果您需要捕获命令中的所有退出代码(甚至是255),或者您真的,真的,真的不想手动指定任何特殊的退出代码,那么您必须在服务器上打印命令的退出代码并在客户端提取它:
cmdstatusfile=$(mktemp) ssh root@server 'some command; status=$?; wait; printf %03d $status' | tee >(tail -c3 "$cmdstatusfile") | head -c-3 sshstatus=$? cmdstatus=$(< "$cmdstatusfile") rm "$cmdstatusfile" if (( sshstatus != 0 )); then echo "connection error" elif (( cmdstatus != 0 )); then echo "command error" fi
如果您通常将
ssh ...
用管道传输到某些内容中,您仍然可以这样做。只需在head ...
之后添加管道即可。
此方法假定some command
始终正常退出。在set -e
内使用exit
或some command
时,退出代码不会在末尾打印。在这种情况下,您可以在陷阱中打印退出代码。