私の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/subshells.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 ) &