跳过堡垒后在远程服务器上获取退出代码

时间:2019-03-21 20:28:34

标签: linux bash ssh

我想获取我的远程命令的退出代码。 通常这很容易,但是我需要通过堡垒主机执行命令,我不知道可以通过简单的方法来执行此操作。

所以,这是我的体系结构图。

PC => Bastion => remote host

我使用以下代码执行命令并检查返回代码:

ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -At ubuntu@$ip_bastion ssh -Aq -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ubuntu@$ip_server bash <<EOF
{ ${cmd} ; } 2>&1 | sed  -e 's/^/$(colors_next exec)$region:$ip:$type${normal} /'
EOF
echo $?
if [[ $? -ne 0 ]]; then
    error "Error during the command execution."
    exit 1
fi

但是,当我的命令失败时(在最终服务器上返回255),返回码始终等于0。

感谢您的帮助:)

2 个答案:

答案 0 :(得分:0)

echo命令正在伤害您。您需要在回显之前捕获$?的值,因为假设echo命令成功执行,echo会将其重置为0。

ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -At ubuntu@$ip_bastion ssh -Aq -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ubuntu@$ip_server bash <<EOF
{ ${cmd} ; } 2>&1 | sed  -e 's/^/$(colors_next exec)$region:$ip:$type${normal} /'
EOF
rc=$?
echo $rc
if [[ $rc -ne 0 ]]; then
    error "Error during the command execution."
    exit 1
fi

(可选)您可能想要exit $rc,以便您的脚本以与SSH命令退出时相同的返回码退出,这在某些情况下可能有助于找出问题所在。

答案 1 :(得分:0)

如果您正在使用bash,则可以使用PIPESTATUS数组变量来获取管道中每个元素的退出状态。

getString()