3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

とあるアドレスレンジで使われているIPの確認をワンライナーで

Last updated at Posted at 2016-02-28

自宅環境等で今使われている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です。

3
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?