8128
同じネットワークにつながっているそれぞれIPアドレスを調べるにはどうすればいいでしょうか。

条件

```

    機器１ AB:CD:EF:12:34:01
    機器２ AB:CD:EF:12:34:02 
    機器３ AB:CD:EF:12:34:03
    機器４ MACアドレス不明
    
```

全て、同一のローカルネットワークに接続しています。

試している案は下記の通りです。

同じNW上の全てのIPに対してpingをしたうえで、ARPテーブルを取得し、  
MACアドレスと照合する。

```

    #!/bin/bash -v
    for ((i = 100 ; i <= 254 ; i++)); do ping -c 1 -t 1 10.242.15.${i}; done
    arp -a
    ???
    ???
    
```

結果は下記のように取得できましたが、時間がかかりすぎます。  
もう少し効率的な方法があればご教示ください。

```

    ? (10.242.16.42) at AB:CD:EF:12:34:01 on en5 ifscope [ethernet]
    ? (10.242.16.50) at AB:CD:EF:12:34:04 on en5 ifscope [ethernet]
    ? (10.242.16.146) at AB:CD:EF:12:34:03 on en5 ifscope [ethernet]
    ? (10.242.18.78) at AB:CD:EF:12:34:02 on en5 ifscope [ethernet]
    
```

また、機器ごとのMACアドレスから、それぞれの機器のIPアドレスを変数で呼べるようにしたいのですが、どうするのがよいでしょうか。  
（機器１のIPアドレスを、シェル変数 EQ_IPADDR1とした場合）
CC BY-SA 3.0
2015-03-19T09:28:48.207
8122
2015-03-20T01:55:01.590
2015-03-20T01:55:01.590
7590
7590
question
macos bash
同じネットワークにつながっている端末のそれぞれIPアドレスを調べるには
`arp-scan`というツールを入手し試してみてください。

```

    $ arp-scan --interface=eth0 192.168.0.0/24
    Interface: eth0, datalink type: EN10MB (Ethernet)
    Starting arp-scan 1.4 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
    192.168.0.1     00:c0:9f:09:b8:db       QUANTA COMPUTER, INC.
    192.168.0.3     00:02:b3:bb:66:98       Intel Corporation
    192.168.0.5     00:02:a5:90:c3:e6       Compaq Computer Corporation
    192.168.0.6     00:c0:9f:0b:91:d1       QUANTA COMPUTER, INC.
    192.168.0.12    00:02:b3:46:0d:4c       Intel Corporation
    192.168.0.13    00:02:a5:de:c2:17       Compaq Computer Corporation
    192.168.0.87    00:0b:db:b2:fa:60       Dell ESG PCBA Test
    192.168.0.90    00:02:b3:06:d7:9b       Intel Corporation
    192.168.0.105   00:13:72:09:ad:76       Dell Inc.
    192.168.0.153   00:10:db:26:4d:52       Juniper Networks, Inc.
    192.168.0.191   00:01:e6:57:8b:68       Hewlett-Packard Company
    192.168.0.251   00:04:27:6a:5d:a1       Cisco Systems, Inc.
    192.168.0.196   00:30:c1:5e:58:7d       HEWLETT-PACKARD
    13 packets received by filter, 0 packets dropped by kernel
    Ending arp-scan: 256 hosts scanned in 3.386 seconds (75.61 hosts/sec).  13
    responded
    
```
CC BY-SA 3.0
2015-03-19T10:27:04.077
8128
2015-03-19T10:27:04.077
2238
8122
answer
ブロードキャストアドレス宛に ping を打つという手があります。ただし、ブロードキャスト宛の ping に応答しない端末もあります。また、通常は root
権限が必要です。Linux の `ping` では `-b` オプションが必要なことが多いです。

```

    # ping -b 10.242.15.255
    
```

`ping` をバックグラウンドでガンガン起動して、すべての `ping` が終了するのを待ってから `arp -a` で確認するという手も考えられます。

```

    #!/bin/bash
    for ((i = 100 ; i <= 254 ; i++)); do ping -c 1 -t 1 10.242.15.${i} & done
    wait
    arp -a
    
```

シェル変数 `EQ_IPADDR?` にセットしたいなら次のような感じでしょうか。  
MAC アドレスの最後の数だけで変数名を決めたいなら `sed` のスクリプトを適宜調整してください。

```

    #!/bin/bash
    for ((i = 100 ; i <= 254 ; i++)); do
      ping -c 1 -t 1 10.242.15.${i} >/dev/null 2>&1 &
    done
    wait
    
    while read n ip; do
      eval "EQ_IPADDR$n"='"$ip"'
    done < <(arp -an |sed -n 's/://g;s/^.*(\(.*\)) at \([0-9a-f]*\).*/\2 \1/p')
    set |grep EQ_IPADDR
    
```
CC BY-SA 3.0
2015-03-19T12:57:46.200
8137
2015-03-19T13:49:59.327
2015-03-19T13:49:59.327
3061
3061
8122
answer
アプリケーションを自由に導入できるのであれば、他の回答にあるようなツールを始め同種のツールが多数あるのでそちらを使ってください。

ツールを導入せずに実現しなければならないのであれば、少々乱暴ですが

```

    for ((i = 100 ; i <= 254 ; i++)); do ping -c 1 -t 1 10.242.15.${i} &; done
    
```

でpingをバックグラウンドで実行するか、シェルスクリプトで完結しなくて良いなら、pingの代わりにこんなperlスクリプトでパケットを送りつけるのが手っ取り早いでしょうか。

```

    #!/usr/bin/env perl
    use Socket;
    
    my $port = 7000;
    socket(SOCKET, PF_INET, SOCK_DGRAM, 0);
    foreach my $i( 1 .. 254)
    {
        my $addr = inet_aton("172.16.1.$i");
        my $sock_addr = pack_sockaddr_in($port, $addr); 
        send(SOCKET, "0", 0, $sock_addr);
    }
    
```

2番目の質問ですが、`EQ_IPADDRn`の`n`が何に対応するのかよく分かりません。シェルスクリプトでちょっとでも複雑なことをやろうとするととたんに黒魔術的なことになるので、シェルスクリプトを極めたいのでもないかぎり、他の言語を使われる事をお勧めします。perlならたいていの環境には標準で入ってるでしょう。
CC BY-SA 3.0
2015-03-19T13:23:42.933
8141
2015-03-19T23:54:43.927
2015-03-19T23:54:43.927
5793
5793
8122
answer