bash - 从远程ssh命令捕获退出代码

时间:2016-08-05 22:42:16

标签: linux bash shell ssh

我正在考虑在shell脚本中捕获远程ssh命令的退出状态 我有一个shell脚本如下:

function rSSH {
   local x
   echo "Running ssh command"
   x=$(ssh -o StrictHostKeyChecking=no -i $keyPair -o ProxyCommand="ssh -W %h:%p -i $keyPair user@$bastionIP 22" user@$IP "$cmd")

   x=$?
   echo "SSH status is : $x"
   if [ $x -eq 0 ];then
      echo "Success"

   else
      echo "Failure"
      exit 1
   fi
}

rSSH
exit 0

当我将上述脚本作为后台作业执行,其中$ bastionIP(测试失败场景)无效时,退出代码为0(而不是1),我在日志中看到的唯一信息是第一个回显“运行ssh命令”,它只退出脚本。

有人可以指出我做错了什么或更好的方法来捕获远程ssh命令的退出状态。 感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

该脚本似乎在set -e下运行,这意味着当ssh连接失败时,脚本会立即退出。

答案 1 :(得分:2)

面临同样的问题。我必须在远程ssh连接上执行一堆命令,如下所示,脚本将在'echo'ing'return here ='之前终止。

ssh -v -T -i ${KEY} -p${PORT} -tt ${USER}@${IP} /bin/bash -c "'
echo "Inside Script"
exit 12
'"
echo "return here=$?"

感谢@chepner在原帖中的回复,这与我使用的问题相同      set -e

删除它有助于解决问题。

答案 2 :(得分:-1)

尝试使用另一个变量作为返回码。

function rSSH {
   local x
   echo "Running ssh command"
   x=$(ssh -o StrictHostKeyChecking=no -i $keyPair -o ProxyCommand="ssh -W %h:%p -i $keyPair user@$bastionIP 22" user@$IP "$cmd")

   local ret_code
   ret_code=$?
   echo "SSH status is : $ret_code"
   if [ $ret_code -eq 0 ];then
      echo "Success"

   else
      echo "Failure"
      exit 1
   fi
}

rSSH
exit 0