12

さまざまなUbuntuLinuxマシンで実行されるbashスクリプトがあります。その仕事は、ローカルホストのLANIPv4アドレスを見つけることです。

スクリプトは使用しています

ip addr show eth0 | sed -n '/inet /{s/^.*inet \([0-9.]\+\).*$/\1/;p}'

これは問題ありませんが、一部のマシンでは、何らかの理由でeth0ではなくeth1を使用しています。LAN iface名を見つけられるようにしたいので、ここでeth0の代わりに使用できます。

もちろん、同じことをする別のワンライナーを思い付くことができれば、すべて良いです。

4

7 に答える 7

15

これが役立つかどうかはわかりませんがip route get、リモートホストへの接続に使用するインターフェイスが表示されるようです。

ubuntu@ip-10-40-24-21:/nail/srv/elasticsearch$ ip route get 8.8.8.8
8.8.8.8 via <gateway address> dev eth0  src <eth0 IP Address>

もちろん、シェルスクリプトで次のように自動化することもできます。

ip route get 8.8.8.8 | awk '{ print $NF; exit }'
于 2013-05-09T18:59:32.077 に答える
15

メインNICには通常デフォルトルートがあります。それで:

ip -o -4 route show to default

NIC:

ip -o -4 route show to default | awk '{print $5}'

ゲートウェイ:

ip -o -4 route show to default | awk '{print $3}'

ifconfigとは異なり、ipには一貫性のある解析可能な出力があります。Linuxでのみ機能します。他のUnixでは動作しません。

于 2015-05-12T20:46:50.783 に答える
4

ごく最近、systemd / udevは、すべてのローカルイーサネット、WLAN、およびWWANインターフェイスのインターフェイス名を、私たち全員が慣れ親しんでいるものに自動的に割り当て始めました。これは、従来のインターフェイス命名スキーム( "eth0"、 "eth1"、 "wlan0"、...)からの逸脱です。これで、以前使用していたローカルインターフェイス名を使用する前に、まずローカルインターフェイス名を確認する必要があります。 「eth0」が正しい名前であるというかなり正確な推測でした。あなたが求めているのはネットワーク名です..これが問題を解決するための小さなスクリプトです

  1. 「iprouteget8.8.8.8」を使用して、インターネットへのルートがある(または現在使用されている)アクティブインターフェイスを特定します。出力は次のようになります。

    10.10.1.1経由の8.8.4.4devenp0s3 src 10.10.1.118 cache

  2. awkを使用して、インターフェイス名の5番目のテキストブロックを印刷します

    ]#ip route get 8.8.8.8 | awk-'{print $ 5}'出力:enp0s3

  3. awkを使用して、インターフェイスアドレスの7番目のテキストブロックを印刷します

    ]#ip route get 8.8.8.8 | awk-'{print $ 7}'出力:10.10.1.118

于 2014-12-01T05:25:45.013 に答える
3

inet文字列を検索してbrd(放送用)はどうですか?それはあなたに与えるでしょう:

ip addr show|egrep '^ *inet'|grep brd|awk -- '{ print $2; }'|sed -e 's:/[0-9]*$::'

必要以上に多くのコマンドを使用していることに注意してください。おそらく、より複雑な正規表現で同じことを達成できますがsed、どのステップで結果に到達するかを明確にするコマンドが好きです。

単一のコマンドで実行したい場合は、次のことを試してみることをお勧めしawkます。

ip addr show|awk -- '$1 == "inet" && $3 == "brd"  { split($2,a,"/"); print a[1]; }'

これはバージョンよりもそれほど長くはありませんsedが、より読みやすくなっています。

+1もう少し読みやすく:

ip addr show | awk '$1 == "inet" && $3 == "brd" { sub (/\/.*/,""); print $2 }'
于 2012-09-18T09:58:08.933 に答える
3

信じられないかもしれませんが、この情報を取得するための標準的で簡単な方法はありません。現在のIPおよびインターフェイス名コマンドを教えてくれる標準はありません。によって返される情報の標準形式すらありませんifconfig

純粋なシェルを使用せずに、Pythonのようなスクリプト言語を使用することをお勧めします。

import socket
socket.gethostbyname(socket.gethostname())

通常、ファイルにはループバックアドレス/etc/hostを指すエントリがあるため、ほとんどのLinuxシステムでは機能しません。Perlにも同じ問題があります。127.0.0.1

関係するスクリプトをしっかりと把握していて、問題を確認しました。私がお勧めできる唯一のことは、それを実行しようとしている各マシンでこれをテストし、何が飛び出すかを確認することです。ネットワークのセットアップ方法や各場所でのインターフェイスの命名方法により、すべてのオペレーティングシステムで動作する、または同じオペレーティングシステム上の異なるシステムで動作する汎用の1つのライナーはありません。

于 2013-01-06T20:34:17.717 に答える
1

これを行うためのより簡単な方法があるかどうかを知りたいのですが、これが私の回避策です。LANサブネットを知っているので、...

ip addr show | grep "inet 10.67.5." \
    | sed -n '/inet /{s/^.*inet \([0-9.]\+\).*$/\1/;p}'
于 2012-09-18T09:35:06.303 に答える
1

1)これはインターフェイス名のみを出力します(今後のPPPリンクと今後のPPPリンクを渡すために必要でした):

for i in $( ifconfig | grep 'ppp' | awk '{print $1}' );
do

printf "$i "; ## Or echo

done

結果:

ppp0 ppp1 ppp2

2)これはインターフェース名とIPを出力します

declare -a IPADDR

index=0

for i in $( ifconfig | grep 'inet addr' | awk '{print $2}'| sed 's#addr:##g' );
do
        IPADDR[$index]=$i
        let "index += 1"
done

index=0

for i in $( ifconfig | grep 'ppp' | awk '{print $1}' );
do
        echo $i 
        let "index += 1"
done

結果:

ppp0 addr:IP

ppp1 addr:IP

ppp2 addr:IP

于 2013-01-06T18:09:06.753 に答える