Etherwakeを使用してローカルネットワーク上のマシンを起動するシェルスクリプトがあります。マシンが起動した後、IPアドレスがわかりません。
私自身の質問に答えようとしている間に、私は思いついた:
ip=$(ping -c 1 hostname | head -1 | awk '{print $3}' | sed 's/[()]//g')
このソリューションでは、リモートマシンのホスト名を知っていることを規定していますが、これはそれほど面倒ではありません。
MACアドレスしかわからない場合にIPを取得する方法はありますか?
これを行うための単一のコマンドがあるとは思わない。 1つのハックは、サブネットでpingスキャンまたはブロードキャストpingを実行し、次にMACアドレスのIPアドレスについてarpテーブルを照会することです。明らかに理想的なソリューションではありません。例:
nmap -sP 192.168.1.0/24 >/dev/null && arp -an | grep <mac address here> | awk '{print $2}' | sed 's/[()]//g'
ここで、nmapはpingスキャンを実行し、arpキャッシュに入力します。スキャンが完了したら、arpコマンドを使用してarpテーブルを印刷し、grep/awkでIPアドレスを引き出します。 nmapをブロードキャストpingに置き換えることもできますが、おそらく信頼性は高くありません。
私は単に使用します
ip neighbor | grep "00:1E:C9:56:3C:8E" | cut -d" " -f1
ここに示されている他の方法は信頼性がありませんでした。 ip neighbor
の出力には常に最新の状態が含まれていなかったため、arp-scan
を使用してネットワークを再スキャンしたため、スキャンの出力を使用してIPアドレスを取得しました。指定されたMACアドレス。
単一のネットワークインターフェイスをスキャンするには、次を使用します。
arp-scan -q -l --interface en4 2>/dev/null | grep "00:1E:C9:56:3C:8E" | cut -d$'\t' -f1
次のコマンドは、複数のネットワークインターフェイスを一度にスキャンします。
{ arp-scan -q -l --interface en0 2>/dev/null & arp-scan -q -l --interface en4 2>/dev/null } | grep "00:1E:C9:56:3C:8E" | cut -d$'\t' -f1
MACアドレスでarpコマンドとgrepを試すことができます
arp -a | grep "00:00:00:00:00:00"
(独自のMACアドレスに置き換えてください)
これを行うことができるpythonモジュールを作成しました:
>>> from ethip import ethip
>>> print ethip.getip('00:1E:C9:56:3C:8E', '10.5.42.255')
10.5.42.3
IPを見つけるために迅速なarpリクエストを行い、見つかったものをキャッシュします。コードはgithubにあります。
ニール 回答には実際に時間がかかりすぎます。私は60k +のIP範囲で動作する必要がありました。これを機能させるコツは、pingのたびにarpテーブルをチェックすることです。これにより、根本的な問題も修正されます。不要です。私はそれをJava(ここでは threadedScan() を参照)で実行しました。起動コマンドを使用すると、fixedThreadPoolを使用すると高速に動作します(60kの範囲で約10秒)。