簡體   English   中英

SSH遠程命令退出代碼

[英]SSH Remote command exit code

我知道有很多關於它的討論,但是我需要您幫助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是問題所在。

您的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

ssh返回其運行的整個管道的退出狀態-在這種情況下,這就是echo $?的退出狀態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

順便說一句,我建議您在腳本中避免使用大寫的變量名-通常用於更改程序行為的環境變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM