SSH Remote command exit code

≡放荡痞女 提交于 2021-01-29 06:06:06

问题


I know there are lots of discussions about it but i need you help with ssh remote command exit codes. I have that code: (scan is a script which scans for viruses in the given file)

for i in $FILES 
do
    RET_CODE=$(ssh $SSH_OPT $HOST "scan $i; echo $?")
    if [ $? -eq 0 ]; then
        SOME_CODE

The scan works and it returns either 0 or (1 for errors) or 2 if a virus is found. But somehow my return code is always 0. Even, if i scan a virus.

Here is set -x output:

++ 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'

Here is the Output if i run those commands on the "remote" machine without ssh:

[user@ws ~]$ scan eicar.com; echo $?
File eicar.com: VIRUS: Virus found.
    code of the Eicar-Test-Signature virus
2

I just want to have the return Code, i dont need all the other output of scan.

!UPDATE!

It seems like, echo is the problem.


回答1:


The reason your ssh is always returning 0 is because the final echo command is always succeeding! If you want to get the return code from scan, either remove the echo or assign it to a variable and use exit. On my system:

$ ssh host 'false'
$ echo $?
1
$ ssh host 'false; echo $?'
1
$ echo $?
0
$ ssh host 'false; ret=$?; echo $ret; exit $ret'
1
$ echo $?
1



回答2:


ssh returns the exit status of the entire pipeline that it runs - in this case, that's the exit status of echo $?.

What you want to do is simply use the ssh result directly (since you say that you don't want any of the output):

for i in $FILES 
do
    if ssh $SSH_OPT $HOST "scan $i >/dev/lull 2>&1"
    then
        SOME_CODE

If you really feel you must print the return code, that you can do that without affecting the overall result by using an EXIT trap:

for i in $FILES 
do
    if ssh $SSH_OPT $HOST "trap 'echo \$?' EXIT; scan $i >/dev/lull 2>&1"
    then
        SOME_CODE

Demo:

$ ssh $host "trap 'echo \$?' EXIT; true"; echo $?
0
0
$ ssh $host "trap 'echo \$?' EXIT; false"; echo $?
1
1

BTW, I recommend you avoid uppercase variable names in your scripts - those are normally used for environment variables that change the behaviour of programs.



来源:https://stackoverflow.com/questions/52593583/ssh-remote-command-exit-code

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!