LinuxでIPv6 IPアドレスを取得する方法


35

Linuxサーバーがあり、1つのコマンドラインでメインのIPv6アドレスを検索したい。

これまでの私のコマンド:

$ ip addr show dev eth0 | sed -e's/^.*inet6 \([^ ]*\)\/.*$/\1/;t;d'

を示しています:

2001:410:0:39:221:28ff:fe46:eef4
fe80::221:28ff:fe46:eef4

ただし、出力が次のようになるように、発生1つだけにします。

2001:410:0:39:221:28ff:fe46:eef4

シェルスクリプトを記述し、それらのコマンドをそこに配置します。できれば、「単一」コマンドを作成しました。
アキラ

4
IPv6を扱う場合、単一のアドレスに制限することは実際にはお勧めできません。複数のグローバルアドレス、複数のリンクローカルアドレス、複数のサイトローカルアドレスが存在する可能性があります
...-grawity

回答:


31
ip -6 addr

IPv6アドレスが表示されます。


% ip -6 addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 inet6 ::1/128 scope host valid_lft forever preferred_lft forever...まだgreppable
アキラ

1
これは、記載されている質問を解決しません。OPは、単一のコマンドラインで1つのIPv6(おそらくプライマリパブリックIPv6を意味する)を取得することを望んでいます。したがって、いずれかip -6 addr show dev eth0 | sed -n 's|^.*inet6 \([^ ]*/64\).*$|\1|p'またはip -6 addr show dev eth0 | awk '/inet6/{print $2}'ベースとして使用でき、OPは特定のユースケースに合わせて拡張/編集できます。
rwenz3l

6

/sbin/ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '{print $3}' | grep -v ^::1 | grep -v ^fe80

出力は/sbin/ip -6 addr | grep inet6次のようになります。

inet6 ::1/128 scope host 
inet6 2001:123:456:55f::1/64 scope global 
inet6 fe80::62eb:69ff:fed2:d2a6/64 scope link 

awk -F '[ \t]+|/' '{print $3}'区切り文字を設定する各行を1つ以上の空白またはスラッシュに分割します。必要な部分は3ドルです。

grep -v ^::1 | grep -v ^fe80::1またはで始まる行を除外しますfe80


grepをawkにパイピングする方法が多すぎます。これは1つのawkにまとめられる可能性があります `awk -F '[\ t] + | /' '$ 3 ==" :: 1 "{next;} $ 3〜/ ^ fe80 ::/ { 次 ; } / inet6 / {print $ 3} '`
Archemar

3
$ /sbin/ifconfig | grep inet6
      inet6 addr: fe80::2ff:19ff:fe60:1a00/64 Scope:Link
      inet6 addr: fe80::211:22ff:fe33:4455/64 Scope:Link
      inet6 addr: ::1/128 Scope:Host

1つのIPv6アドレスをランダムに選択する場合

$ /sbin/ifconfig | grep inet6 | head -n 1
      inet6 addr: fe80::2ff:19ff:fe60:1a00/64 Scope:Link

最初のイーサネットアダプターの最も一般的な名前のIPv6アドレスが必要な場合

$ /sbin/ifconfig eth0 | grep inet6
      inet6 addr: fe80::2ff:19ff:fe60:1a00/64 Scope:Link

住所だけが必要な場合

$ /sbin/ifconfig eth0 |  awk '/inet6/{print $3}'
fe80::2ff:19ff:fe60:1a00/64

2

LinuxでIPアドレスを表示するには、次のコマンドを使用します。

ifconfig

通常、Ipv6アドレスはのようになり 2001:5c0:9168::/48ます。IPで競合が発生している場合は、以下の手順に従ってIPアドレスを再設定してください。

  1. IPv6 IPを割り当てるには、iproute2ツールがインストールされていることを確認してください。
  2. それらを使用して、IPの割り当てを始めましょう。
  3. ipv6モジュールがインストールされているかどうかを確認してください。

次に、次のコマンドを使用して新しいIPを追加します。

ip -f inet6 addr add 2001:5c0:9168::2/64 dev eth0

その後、デフォルトのIPを追加します

ip -f inet6 ro add default via 2001:5c0:9168::1 dev eth0

インストールが完了したら、Apache、SSHなどのIPv6対応サービスを再構成/再起動するだけです。


ifconfigLinuxでは廃止されているため、使用しないでください。現代のLinuxディストリビューションでは、デフォルトでインストールすることさえありません(一部の古代のパッケージが必要としない限り)。
マイケルハンプトン

1

いくつかの小さな調整で、元の試みはうまくいくでしょう:

ip -o -6 addr show eth0 | sed -e 's/^.*inet6 \([^ ]\+\).*/\1/'

大きな変更点は、-oフラグが追加され、エントリが1行に1つずつ出力されるようになり、sedを実行しやすくなることです。


0

まず、IPv6では、マシンに複数のIPv6アドレスがあり、それらが別々のネットワーク上にあり、到達先に応じてそれらのいずれかが使用される可能性があることを覚えておく必要があります。

そのため、送信元IPアドレスは何かという質問に答える前に、トラフィックの送信先を決定する必要があります。次に、その宛先にトラフィックを送信するときに、どのIPv6アドレスがソースになるかをLinuxに指示するだけです。

「インターネット」に送信する場合は、GoogleのパブリックDNSアドレスなど、グローバルIPv6アドレスをランダムに選択するだけです。

ip r get to 2001:4860:4860::8888 | perl -ne '/src ([\w:]+)/ && print "$1\n"'
2001:db8:f387:c818:5:2:0:1000

これにより、その宛先へのルートがLinuxに要求されます。Perlは検索結果を解析し、src次のフィールドを出力します。

別の宛先を指定すると、異なる送信元アドレスを受け取る場合があります。

ip r get to ::1 | perl -ne '/src ([\w:]+)/ && print "$1\n"'
::1

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.