次のようなbashスクリプトが必要です。
for c in computers:
do
ping $c
if ping is sucessfull:
ssh $c 'check something'
done
ssh
のみを実行し、コンピューターが応答しない場合、タイムアウトには永久に時間がかかります。そこで、ping
の出力を使用して、コンピューターが稼働しているかどうかを確認することを考えていました。それ、どうやったら出来るの?他のアイデアも素晴らしいでしょう
ping
の戻り値を使用します:
for C in computers; do
ping -q -c 1 $C && ssh $C 'check something'
done
ping
は、その単一のping(-c 1
)が成功した場合、値0で終了します。 pingタイムアウト時、または$C
を解決できない場合は、ゼロ以外の値で終了します。
ping
コマンドで-w
スイッチ(またはFreeBSDおよびOSXでは-t
)を使用してから、コマンドの戻り値を調べます。
ping -w 1 $c
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
ssh $c 'check something'
fi
接続しているホストが遠く、待ち時間が長い場合は、-w
で渡すパラメーターを調整することをお勧めします。
man ping
から:
-w deadline
Specify a timeout, in seconds, before ping exits regardless of
how many packets have been sent or received. In this case ping
does not stop after count packet are sent, it waits either for
deadline expire or until count probes are answered or for some
error notification from network.
すべてのネットワーク環境でpingの実行が許可されているわけではなく(多くの場合は許可されています)、すべてのホストがping要求に応答するわけではありません。 pingを使用せず、代わりにsshの接続タイムアウトを設定することをお勧めします。
コンピューターのcの場合; do ssh -o ConnectTimeout = 2 $ c '何かをチェック' done
これが私のハックです:
#ipaddress Shell variable can be provided as an argument to the script.
while true
do
nmap_output=$(nmap -p22 ${ipaddress})
$(echo ${nmap_output} | grep -q open)
grep_output=$?
if [ "$grep_output" == 0 ] ; then
#Device is LIVE and has SSH port open for clients to connect
break
else
#[01 : bold
#31m : red color
#0m : undo text formatting
echo -en "Device is \e[01;31mdead\e[0m right now .... !\r"
fi
done
#\033[K : clear the text for the new line
#32 : green color
echo -e "\033[KDevice is \e[01;32mlive\e[0m !"
ssh user@${ipaddress}
ping
だけに依存しません。どうして ?
-成功したping
は、成功したssh
アクセスを保証するものではありません。このスクリプトの先頭にping
testを追加して、pingが失敗した場合に終了し、上記から何もしないこともできます。
上記のbash
スクリプトスニペットは、アクセスしようとしているデバイスで、クライアント(ユーザー)が接続できるSSHポートが開いているかどうかを確認します。 nmap
パッケージをインストールする必要があります。
そのスクリプトで複数のコンピューターにssh
したい理由がわかりません。しかし、私のものはsshで1つのデバイスに機能し、ニーズに合わせて変更できます。
測定ツールとして64の値を使用することは論理的ではありません。代わりに、受信/紛失したパケットの数を使用することをお勧めします。
このスクリプトは機能します:
RESULT="1"
PING=$(ping ADDRESS -c 1 | grep -E -o '[0-9]+ received' | cut -f1 -d' ')
if [ "$RESULT" != "$PING" ]
then
DO SOMETHING
else
DO SOMETHING
fi
私はそのスクリプトを約10年前に書きました。
http://www.win.tue.nl/~rp/bin/rshall
到達可能なすべてのホストを決定し、それぞれを反復処理する部分はおそらく必要ありません。
Bashを参照した元の質問を認めて、これを Fish Shellで達成しようとしている人のための例を次に示します。
ping -q -c 1 bogus.local; and echo "pinging the Host worked"; or echo "pinging the Host didn't work"