SSH远程命令退出代码

时间:2018-10-01 14:42:53

标签: linux bash shell unix scripting

我知道有很多关于它的讨论,但是我需要您帮助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所在的问题。

2 个答案:

答案 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

顺便说一句,我建议您在脚本中避免使用大写的变量名-通常用于更改程序行为的环境变量。