コマンドの失敗(sshpass)により、Bashスクリプトは終了します。

コマンドの失敗(sshpass)により、Bashスクリプトは終了します。

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機能しません。

答え1

sshループは標準入力ストリームを継承し、できるだけ読み込みます。つまり、ファイルの残りの行を読みますaddress-listsshファイルから残りの行を読み取っているので、ループは1回の反復のみを実行します。技術的には、スクリプトは早期に終了しません。失敗するとにかく、好きなようにはなりません。

これを防ぐには、次のように標準入力から読み取るのを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この方法で実行すると、リモートホストで起動された一部のプログラムにデータを渡すことができますが、見つかったようにループが正しく機能しなくなります。

関連情報