インターフェイスに接続されたIPアドレスをシェル変数に設定するスクリプト


3

「eth0」などのインターフェイスに接続されているデバイスのIPアドレスを変数に設定するスクリプトを作成したいと思います。次のコマンドでIPアドレスを取得できます。

arp -i eth0 -a

上記のコマンドの出力は次のとおりです。

? (10.42.0.38) at b8:27:eb:07:5d:60 [ether] on eth0

.bashrc上記のコマンドの出力からIPアドレスを変数に設定$RASPBERRY_IPし、他のスクリプトで使用するために、スクリプトをファイルに追加します。それを行う方法はありますか?


IP自体はawkで抽出するのに十分簡単です。なぜ中間スクリプトが必要なのですか?2番目のスクリプトに直接ipを取得しないのはなぜですか?
セルギーKolodyazhnyy

@Serg 2番目のスクリプトに直接IPアドレスを取得するのに問題はありません。問題は、私があなたが言ったシェルスクリプトとawkコマンドの初心者であることです。arpコマンドの出力からipを抽出し、スクリプトで使用するスクリプトが必要です。Tnx。
Mehrdad

回答:


5

arpカーネルARPキャッシュのエントリを操作すると、おそらく多くのエントリを取得することになります(LANのサイズによって異なります)。IPアドレスにのみ関心がある-nため、arp最初にホスト名の代わりに数値アドレスを表示するオプションを使用する必要があります。

また、通常、LANのサイズに応じて多くのIPアドレスを取得するため、おそらくIPアドレスを格納するために変数ではなく配列を使用する必要があります。

次のコマンドは、arpキャッシュからIPアドレスを取り出して配列に入れますaddrs

addrs=( $(arp -ni eth0 | grep -o '^[0-9][^ ]*') )

以下に例を示します。

$ addrs=( $(arp -ni eth0 | grep -o '^[0-9][^ ]*') )

$ echo "${addrs[0]}"  ## First IP
192.168.2.27

$ echo "${addrs[2]}"  ## Second IP
192.168.1.1

$ echo "${#addrs[@]}"  ## Number of IP addresses
37

あなたも使用sedできます:

addrs=( $(arp -ni eth0 | sed -nr 's/^([0-9][^ ]*).*/\1/p') )

IPアドレスは最初の列に表示され[0-9][^ ]*ます。最初の列をで抽出しています。^[0-9]ここでは、ヘッダーで始まる最初の行が出力から破棄されるように、行が数値で始まるようにします。


別の注意として、エントリが1つしかない場合は、代わりに変数に保存できます。

addr="$(arp -ni eth0 | grep -o '^[0-9][^ ]*')"

または

addr="$(arp -ni eth0 | sed -nr 's/^([0-9][^ ]*).*/\1/p')"

十分、賛成;)
AB


3

ここに使用する別のアイデアがあります awk

arp -ni eth0 | awk 'NR>1 {print $1}'

$ arp -ni eth0 | awk 'NR>1 {print $1}'
192.168.20.3
192.168.20.1
192.168.20.11

または変数付き

$ addresses=$(arp -ni eth0 | awk 'NR>1 {print $1}')
$ echo $addresses
192.168.20.3 192.168.20.1 192.168.20.11

配列なしで特定のインデックスを取得するには

$ arp -ni eth0 | awk -v idx=3 'NR>1 && NR==idx+1 {print $1}'
192.168.20.11

の最大値を取得するには idx

arp -ni eth0 | awk 'NR>1 {idx_max++} END {print idx_max}'

$ idx_max=$(arp -ni eth0 | awk 'NR>1 {idx_max++} END {print idx_max}')
$ echo $idx_max
3

ここに行く.. :)
heemayl

1
:D @heemayl:あなたとABは競争する子供のようです!まだネクタイ!
ファビー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.