我正在使用 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
$