Section Next | Prev


012 allip - 同一ネットワークのホスト一覧

概要
同一ネットワークに存在するホスト名の一覧を表示する。 具体的には以下のとおり。
  1. ネットワーク設定を解析しブロードキャストアドレスを得る
  2. ping をブロードキャストアドレスに送信
  3. arp により返事のあった全IPアドレスの一覧をえる
  4. IPアドレスから dig を使ってホスト名を逆引きする
  5. IPアドレスの数値順にソートし表示する

スクリプトと解説 - [text]
#スクリプト解説
1#! /bin/bash #
2# All ip/host name list #
3bcast=`/sbin/ifconfig |sed -e '/Bcast/{s/^.*Bcast://;s/Mask.*$//p}' -n` # ifconfig(8)の結果からブロードキャストアドレスを抽出
4echo "Broadcast address ${bcast}" # ブロードキャストアドレスを表示
5ping -c4 -b $bcast >/dev/null 2>&1 # ブロードキャストへ ping を実行
6/sbin/arp -a 2>/dev/null | # 上記 ping の結果から arp テーブルを表示
7 awk '{ #
8        sub("^.+[(]","");sub("[)].*$",""); # ARPテーブルの括弧()内だけを抽出
9        ip=$0; # 上記結果を IPアドレスとして変数に登録
10        split( ip, ot, "." ); # IPをドットで分離し、配列otに登録
11        printf "%03d.%03d.%03d.%03d:%s\t", # ソート用にオクテットを3桁で表示
12             ot[1],ot[2],ot[3],ot[4],ip; # さらにコロンで区切ってもとのアドレスを表示
12        cmd = sprintf("dig -x ", ip); # 逆引き用コマンドの生成
13        while( cmd | getline ){ # 逆引きの実行
14                if( /^;/ ) { continue; }; # 先頭がセミコロン(コメント)の行は読み飛ばす
15                if( /PTR/) { print $NF; }; # PTR を含む行の最後の要素を表示し、改行
16        } #
17 }' | #
18sort -n | cut -d: -f2- # 数値ソートを行い、コロンで区切った2つ目以降の要素を表示

このスクリプトのポイント

実行例
$ allip
Broadcast address 210.xxx.yy.255
210.xxx.yy.1	gw2.ukis-web.xx.ne.jp.
210.xxx.yy.21	w4.ukis.xx.ne.jp.
210.xxx.yy.22	w5.ukis.xx.ne.jp.
210.xxx.yy.23	w6.ukis.xx.ne.jp.
210.xxx.yy.24	w7.ukis.xx.ne.jp.
210.xxx.yy.27	w9.ukis.xx.ne.jp.
210.xxx.yy.28	w10.ukis.xx.ne.jp.
210.xxx.yy.29	w11.ukis.xx.ne.jp.
210.xxx.yy.30	w12.ukis.xx.ne.jp.
210.xxx.yy.37	site37.uus.xx.ne.jp.
210.xxx.yy.41	site41.uus.xx.ne.jp.
210.xxx.yy.110	mail01.uus.xx.ne.jp.
210.xxx.yy.221	w13.ukis.xx.ne.jp.
210.xxx.yy.224	w16.ukis.xx.ne.jp.
210.xxx.yy.232	lite2.ukis.xx.ne.jp.
補足1 - ifconfig
ifconfig の例と、ブロードキャスト抽出について
$ /sbin/ifconfig
eth0      Link encap:Ethernet  HWaddr 00:B0:D0:AD:49:9C  
          inet addr:172.19.0.117  Bcast:172.19.255.255  Mask:255.255.0.0
          inet6 addr: fe80::2b0:d0ff:fead:499c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:27694 errors:0 dropped:0 overruns:0 frame:0
          TX packets:13791 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:14613860 (13.9 MiB)  TX bytes:2454658 (2.3 MiB)
          Interrupt:11 Base address:0xec80 
				:

# まず Bcast を含む行のみを抽出
$ /sbin/ifconfig | sed -e '/Bcast/{p}' -n
          inet addr:172.19.0.117  Bcast:172.19.255.255  Mask:255.255.0.0

# 続いて先頭から "Bcast:" までと、"Mask." 以降を削除し、
# アドレス部分だけを抽出する。
$ /sbin/ifconfig | sed -e '/Bcast/{s/^.*Bcast://;s/Mask.*$//p}' -n
172.19.255.255
補足2 - arp
ARP テーブルの出力例
$ /sbin/arp -a
w10.ukis.xx.ne.jp (210.xxx.yy.28) at 00:xx:xx:xx:16:98 [ether] on eth0
w15.ukis.xx.ne.jp (210.xxx.yy.223) at 00:xx:xx:xx:CE:68 [ether] on eth0
site37.uus.xx.ne.jp (210.xxx.yy.37) at 00:xx:xx:xx:09:4C [ether] on eth0
		:

Section Next | Prev