web-dev-qa-db-ja.com

ifconfigを使用してアクティブなインターフェースのみを表示する方法

デフォルトでは、ifconfigは使用可能なすべてのインターフェースを表示しますが、activeのインターフェースのみを表示したい場合はどうなりますか?お気に入り、 en0以下のみ。

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 14:10:9f:e0:eb:c9 
    inet6 fe80::1610:9fff:fee0:ebc9%en0 prefixlen 64 scopeid 0x4 
    inet X.X.X.X netmask 0xffffff00 broadcast 101.6.69.255
    nd6 options=1<PERFORMNUD>
    media: autoselect
    **status: active**
en3: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether 32:00:14:e7:4f:80 
    media: autoselect <full-duplex>
    **status: inactive**

注意ifconfig en0は満足しません、en0は常にアクティブなものではありません;)

Mac OS Xを実行しています。

24
qweruiop

すべてのアクティブなサービスの完全な説明を取得するには、次を試してください。

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active'

この単純な正規表現は、アクティブなインターフェースとそのすべての情報のみを除外する必要があります。 〜/ .profileまたは〜/ .bash_profileファイルにこのエイリアスを追加することをお勧めします(多分アクティブですか?)

インターフェース名(スクリプトに便利)を取得するには、以下を使用します。

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active' | egrep -o -m 1 '^[^\t:]+'

これを機能させるには pcregrep をインストールする必要があります。 pcreパッケージの macports にあります。または、これすべき GNU grep with grep -Pzo の代わりに pcregrep -M -oしかし、残りは同じですが、私はこれをテストしていません。

24
Gavin S. Yancey

「エントリ」にstatus: activeが含まれている場合にのみ出力する場合は、次のようなものを使用できますawkプログラムをifconfig出力へのフィルタとして使用します。

#!/usr/bin/awk -f
BEGIN            { print_it = 0 }
/status: active/ { print_it = 1 }
/^($|[^\t])/     { if(print_it) print buffer; buffer = $0; print_it = 0 }
/^\t/            { buffer = buffer "\n" $0 }
END              { if(print_it) print buffer }

各「エントリ」が始まると(行が空になるか、タブで始まらない)、エントリをバッファに保存し始めます。このバッファに、タブで始まる後続の行を追加します。マジックストリングstatus: activeに注意してください。そのような行が見られた場合、新しい「エントリ」が開始する(または入力が終了する)ときに、バッファ(前の「エントリ」)を出力します。

上記のプログラムテキストをファイルに保存し、次のように使用します。

ifconfig -a | awk -f /path/to/file

または、ファイルをchmod +xした場合、ファイルを少し簡略化できます。

ifconfig -a | /path/to/file
2
Chris Johnsen

一部のbashスクリプトに悪影響がない場合は、次のようにできます。

for i in $(ifconfig -lu); do if ifconfig $i | grep -q "status: active" ; then echo $i; fi; done

これにより、アクティブなネットワークインターフェイスが一覧表示されます。 Mac OS X 10.13でテスト済み。

何もインストールする必要がないというのは良いことです。ターミナルで上記を実行してください。

2
Claudio

コメントと質問を読んで、実際には、IPアドレスが割り当てられているインターフェースだけを取得したいようです。

これは、ifconfigおよびgrepを使用してすばやく実行できます。

コマンドを実行する:

ifconfig | grep 'Link\|inet'

次のようなものを生成するはずです:

 eth0 Link encap:Ethernet HWaddr 00:11:22:33:44:55 
 eth1 Link encap:Ethernet HWaddr 00:11:22:33:44:66 
 inet addr:192.168.0.8 Bcast:192.168.0.255 Mask:255.255.255.0 
 lo Link encap:Local Loopback 
 inet addr:127.0.0.1 Mask:255.0.0.0 

これにより、各行にインターフェース名とIPが表示されます(ある場合)。

より具体的なREGEXマジックによって、必要なものが正確に得られる場合があります。

1
Nathan McCoy

質問がもう少し明確になればいいのに。 _Active interface only_によって、アクティブなインターフェースの名前のみ(私の場合はUPおよびRUNNING status active)を他の詳細なしに表示することを想定していました。次にこれを試してください:

_ifconfig | \
  grep "UP\|RUNNIG" \
  | awk '{print $1}' \
  | grep ':' \
  | tr -d ':' \
  | grep -v lo
_

出力は次のようになります。

_en0
en1
en2
bridge0
p2p0
awdl0
llw0
utun0
utun1
utun2
utun3
en6
_

_grep -v_フィールドを調整し、必要に応じてloopback-> loなどの不要なインターフェイスを追加します。

ここで、必要に応じて、見つかったインターフェースが現在アクティブかどうかを確認する必要があります。次に、以下に示すように、それらを単に_ifconfig <interface>_の引数として渡すだけです。

[[ $(ifconfig en0 | grep -w active) ]] && echo "en0 is active"

これをさらに単純化し、関数に実装します。

_checkActiveInterfaces()
{
  local intARR=( $(ifconfig | \
      grep "UP\|RUNNIG" \
      | awk '{print $1}' \
      | grep ':' \
      | tr -d ':' \
      | grep -v lo) );
    intARR=( $(printf "%s\n" "${intARR[@]}" | sort -u) );
    for i in "${intARR[@]}"; do
      [[ $(ifconfig $i | grep -w active) ]] && {
       echo "$i"
    }
    done
}
_

この関数を実行すると、アクティブなインターフェースのみが返されます。私の場合:

_awdl0
en0
llw0
_
1
Rakib Fiha

アクティブなインターフェースMACのみを取得:

cat /sys/class/net/$(ip addr | awk '/state UP/ {print $2}' | sed 's/.$//')/address
0
Alex P

以下は、IPを持つように構成されているインターフェースのみを出力します。

ifconfig | grep "inet.*broadcast"
0
Yousif Atique