先前命令执行的退出代码始终为0-在远程Shell执行中$?

时间:2018-12-16 14:02:20

标签: linux bash shell unix

我正在尝试执行一个脚本,在脚本的中间,它在远程外壳程序中执行部分代码,然后再次返回同一本地外壳程序。

但是,我的问题是关于在远程shell中执行的命令的退出代码。我正在尝试使用基于退出代码的if-then-else在远程进行决策。当它没有按预期执行时,我尝试缩小问题范围。

这是我的发现,

输出始终是IP Found,如$?始终等于0。

ssh root@<remote server> bash -c "'
host www.google.com123
if [ $? != 0 ]
then
    echo "Invalid Host"
else
    echo "IP Found"
fi

'"

此外,在这种情况下,预期输出相同

ssh root@<remote server> bash -c "'
host www.google.com
if [ $? != 0 ]
then
    echo "Invalid Host"
else
    echo "IP Found"
fi

'"

参考:我从here

开始了解这种远程执行方法

请帮助我了解远程Shell执行的这种行为。另外,如果还有其他方法可以通过ssh远程执行shell脚本的一部分,请提出建议。

1 个答案:

答案 0 :(得分:3)

最外面的引号是双引号,因此$?在远程运行bash之前会在本地展开。而是使用

ssh root@<remote server> 'bash -c "
host www.google.com123
if [ \$? != 0 ]
then
    echo \"Invalid Host\"
else
    echo \"IP Found\"
fi

"'

更简单的做法是完全避免显式检查$?

ssh root@<remote server> 'bash -c "
if ! host www.google.com123
then
    echo \"Invalid Host\"
else
    echo \"IP Found\"
fi

"'

更简单的是不运行第二个不必要的shell。

ssh root@<remote server> '
if ! host www.google.com123
then
    echo "Invalid Host"
else
    echo "IP Found"
fi
'