[英]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.