GNU/Linux >> Linux の 問題 >  >> Linux

ローカルホストの IP

あなたの質問には根本的な欠陥があります。第 1 に、ホストは複数のアドレス (たとえば、複数のインターフェイス) を持っている可能性があり (おそらくそうなるでしょう)、インターフェイスごとに複数のアドレスを持っていることさえあります。これは、グローバルに接続されたすべてのホストが少なくとも 2 ある IPv6 ではさらに大きな問題です。

次に、シェルからこれを行う「最善の」方法は、システムによって異なります。

Linux:

/sbin/ip addr show eth0 | awk -F"[ /]+" '/inet / {print $3}'

>=Solaris 11:

ipadm show-addr net0/v4 | awk -F"[ /]+" '/ok/ {print $5}'

Mac OS X/ダーウィン:

ipconfig getifaddr en0

最小公倍数を使用して ifconfig を使用しても 出力形式が変わる可能性があるため、一貫性がありません。ただし、例をクリーンアップするには、これを使用します:

ifconfig eth0 | awk -F"[ :]+" '/inet / {print $4}'

シェルの代わりに perl、ruby、java などのより洗練された言語を使用している場合、各言語にはカーネルからこのデータを取得する独自の方法があります。これを見つけるのはあなた次第です。


情報はいつでも変更される可能性があるため、カーネルから取得する必要があり、ファイルに保存することはできません。

この情報を取得するための本当に良い方法はありません。 2行目のハードコーディングが間違っていることを除いて、あなたの解析は他のものと同じくらい優れています.インターフェースが特定の順序でリストされるという保証はありません.マシンが複数のインターフェースを持つことはかなり一般的です。複数のネットワーク カードまたは仮想インターフェースを持つ場合があります。

多くの場合、関心のある IP アドレスは、デフォルト ルートに関連付けられているものです。ほとんどの構成では、route を使用して適切なインターフェースを取得できます。 コマンドを実行し、そのインターフェイスの IP アドレスを ifconfig で抽出します .

/sbin/ifconfig $(/sbin/route -n |
                 awk '$1 == "0.0.0.0" {print $8}') |
awk 'match($0, /inet addr:[.0-9]+/) {print substr($0, RSTART+10, RLENGTH-10)}'

sudo を呼び出す必要がないことに注意してください . ifconfig および route 多くの場合、デフォルトの PATH に含まれていません root 以外のユーザー向けですが、情報を読み取るだけで設定を変更しない限り、特別な権限なしで使用できます。

Linux 以外の UNIX バリアントでは、上記のコマンドを微調整する必要がある場合があります。ほとんどのコマンドは ifconfig と呼ばれます と route 、ただし、出力形式は異なる場合があります。

Linux では、ifconfig の代わりに および routeip を使用できます iproute2 ツール スイートのコマンド。 iproute2 の作成者は ifconfig を考慮していますが、 と route ip を使用するメリットはほとんどありません。 、 ip の出力以来 解析が著しく容易ではなく、 ifconfigroute は常に利用可能ですが、一部の簡素化された Linux インストールでは ip が省略されています .


ここでのすべての回答は技術的には正しいですが、私が「正しい」回答と見なすものではありません。残念ながら、あなたの質問は非常に漠然としているため (Linux のネットワークのしくみがよくわからない場合でも理解できます)、質問の可能な解釈についていくつか回答します。


マシンのプライマリ IP

マシンには、マシンのプライマリ IP と見なされる 1 つの IP があります。ボックスは複数の IP を持つことができ、どの IP が使用されるかはさまざまであるため、これはかなり無意味であることに注意してください (これについては後で説明します)。

プライマリ IP は、単にマシンのホスト名に関連付けられた IP です。この IP は、次を実行することで見つけることができます

getent hosts "$(hostname)" | awk '{ print $1 }'

さて、これが行うことは、/etc/nsswitch.conf に従ってマシンのホスト名の IP を検索することです .ほとんどの場合、/etc/nsswitch.conf ファイルには hosts: files dns が含まれています .これは、何らかのホスト名またはアドレスのルックアップを行おうとすると、/etc/hosts で検索されることを意味します。 最初に、次に DNS を調べます (/etc/resolv.conf によって構成されているように) )。
したがって、コマンド getent hosts "$(hostname)" /etc/hosts から一致するエントリを取得する可能性があります . awk その行から IP だけを取得するだけです。

(getent /etc/nsswitch.conf にリストされている「データベース」を照会するための単純なユーティリティです )


外界との通信に使用される IP

前述したように、マシンのプライマリ IP はほとんど意味がありません。マシンは、通信に複数の IP のいずれかを使用できます。あなたの場合、おそらく 1 つのインターフェースと 1 つの (非 localhost) IP しかありません。ただし、サーバーは複数のインターフェイスまたは IP を持つことができます (1 つのインターフェイスに複数の IP がある場合もあります)。
どの IP が使用されるかは、カーネルのルーティング テーブルによって決定されます。ルーティング テーブルがどのように機能するかについては、単純ではないため、詳細には触れません (複数のルーティング テーブルがあり、どれが使用されるかはテーブルの選択規則によって異なります)。どの IP が使用されるかを見つける方法を説明します。

特定の宛先との通信に使用される IP を確認するには、次のコマンドを使用します:

ip route get 1.2.3.4

(1.2.3.4 を使用) 宛先の IP です)

私のマシンで、これを google.com の IP (74.125.139.102 )、次の結果が得られます:

74.125.139.102 via 192.168.0.1 dev wlan0  src 192.168.0.24 
    cache 

これは、IP 192.168.0.24 が 私のマシンが 74.125.139.102 と通信するたびに使用されます .

IPだけが必要な場合は、追加の grep をスローできます

ip route get 1.2.3.4 | grep -oP '(?<=src )\S+'

grep awk の代わりに使用されます エラーが起こりにくいからです。 IPが同じ場所にない行が変更される可能性がありますが、常に「src」に続くため、「src」の直後の値を取得するだけです


デフォルト ゲートウェイ IP

最後に、デフォルト ゲートウェイがあります。どの IP が使用されるかを確認するために照会する特定の宛先がない場合は、デフォルト ゲートウェイから 1 つを選択できます。インターフェイスが 1 つしかない場合は、これだけで問題ありません。
これは基本的に上記とまったく同じですが、検索先としてデフォルト ゲートウェイを使用するだけです

ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')"

これにより、上記のセクションのような行が得られます。 src value は、デフォルト ゲートウェイを通過するトラフィックに使用される IP です。

前のセクションと同様に、IP だけを取得するには、grep を追加します。 .

ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')" | grep -oP '(?<=src )\S+'

Linux
  1. サーバーをラックに入れたことはありますか?

  2. あるファイルの内容を別のファイルで検索する

  3. lldbinit のプロセス ハンドル

  1. LibraryUnload の失敗

  2. 1 つの CPU を無効にする方法

  3. テールとワイルドカード文字

  1. 私のLinuxシステム管理者サバイバルキット

  2. 1つのSudoで一連のコマンドを実行しますか?

  3. 1つのパーティションのみを同期する方法は?