web-dev-qa-db-ja.com

「ip address show type」を使用して物理ネットワークインターフェイスを表示する

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。たぶん、物理インターフェースに対応するタイプがないのには十分な理由があります。根拠は何ですか?

1
Polymerase

この情報が_ip address_の出力で(常にではないが)利用できる場合でも、インターフェイスの種類はlinkプロパティではなくaddressプロパティです。したがって、OPの質問のtitleに答えるために使用するコマンドは_ip link show_...になります。

...しかし、ハードウェアインターフェイスにはタイプが関連付けられていません。 追加のプロパティであり、実際のインターフェースがないため、仮想インターフェースのみがこれを取得します(これはQ2に回答しますが、最後の注を参照してください)。したがって、物理的なタイプを表示できるタイプはありません。また、フィルターオプションで使用できる否定もないため(否定するための式anyタイプを表示する式も)、コマンド構文で使用できるフィルターはありません。表示するにはonlyそのようなインターフェース。

これらのインターフェースを見つけるには、それらをすべて表示し、タイプのないインターフェースを外部フィルターで除外する必要があります。したがって、_ip link_コマンドだけでは実行できないことは、適切なツールを使用して出力をフィルタリングすることで実行できます。 jq _ip -details -json link_のJSONを使用して信頼できる解析の​​ための出力。これがあります jq documentation 使用方法を学ぶために、manページはその内容に基づいています。

インターフェースの完全なリストから、これを実行する必要があります。

  • 見つかったすべてのタイプを除外します(JSON出力ではlinkinfoinfo_kindプロパティです。これはヘルプのすべてのタイプにすることができます(vlanveth、...)、link_typeと混同しないでください。これは、たとえばloopbacketherのようになります。 、なし ...)。
  • ループバックを除外link_type

これは次のように変換されます。

_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アドレスを設定しないでください。アドレスはマスターに設定する必要があります。これは仮想であるにもかかわらず、周囲の物理環境と対話するときに重要なインターフェイスになるはずです。

2
A.B