LinuxインスタンスはIPアドレスをどのように決定しますか?
つまり、127.0.0.1ではありません。
これはファイルに保存されていますか?それとも呼び出されるたびにifconfigは何とか計算されますか?
私は努力したことを示すためにこの問題を解決しましたが、真剣に適用するものではありません。
sudo ifconfig | head -n 2 | tail -n 1 | tr -s " " | tr " " ":" | cut -d":" -f 4
答え1
あなたの質問には根本的な欠陥があります。まず、ホストが複数のアドレス(複数のインターフェイスなど)を持つことも、インターフェイスごとに複数のアドレスを持つこともできます。これは、世界中で接続されているすべてのホストが少なくとも二つ住所
第二に、シェルでこれを行うための「最も良い」方法はシステムによって異なります。
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}'
Shellの代わりにPerl、Ruby、Javaなどの高度な言語を使用している場合、各言語にはカーネルからこのデータをインポートする独自の方法があります。調べるのは皆さんにお任せします。
答え2
この情報はいつでも変更される可能性があるため、カーネルから検索する必要があり、ファイルに保存することはできません。
この情報を得るための良い方法はありません。あなたの解析は何よりも優れています。 2行目のハードコーディングが間違っているということです。インターフェイスが特定の順序でリストされるという保証はありません。マシンに複数のインターフェイスがあるのは非常に一般的です。複数のネットワークカードまたは仮想インターフェイスがある場合があります。
通常、関心のあるIPアドレスは、デフォルトルートに関連付けられている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
通常はroot以外のユーザーのデフォルトではroute
ありませんが、PATH
情報を読み取って設定を変更しない限り、特別な権限なしで使用できます。
Linux以外のUNIXバリアントでは、上記のコマンドを調整する必要があるかもしれません。ほとんどのifconfig
コマンドには名前がありますが、route
出力形式は異なる場合があります。
Linuxでは、代わりに次のコマンドを使用できますifconfig
。route
ip
IP ルート 2ツールキット。 iproute2の作成者はiproute2を考慮し、ifconfig
使用しなくなりますが、出力を解析するのははるかに簡単ではなく常に使用できますが、一部の単純なLinuxインストールではこれを省略するため、実際route
に使用する利点はありません。ip
ip
ifconfig
route
ip
答え3
ここにあるすべての回答は技術的に正確ですが、「正しい」回答と見なされるわけではありません。残念ながら、あなたの質問は非常にあいまいです。 (Linuxでネットワーキングがどのように機能するのかよくわからない場合は理解できます。)問題の可能な説明にいくつかの回答を提供します。
マシンの基本IP
マシンには他のすべてのIPよりも上位にあるIPがあり、そのIPはマシンのプライマリIPと見なされます。ボックスには複数のIPがあり、どのIPが使用されているかが異なるため、これは意味がありません(後でこれについて詳しく説明します)。
デフォルトIPは、単にコンピュータのホスト名に関連付けられたIPです。次のコマンドを実行してIPを見つけることができます。
getent hosts "$(hostname)" | awk '{ print $1 }'
今やっていることは、ホスト名に基づいてマシンのIPを見つけることです/etc/nsswitch.conf
。ほとんどの場合、このファイル/etc/nsswitch.conf
にはhosts: files dns
。したがって、コマンドは一致する項目を取得できます。その行からIPを取得するだけです。/etc/hosts
/etc/resolv.conf
getent hosts "$(hostname)"
/etc/hosts
awk
(getent
その中にリストされている「データベース」を照会するための簡単なユーティリティ/etc/nsswitch.conf
)
外部世界との通信に使用されるIP
前述したように、そのマシンのデフォルトIPは意味がありません。マシンは複数のIPのいずれかを使用して通信できます。あなたの場合、おそらく1つのインターフェースと1つの(ローカルホストではなく)IPしかありません。ただし、サーバーには複数のインターフェイスまたはIPがあります(時には単一のインターフェイスに複数の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
これが私に知らせるのは、192.168.0.24
私のコンピュータが通信するたびにこのIPが使用されることです74.125.139.102
。
IPだけを希望する場合は、grep
最後に追加のIPを追加できます。
ip route get 1.2.3.4 | grep -oP '(?<=src )\S+'
grep
awk
エラーが発生する可能性が低いため、anの代わりに使用してください。この行は、IPが同じ場所にない場合に変更される可能性がありますが、常に「src」の後にあるため、「src」の直後に値を取得します。
デフォルトゲートウェイIP
最後に、デフォルトゲートウェイがあります。どのIPが使用されるかを照会する特定の宛先がない場合は、デフォルトゲートウェイから1つを選択できます。インターフェイスが1つだけであれば、とにかくこれが最も重要です。
これはデフォルトで上記と同じですが、デフォルトゲートウェイをルックアップターゲットとして使用します。
ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')"
これにより、前のセクションと同様の行が表示されます。このsrc
値は、デフォルトゲートウェイを通過するトラフィックに使用されるIPです。
前のセクションと同様に、IPだけを取得するにはgrep
。
ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')" | grep -oP '(?<=src )\S+'
答え4
あなたの要求は明確ではありません。 「localhost」という用語は、ループバックインタフェースを指すためによく使用され、127.0.0.1が最も一般的で正解です。
あなたが見逃しているものは次のとおりです。
- 実際、各インターフェイスは異なるIPを持つことができ、ループバックインターフェイスはイーサネットカードやワイヤレスUSBレシーバと同様にネットワークインターフェイスです。
- したがって、PCには1つのIPがなく、すべては考慮しているインターフェイスとオペレーティングシステムで使用されるインターフェイスの数によって異なります。
カーネルがネットワークアクティビティを処理する方法を理解するのに最適な方法である「カーネルルーティングテーブル」のトピックに興味があるかもしれません。