Ubuntu 20.04を使用します。私は 物理イーサネットインターフェースの名前のみを取得する方法は? で学習しました。これは、物理ネットワークインターフェースのみを表示するために、
ls -l /sys/class/net/ | grep -v virtual
ip address show type XXX
を使用して同じ情報を取得しようとしましたが(失敗しました)。 ip address help
によると、可能なタイプは次のとおりです。
TYPE := { vlan | veth | vcan | vxcan | dummy | ifb | macvlan | macvtap |
bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan | lowpan |
gre | gretap | erspan | ip6gre | ip6gretap | ip6erspan | vti |
nlmon | can | bond_slave | ipvlan | geneve | bridge_slave |
hsr | macsec | netdevsim }
Q1。 ip address
を使用して物理インターフェースのみを表示することは可能ですか?たとえば、マシンのローカルIPアドレスを表示するには、.
Q2。たぶん、物理インターフェースに対応するタイプがないのには十分な理由があります。根拠は何ですか?
この情報が_ip address
_の出力で(常にではないが)利用できる場合でも、インターフェイスの種類はlinkプロパティではなくaddressプロパティです。したがって、OPの質問のtitleに答えるために使用するコマンドは_ip link show
_...になります。
...しかし、ハードウェアインターフェイスにはタイプが関連付けられていません。 追加のプロパティであり、実際のインターフェースがないため、仮想インターフェースのみがこれを取得します(これはQ2に回答しますが、最後の注を参照してください)。したがって、物理的なタイプを表示できるタイプはありません。また、フィルターオプションで使用できる否定もないため(否定するための式anyタイプを表示する式も)、コマンド構文で使用できるフィルターはありません。表示するにはonlyそのようなインターフェース。
これらのインターフェースを見つけるには、それらをすべて表示し、タイプのないインターフェースを外部フィルターで除外する必要があります。したがって、_ip link
_コマンドだけでは実行できないことは、適切なツールを使用して出力をフィルタリングすることで実行できます。 jq
_ip -details -json link
_のJSONを使用して信頼できる解析のための出力。これがあります jq
documentation 使用方法を学ぶために、manページはその内容に基づいています。
インターフェースの完全なリストから、これを実行する必要があります。
これは次のように変換されます。
_ip -details -json link show | jq -r '
.[] |
if .linkinfo.info_kind // .link_type == "loopback" then
empty
else
.ifname
end
'
_
たとえば、現在合計12のインターフェースを備えたこのシステムでは、上記のコマンドで表示されるのは、そのうちの2つ、実際の2つだけです。
_eth0
wlan0
_
このjqフィルターを改善してください。
この場合、質問Q1に対処するために、_ip ... link
_を_ip ... address
_で置き換えると同じ出力が得られます。ただし、インターフェースに加えてアドレスを表示するには、もちろんフィルターを変更する必要があります(また、改行のカスタム処理を可能にするのに十分な最近のjq
コマンドが必要です)。
_ip -details -json address show | jq --join-output '
.[] |
if .linkinfo.info_kind // .link_type == "loopback" then
empty
else
.ifname ,
( ."addr_info"[] |
if .family == "inet" or .family == "inet6" then
" " + .local
else
empty
end
),
"\n"
end
'
_
JSON出力全体を直接確認する場合は、_ip -details -pretty -json address
_または_ip -d -j address | jq .
_を試してください。 _-json
_オプションは、いくつかのiproute2コマンドで使用できますが、すべてではありません。 _ip ...
_コマンドの追加はごく最近です( 2017年半ば )。
注:実際にtype
キーワードは、JSONで使用すると複数の異なるタイプのプロパティに変換できます。_.linkinfo.info_kind
_は、前述のように実際のインターフェースのタイプですが、_.linkinfo.info_slave_kind
_もあります。マスターとしてブリッジまたはボンドを持つインターフェース(実際のインターフェースを含む)(それぞれ_bridge_slave
_および_bond_slave
_)。このプロパティをチェックしないため、JSONの結果は変更されません。
とにかく、そのようなインターフェイスにはIPアドレスを設定しないでください。アドレスはマスターに設定する必要があります。これは仮想であるにもかかわらず、周囲の物理環境と対話するときに重要なインターフェイスになるはずです。