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

IP アドレスを抽出する Linux bash スクリプト

ip -4 addr show eth0 | grep -oP "(?<=inet ).*(?=/)"

IP アドレスを取得するには:

echo `ifconfig eth0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'`

これにより、eth0 の IP アドレスが得られます。

編集:Ubuntu の最近のバージョンではインターフェイスの名前が変更されたため、これは機能しなくなりました。代わりに、これを使用できます:

hostname --all-ip-addresses または hostname -I 、同じことを行います (ホストのすべての IP アドレスを提供します)。


目的が IP アドレスを見つけることである場合 インターネットの方向に接続されている場合、これは適切なソリューションです。

編集 2021:「sed」および「grep」バージョンと新しい「awk」バージョンを追加 (一部は gnu)

インターネットに接続されている IP adder を見つけるには、ip route を使用できます。 指図。 Linux の新しいバージョンでは、次のような典型的な出力でより多くの情報を得ることができます:

ip route get 8.8.8.8
8.8.8.8 via 10.36.15.1 dev ens160 src 10.36.15.150 uid 1002
    cache

IP を取得するには src の後に IP を見つける必要があります 、awk を使用 、セド または grep

ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}'
ip route get 8.8.8.8 | awk 'match($0,/src (\S*)/,a)&&$0=a[1]'
ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/src/)$0=$(i+1)}NR==1'

ip route get 8.8.8.8 | sed -E 's/.*src (\S+) .*/\1/;t;d'
ip route get 8.8.8.8 | sed 's/.*src \([^ ]*\).*/\1/;t;d'
ip route get 8.8.8.8 | sed  -nE '1{s/.*?src (\S+) .*/\1/;p}'

ip route get 8.8.8.8 | grep -oP 'src \K[^ ]+'
10.36.15.150

インターフェースが気に入ったら awk を使用した名前 、セド または grep

ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}'
ip route get 8.8.8.8 | awk 'match($0,/dev (\S*)/,a)&&$0=a[1]'
ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)$0=$(i+1)}NR==1'

ip route get 8.8.8.8 | sed -E 's/.*?dev (\S+) .*/\1/;t;d'
ip route get 8.8.8.8 | sed 's/.*dev \([^ ]*\).*/\1/;t;d'
ip route get 8.8.8.8 | sed  -nE '1{s/.*?dev (\S+) .*/\1/;p}'

ip route get 8.8.8.8 | grep -oP 'dev \K[^ ]+'
ens192

ip route 8.8.8.8 に到達するために必要なルートを表示するだけです。 . 8.8.8.8 は Google の DNS です。

これを変数に保存したい場合は、次のようにします:

my_ip=$(ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}')

my_interface=$(ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}')

他のソリューションが失敗する理由:

ifconfig eth0

  • お使いのインターフェースに別の名前がある場合 (eno1、wifi、venet0 など)
  • インターフェースが複数ある場合
  • IP 接続方向が、複数の IF のリストの最初ではない

Hostname -I

  • 127.0.1.1 のみ取得可能
  • すべてのシステムで機能するわけではありません。
  • インターネットに接続されている IP だけでなく、すべての IP を提供します。 -I, --all-ip-addresses ホストのすべてのアドレス

IP のスペース区切りのリストを取得する場合は、hostname を使用できます --all-ip-addresses を使用したコマンド (短い -I ) フラグ

hostname -I

ここで説明されているように:IPアドレスをbash変数に入れる.もっと良い方法はありますか?


Linux
  1. Bashスクリプトをデバッグする方法は?

  2. Bash スクリプト:不適切なインタープリター

  3. Linux bashでphpスクリプト(php関数)を実行する

  1. LinuxBashシェルスクリプトで暗号化されたパスワードを使用する方法

  2. LinuxでのBash履歴の解析

  3. Bash スクリプトのパターン マッチング

  1. bashスクリプトでLinuxシステムのパスワードを変更する

  2. LinuxのbashコマンドをPERLスクリプトで実行する方法は?

  3. Bashスクリプトでホスト名をIPアドレスに解決する方法は?