スクリプトでインターフェイスのIPv6アドレスを取得するために使用できるコマンドは何ですか?
更新:回答の1つからのsedの出力。
$ ip -6 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436
inet6 ::1/128 scope Host
valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
inet6 fe80::224:d7ff:fed0:4f5c/64 scope link
valid_lft forever preferred_lft forever
その他:
$ ip addr show dev eth0 | sed -e's/^.*inet6 \([^ ]*\)\/.*$/\1/;t;d'
$ ip addr show dev eth0
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
link/ether f0:de:f1:7b:e9:6c brd ff:ff:ff:ff:ff:ff
あなたが使用することができます:
ip -6 addr
構成したすべてのIPv6アドレスが返されます。
これを行う方法はたくさんあります。
これが1つです:
ip addr show dev eth0 | sed -e's/^.*inet6 \([^ ]*\)\/.*$/\1/;t;d'
これは、アドレスのみを削除することを除いて、Robertの回答に似ています。
Linuxを使用している場合は、次を解析することもできます。/proc/net/if_inet6
最初の列は、コロンのない完全なIPv6です。 6番目の列はインターフェイス名です。
ここでは、かなり長い、最適化されていないバージョン(私は今だけawkの基本です)おそらくpython/Perlがより良い選択です。
for i in "$(grep enp0s25 /proc/net/if_inet6)"; do
echo "$i" | awk '{
split($1, _, "[0-9a-f]{,4}", seps)
joined = sep = ""
for (i=1; i in seps; i++) {
joined = joined sep seps[i]
sep = ":"
}
print joined
}'
done
GNU awk(gawk)がある場合、これは次のように短縮できます。
for i in "$(grep enp0s25 /proc/net/if_inet6)"; do
echo "$i" | gawk '@include "join"
{
split($1, _, "[0-9a-f]{,4}", seps)
print join(seps, 1, length(seps), ":")
}'
done
後で使用するために、{ba、z、} sh関数に入れることができます。
ここで説明する他のアプローチは、IFの名前がeth0
でない場合、失敗します。そして、SystemDの世界では、IF名は予測可能とはほど遠いです IF命名規則が大幅に変更されました
私のアプローチでは、代わりにグローバルユニキャストアドレスを見つけて抽出します-IFの名前が何であれ。 IPv6アドレスはwlan0
-またはその他の名前-に構成でき、bashスニペットはそれを構成ファイル内の変数として正常に抽出および展開し、リスニングアドレスを指定する必要があります。
IPV6GLOBALUNICAST="$(ip -6 addr|awk '{print $2}'|grep -P '^(?!fe80)[[:alnum:]]{4}:.*/64'|cut -d '/' -f1)"
以下を、テスト用に構成されたIPv6アドレスを持つホストのCLIに貼り付けます。
ip -6 addr|awk '{print $2}'|grep -P '^(?!fe80)[[:alnum:]]{4}:.*/64'|cut -d '/' -f1
私はこれを大成功で使用しており、これまでどのような状況でも失敗していません。 HTH-テレンスフーラハン