bash + sshテストをプロセスとして実行する方法

bash + sshテストをプロセスとして実行する方法

私のBashスクリプトは、次の構文を使用してSSH接続テストをテストします。

IP=12.3.4.55
sshpass -p secret123 /usr/bin/ssh -n -o  ConnectTimeout=100 -o StrictHostKeyChecking=no -xaq -q root@$IP exit

[[ $? -eq 0 ]] && echo ssh test is ok || echo ssh test is fail

しかし、私は&を使いたいです(それで、すべてのssh行はssプロセスを実行します)

だから私はこれをしました。

IP=12.3.4.55
sshpass -p secret123 /usr/bin/ssh -n -o  ConnectTimeout=100 -o StrictHostKeyChecking=no -xaq -q root@$IP exit   &

[[ $? -eq 0 ]] && echo ssh test is ok || echo ssh test is fail

しかし、上記の最後の例のsshテストは無効なIPアドレスでも機能するため、sshテストが失敗しても$?

もしそうなら、&を使用してすべてのssh構文をどのように設定しますか?

注 - オンラインに追加したいのは、1000を超えるLinuxシステムをスキャンする必要があり、&を使用する方が速いからです。

答え1

スクリプトがバックグラウンドで実行され、複数の接続を並列にテストできるように、テストを関数に移動するだけです。

#!/bin/bash

testConnection(){
  user=$1
  ip=$2
  sshpass -p secret123 /usr/bin/ssh -n -o  ConnectTimeout=100 -o StrictHostKeyChecking=no -xaq -q "$user"@"$ip" exit
  [[ $? = 0 ]] && echo "$user@$ip OK" || echo "$user@$ip FAILED"
}

users=( terdon terdon )
ips=( 123.4.5.6 127.1.0.0 )
for ((i=0;i<${#users[@]};i++)); do
   testConnection "${users[i]}" "${ips[i]}" &
done

## The script should wait and not exit until
## all background processes finish.
wait

その後、次のように実行できます。

$ foo.sh
[email protected] FAILED
[email protected] OK

答え2

結果に興味がある場合は、ある時点でwaitコマンドがバックグラウンド/サブシェルで実行されたときに結果に関心を持たなければなりません(TLDPの詳細)。https://tldp.org/LDP/abs/html/subshel​​ls.html)。

この例では、「サブシェルで実行される内容」ではなく、「サブシェルの作成」部分が成功したかどうかを確認します。

同様のことを行うこともできます。つまり、サブシェルで実行される関数があります。

#!/bin/bash

testIp() {
        ip=$1
        user=$2
        sshpass ... ssh -n -o  ConnectTimeout=100 -o StrictHostKeyChecking=no -xaq -q $USER@$IP exit

        [[ $? = 0 ]] && echo ssh test is ok || echo ssh test is fail
}

( testIp YOURIP root ) &
( testIp YOUROTHERIP root2 ) &

関連情報