我知道有很多关于它的讨论,但是我需要您帮助ssh远程命令退出代码。我有该代码:
(scan
是一个脚本,用于扫描给定文件中的病毒)
for i in $FILES
do
RET_CODE=$(ssh $SSH_OPT $HOST "scan $i; echo $?")
if [ $? -eq 0 ]; then
SOME_CODE
扫描有效,如果发现病毒,它将返回0或(错误为1)或2。但是不知何故,我的返回码始终为0。即使我扫描了病毒。
这是set -x
的输出:
++ ssh -i /home/USER/.ssh/id host 'scan Downloads/eicar.com; echo 0'
+ RET_CODE='File Downloads/eicar.com: VIRUS: Virus found.
code of the Eicar-Test-Signature virus
0'
如果我在没有ssh的“远程”计算机上运行这些命令,则为输出:
[user@ws ~]$ scan eicar.com; echo $?
File eicar.com: VIRUS: Virus found.
code of the Eicar-Test-Signature virus
2
我只想要返回代码,不需要scan
的所有其他输出。
!更新!
似乎是echo
所在的问题。
答案 0 :(得分:4)
您的ssh
总是返回0
的原因是因为最后的echo
命令总是成功!如果要从scan
获取返回码,请删除echo
或将其分配给变量并使用exit
。在我的系统上:
$ ssh host 'false'
$ echo $?
1
$ ssh host 'false; echo $?'
1
$ echo $?
0
$ ssh host 'false; ret=$?; echo $ret; exit $ret'
1
$ echo $?
1
答案 1 :(得分:1)
ssh
返回其运行的整个管道的退出状态-在这种情况下,这就是echo $?
的退出状态。
您要做的只是直接使用ssh
结果(因为您说您不需要任何输出):
for i in $FILES
do
if ssh $SSH_OPT $HOST "scan $i >/dev/lull 2>&1"
then
SOME_CODE
如果您确实必须打印返回码,则可以使用EXIT
陷阱来做到这一点而不会影响整体结果:
for i in $FILES
do
if ssh $SSH_OPT $HOST "trap 'echo \$?' EXIT; scan $i >/dev/lull 2>&1"
then
SOME_CODE
演示:
$ ssh $host "trap 'echo \$?' EXIT; true"; echo $?
0
0
$ ssh $host "trap 'echo \$?' EXIT; false"; echo $?
1
1
顺便说一句,我建议您在脚本中避免使用大写的变量名-通常用于更改程序行为的环境变量。