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


22

デフォルトで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を実行しています。


2
ifconfig実装はさまざまであるため、OSは重要なものです。また、なぜ使用ifconfigが要件なのですか?最終目標は何ですか?
ヨルダン

@jordanmさん、私の目標は、現在アクティブなインターフェイス(多くの場合、ワイヤレスまたは有線のイーサネットインターフェイス)のIPアドレスを取得することです。
qweruiop

アクティブなインターフェイスをどのように定義しますか?
AnonymousLurker

回答:


24

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

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をインストールする必要があります。それは上だMacPortsの PCREパッケージインチ あるいは、これgrep -Pzo代わりに使用するGNU grepで動作するはずですpcregrep -M -oが、残りは同じですが、私はこれをテストしていません。


2

「エントリ」にが含まれている場合にのみ「エントリ」を出力する場合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 }

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

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

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

または、chmod +xファイルの場合は、少し単純化できます。

ifconfig -a | /path/to/file

2

一部のbashスクリプトに不利な場合は、これを実行できます。

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

アクティブなネットワークインターフェイスがリストされます。Mac OS X 10.13でテスト済み。

良い点は、何もインストールする必要がないことです。ターミナルで上記を実行するだけです。


これが最良の答えになるはずですが、ifconfig -ludebianでは動作しません。しかし、OPはとにかくMacOSを使用しているため、このソリューションはBSDのシステムで動作しますifconfig。私は使用せず、別の答えはこれを下回る同じことを掲示ifconfig -lu
Rakib Fiha

1

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

あなたはすぐにこれを行うことができますifconfigし、grep

コマンドの実行:

ifconfig | grep 'Link\|inet'

次のようなものを生成する必要があります。

eth0リンクencap:Ethernet HWaddr 00:11:22:33:44:55
eth1リンク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マジックによって、必要なものが正確に得られる場合があります。


2
ありがとう、しかしactive考慮はどこですか?
qweruiop

インターフェースの後に回線がある場合、それに割り当てられたIPアドレスがあり、私が収集した意味では、それは「アクティブ」として構成されます。
ネイサンマッコイ

1

質問が少し明確になったことを願っています。によると仮定すると、他の詳細なしActive interface onlyでアクティブなインターフェイスの名前のみを表示することになります(私の場合UPRUNNINGステータス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
$ ifconfig | grep "inet addr:" | grep -v 127.0.0.1 | sed -e 's/Bcast//' | cut -d: -f2

使い方:

  • ifconfig
  • 「inet addr」を含む行のGrep
    • これらの行にはIPが含まれています。
  • 「127.0.0.1」を含まない行のGrep
    • 通常、localhostは気にしません。
    • -vは逆grepです
  • 残りの行から「Bcast」を削除します
  • 「:」を区切り文字として使用してフィールド2を切り取ります
    • 答えを出力します。

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