我正在尝试执行一个脚本,在脚本的中间,它在远程 shell 中执行了一部分代码,然后再次返回到同一个本地 shell。
但是,我的问题是关于在远程 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
'"
Ref: 我从here 了解到这个远程执行方法
请帮助我理解远程 shell 执行的这种行为。另外,如果有任何其他方法可以通过 ssh 远程执行 shell 脚本的一部分,请提出建议。
最佳答案
最外面的引号是双引号,因此 $?
在您远程运行 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
'
关于linux - 先前命令执行的退出代码始终为 0——在远程 Shell 执行中 $?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53802881/