自宅環境等で今使われているIPをさくっと確認したいときー。\カクニンシタイトキ-/
pingコマンドのパラメータ調整で信頼性が低い、かつpingの並列実行でプロセスガンガン増やすので、間違っても商用環境ではNGです。
みんな大好きxargsの出番です。
完成版は以下。もう少し短くしたかった。
$ echo 192.168.0.{1..254} | xargs -P 100 -n 1 -I@ ping -c 1 -W 1 @ | grep -B 1 -e '1 received' | gawk '/^---/ {print $2}'
192.168.0.1
192.168.0.3
192.168.0.2
192.168.0.5
192.168.0.8
192.168.0.9
192.168.0.10
192.168.0.50
192.168.0.51
192.168.0.175
192.168.0.180
192.168.0.190
192.168.0.200
192.168.0.211
上記のうち、'1 received' を '0 received'に変えれば、反対に未使用のIPアドレスが取得可能。5秒以内にはおわると思います。出力順序は保証されないので、必要あればsortぶちこむなど。
ポイント
echo 192.168.0.{1..254}
- ブレース展開使ってレンジを指定する
tr ' ' '\n'
このままだと1つのパラメータとしてxargsに渡るので、改行に変換- 上記コマンドは不要。後の
xargs -n 1
で引数の最大数を1にするため。
xargs -P 100 -n 1 -I@ ping -c 1 -W 1 @
- xargsの'-P 100'で同時実行プロセス数の最大値を指定する。ここが並列実行の要。
- xargsの'-n 1'により、パイプから受け取ったアドレスを 1つずつ pingコマンドの引数として渡す。複数渡すと挙動が変わっちゃうぜぃ。
- pingの'-c 1'で1つのIPにつき、pingを1回だけうつ。時間短縮。
- pingの'-W 1'でタイムアウト値を1秒にする。時間短縮。
grep -B 1 -e '1 received'
- '1 received'ならホストが生きてる
- grepの'-B 1'で、アドレスの記載がある前行含めて出力
gawk '/^---/ {print $2}'
- アドレスだけとりだす。
2016/03/01 追記
ngyukiさんのふつくしいワンライナー。これからはこっちを使おう(汗
echo 192.168.0.{1..254} | xargs -P 100 -n 1 sh -c 'ping -c 1 -W 1 $1 >/dev/null 2>&1 && echo $1' --
pingの終了コードから、正常終了しているものはechoで出力。このとき、
shコマンドでひとくくりにしてるから、$1を参照すればechoでIPアドレスを表示できちゃう。
こちらの場合で使用されていないアドレスを調べる場合は、 "&&" -> "||"に書き換えてあげればOKです。