デフォルトでは、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を実行しています。
すべてのアクティブなサービスの完全な説明を取得するには、次を試してください。
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
しかし、残りは同じですが、私はこれをテストしていません。
「エントリ」に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
一部のbashスクリプトに悪影響がない場合は、次のようにできます。
for i in $(ifconfig -lu); do if ifconfig $i | grep -q "status: active" ; then echo $i; fi; done
これにより、アクティブなネットワークインターフェイスが一覧表示されます。 Mac OS X 10.13でテスト済み。
何もインストールする必要がないというのは良いことです。ターミナルで上記を実行してください。
コメントと質問を読んで、実際には、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マジックによって、必要なものが正確に得られる場合があります。
質問がもう少し明確になればいいのに。 _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
_
アクティブなインターフェースMACのみを取得:
cat /sys/class/net/$(ip addr | awk '/state UP/ {print $2}' | sed 's/.$//')/address
以下は、IPを持つように構成されているインターフェースのみを出力します。
ifconfig | grep "inet.*broadcast"