Bash

命令失敗時退出 Bash 腳本 (sshpass)

  • January 8, 2020

我需要通過 SSH 對伺服器列表執行操作。

我正在使用 sshpass,該操作可能會失敗,但它應該會發生幾次,並且腳本仍應繼續。

#!/bin/bash

while read address; do
   echo -n "$address "
   sshpass -p password ssh -o StrictHostKeyChecking=no user@$address 'ls /path/to/some/dir'
done < address-list

但是,該命令通過 ssh 在第一台主機上執行失敗,腳本立即退出。

無論如何,我怎樣才能讓循環繼續執行?在我的命令後添加退出並不能解決此問題,並且取消設置錯誤退出set +e也不起作用。

ssh將從循環中繼承標準輸入流並儘可能多地從中讀取,這意味著它將從您的address-list文件中讀取剩餘的行。由於ssh正在從文件中讀取剩餘的行,因此循環只會進行一次迭代。從技術上講,該腳本不會過早終止或以任何方式失敗,它只是沒有執行您希望它執行的操作。

為避免這種情況,請使用ssh -n防止ssh從標準輸入讀取:

while read address; do
   echo -n "$address "
   sshpass -p password ssh -n -o StrictHostKeyChecking=no "user@$address" 'ls /path/to/some/dir'
done < address-list

ssh以這種方式執行,以便您能夠將數據傳遞到在遠端主機上啟動的某個程序中,但正如您所發現的,在您的情況下,這將阻止您的循環正​​常執行。

引用自:https://unix.stackexchange.com/questions/560960