Linux インスタンスはどのようにして IP アドレスを決定するのでしょうか?
つまり、127.0.0.1 ではありません。
これはファイルに保存されますか、それとも ifconfig は呼び出しごとに何らかの方法で計算しますか?
努力したことを示すためになんとか解決できましたが、本格的なアプリケーションに組み込むようなものではありません。
sudo ifconfig | head -n 2 | tail -n 1 | tr -s " " | tr " " ":" | cut -d":" -f 4
答え1
あなたの質問には根本的な欠陥があります。まず、ホストは複数のアドレス(例えば、複数のインターフェース)を持つ可能性があり(そしておそらくそうなるでしょう)、インターフェースごとに複数のアドレスを持つこともあります。これは、すべてのグローバルに接続されたホストが少なくとも二アドレス。
第二に、シェルからこれを行う「最善の」方法はシステムによって異なります。
リナックス:
/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
情報はいつでも変更される可能性があるため、カーネルから取得する必要があり、ファイルに保存することはできません。
この情報を取得する本当に良い方法はありません。 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
、非ルート ユーザーの場合はroute
デフォルトで設定されていないことが多いですPATH
が、情報を読み取るだけで設定を変更しない限り、特別な権限なしで使用できることに注意してください。
Linux 以外の Unix 系では、上記のコマンドを微調整する必要があるかもしれません。ほとんどの Unix 系には および というコマンドがありますifconfig
がroute
、出力形式が異なる場合があります。
Linuxでは、ifconfig
と の代わりにroute
、ip
iproute2ツール スイート。iproute2 の作者は とを非推奨ifconfig
と見なしていますが、の出力の解析が著しく容易というわけではなく、と は常に使用可能であるのに対し、一部の簡素化された Linux インストールでは が省略されているため、route
を使用する利点は実際にはほとんどありません。ip
ip
ifconfig
route
ip
答え3
ここでの回答はすべて技術的には正しいのですが、私が「正しい」回答と考えるものではありません。残念ながら、あなたの質問は非常に漠然としています (Linux のネットワークの仕組みにあまり詳しくないのであれば、それは理解できます)。そのため、質問の考えられる解釈に対する回答をいくつか示します。
マシンのプライマリIP
マシンには、他のすべての IP よりも上位の 1 つの IP があり、これがマシンのプライマリ IP とみなされます。ただし、ボックスには複数の IP があり、どの IP が使用されるかは異なるため、これはあまり意味がないことに注意してください (これについては後で説明します)。
プライマリIPは、マシンのホスト名に関連付けられたIPです。このIPは、次のコマンドを実行することで見つけることができます。
getent hosts "$(hostname)" | awk '{ print $1 }'
ここで、このコマンドは に従ってマシンのホスト名の IP を検索します/etc/nsswitch.conf
。ほとんどの場合、/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 つの (ローカルホスト以外の) IP しかありません。ただし、サーバーは複数のインターフェイスまたは IP (場合によっては 1 つのインターフェイスに複数の IP) を持つことができます。
どの IP が使用されるかは、カーネルのルーティング テーブルによって決まります。ルーティング テーブルの動作の詳細は説明しません。単純ではないためです (複数のルーティング テーブルがあり、どのテーブルが使用されるかはテーブル選択ルールによって異なります)。どの IP が使用されるかを確認する方法を説明します。
特定の宛先との通信に使用される IP を確認するには、次のコマンドを使用します。
ip route get 1.2.3.4
(1.2.3.4
宛先のIP)
私のマシンで、google.com の IP ( ) の 1 つを使用してこれを行うと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
。
grep
IP だけが必要な場合は、最後に追加するだけです。
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
値は、デフォルト ゲートウェイを通過するトラフィックに使用される 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 レシーバーと同様のネットワーク インターフェースです。
- 結果として、1 台の PC に 1 つの IP があるわけではなく、検討しているインターフェイスと、OS で使用しているインターフェイスの数によってすべて決まります。
おそらく、「カーネル ルーティング テーブル」というトピックに興味があるでしょう。これは、カーネルがネットワーク アクティビティをどのように処理するかを理解する良い方法です。