Bash:无法捕获通过 SSH 远程执行的命令的退出代码

Bash:无法捕获通过 SSH 远程执行的命令的退出代码

我正在使用 OpenSSH,并且有以下 bash 脚本,名为在 Debian 8 (Jessie) Linux 上:

#!/bin/bash

ssh [email protected] "$1"

if [[ $? ]]; then
   echo "Pass"
else
   echo "Fail"
fi

我正在按如下方式执行该脚本:

root@my_host:~/bin# foo 'echo "Hello world!"'
Hello world!
Pass
root@my_host:~/bin# foo true
Pass
root@my_host:~/bin# foo false
Pass
root@my_host:~/bin# foo not_a_command
bash: not_a_command: command not found
Pass

我显然没有成功捕获远程执行命令的退出代码。我该怎么做?

答案1

if [[ $? ]]; then

这将测试“$?”的值是否为空字符串。当然不是,因此测试结果始终为真。

您想要执行以下其中一项操作:

if ssh [email protected] "$1"; then
    echo pass
else
    echo fail
fi

或者,如果您明确想要引用$?

if [[ $? = 0 ]]; then
    echo pass
else
    echo fail
fi

答案2

精美手册ssh(1)我们可能会偶然发现

EXIT STATUS
     ssh exits with the exit status of the remote command or with 255 if an
     error occurred.

这似乎与你的说法相矛盾;通过一些测试,人们可能会发现

$ ssh [email protected] true; echo $?
0
$ ssh [email protected] false; echo $?
1
$ 

(除非有一个 shell 函数可以掩盖真正的命令;如果是这种情况,ssh请尝试使用完全限定的路径来避免这种情况)这表明该构造是有问题的;这很容易测试和证明ssh[[ $? ]]

$ true; [[ $? ]] && echo yea
yea
$ false; [[ $? ]] && echo yea
yea
$ 

因此,我们可以使用如下的相等性测试

$ true; [[ $? -eq 0 ]] && echo yea
yea
$ false; [[ $? -eq 0 ]] && echo yea
$ 

相关内容