如何按组分隔远程ssh退出代码?

问题描述 投票:0回答:1

我正在执行远程SSH请求,例如ssh root@server "cat somefile"

我如何确定它是否由于命令/文件问题(例如文件不存在,错误的命令,错误的参数等)或连接问题(例如SSH端口关闭,主机关闭,DNS无法解析)而失败等)?

我知道我可以使用特定的退出代码,但是有一些通用方法不指定每个退出代码吗?有点像

if [ $? -eq 1 ]; then
    echo "command error"
elif [ $? -eq 2 ]; then
    echo "connection error"
fi
bash ssh exit-code
1个回答
0
投票

来自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内使用exitsome command时,退出代码不会在末尾打印。在这种情况下,您可以在陷阱中打印退出代码。

© www.soinside.com 2019 - 2024. All rights reserved.