nmap の ping-scan フラグを使用することをお勧めします。
$ nmap -sn 192.168.1.60-70
Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-04-09 20:13 BST
Host machine1.home (192.168.1.64) appears to be up.
Host machine2.home (192.168.1.65) appears to be up.
Nmap finished: 11 IP addresses (2 hosts up) scanned in 0.235 seconds
とはいえ、自分で書きたい場合 (これで十分です)、私なら次のようにします:
for ip in 192.168.1.{1..10}; do ping -c 1 -t 1 $ip > /dev/null && echo "${ip} is up"; done
..および上記のコマンドの各ビットの説明:
IP アドレスのリストを生成しています
06
を使用できます たとえば、数字のリストを生成する構文..
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
( 16
のようなものにも役立ちます - 21
になります と 39
、それぞれ 49
を含む および 57
)
したがって、IP のリストを生成するには、次のようにします
$ echo 192.168.1.{1..10}
192.168.1.1 192.168.1.2 [...] 192.168.1.10
ループ
bash で何かをループするには、61
を使用します :
$ for thingy in 1 2 3; do echo $thingy; done
1
2
3
ping
次に、ping を実行します。ping コマンドは、オペレーティング システムやディストリビューション/バージョンによって少し異なります (現在 OS X を使用しています)。
デフォルトでは (これも OS X バージョンの 70
では )中断されるまでpingを実行しますが、これは機能しません。したがって、85
マシンが起動しているかどうかを判断するのに十分なパケットを 1 つだけ送信しようとします。
もう 1 つの問題はタイムアウト値です。このバージョンの ping では 11 秒のようです。99
を使用して変更されています。 国旗。ローカル ネットワーク上のマシンが生きているかどうかを確認するには、1 秒で十分です。
したがって、使用する ping コマンドは..
$ ping -c 1 -t 1 192.168.1.1
PING 192.168.1.1 (192.168.1.1): 56 data bytes
--- 192.168.1.1 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
ping の結果を確認しています
次に、マシンが応答したかどうかを知る必要があります..
104
を使用できます 最初のコマンドが成功した場合にコマンドを実行する演算子。例:
$ echo && echo "It works"
It works
$ nonexistantcommand && echo "This should not echo"
-bash: nonexistantcommand: command not found
よし、そうしよう..
ping -c 1 -t 1 192.168.1.1 &&echo "192.168.1.1 is up!"
もう 1 つの方法は、ping の終了コードを使用することです。ping コマンドは、成功した場合は終了コード 0 (成功) で終了し、失敗した場合はゼロ以外のコードで終了します。 bash では、変数 115
で最後のコマンド終了コードを取得します
したがって、コマンドが機能したかどうかを確認するには、..
ping -c 1 -t 1 192.168.1.1;
if [ $? -eq 0 ]; then
echo "192.168.1.1 is up";
else
echo "ip is down";
fi
ping 出力の非表示
最後に、ping の出力を確認する必要がないため、124
をリダイレクトできます。 136
へ 147
で リダイレクト、例:
$ ping -c 1 -t 1 192.168.1.1 > /dev/null && echo "IP is up"
IP is up
150
をリダイレクトするには (164
を破棄するには メッセージ)、174
を使用します - 例:
$ errorcausingcommand
-bash: errorcausingcommand: command not found
$ errorcausingcommand 2> /dev/null
$
スクリプト
それで、すべてを組み合わせると..
for ip in 192.168.1.{1..10}; do # for loop and the {} operator
ping -c 1 -t 1 192.168.1.1 > /dev/null 2> /dev/null # ping and discard output
if [ $? -eq 0 ]; then # check the exit code
echo "${ip} is up" # display the output
# you could send this to a log file by using the >>pinglog.txt redirect
else
echo "${ip} is down"
fi
done
または、186
を使用して メソッド、ワンライナーで:
for ip in 192.168.1.{1..10}; do ping -c 1 -t 1 $ip > /dev/null && echo "${ip} is up"; done
問題
遅いです..各 ping コマンドには約 1 秒かかります (-t タイムアウト フラグを 1 秒に設定しているため)。一度に 1 つの ping コマンドしか実行できません..これを回避する明白な方法は、スレッドを使用することです。これにより、並行コマンドを実行できますが、それは bash を使用する目的を超えています..
「Python スレッド - 最初の例」では、Python スレッド モジュールを使用してマルチスレッド ping'er を作成する方法について説明しています。 ..
現実の世界では、nmap を使用できます 欲しいものを手に入れるために。
nmap -sn 10.1.1.1-255
これにより、10.1.1.1 から 10.1.1.255 の範囲のすべてのアドレスに ping が送信され、どのアドレスが応答したかがわかります。
もちろん、実際にこれを bash の演習として実行したい場合は、アドレスごとに ping を実行して出力を解析することもできますが、それはまったく別の話です。
ネットワークが 10.10.0.0/24 であると仮定すると、
のようにブロードキャスト アドレスで ping を実行するとping -b 10.10.0.255
ICMP ping ポートをブロックしていない、このネットワーク上のすべてのコンピューターから回答が得られます。
64 bytes from 10.10.0.6: icmp_seq=1 ttl=64 time=0.000 ms
64 bytes from 10.10.0.12: icmp_seq=1 ttl=64 time=0.000 ms
64 bytes from 10.10.0.71: icmp_seq=1 ttl=255 time=0.000 ms
したがって、たとえば awk を使用して、4 番目の列を抽出するだけです。
ping -b 10.10.0.255 | grep 'bytes from' | awk '{ print $4 }'
10.10.0.12:
10.10.0.6:
10.10.0.71:
10.10.0.95:
重複するので、':' を削除する必要があるかもしれません。
コメントからの編集:-c オプションは、スクリプトが終了するため、ping の数を制限します。また、一意の IP で自分自身を制限することもできます
ping -c 5 -b 10.10.0.255 | grep 'bytes from' | awk '{ print $4 }' | sort | uniq