如何使用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 OSX。


2
由于ifconfig实现方式各不相同,因此您的操作系统值得一提。另外,为什么要使用ifconfig?您的最终目标是什么?
jordanm

@jordanm,您好,我的目标是获取当前活动接口(通常是无线或有线以太网接口)的IP地址。
qweruiop 2013年

您如何定义活动接口?
AnonymousLurker

Answers:


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才能运行。它位于pcre软件包中的macports上。另外,这应该与GNU grep一起使用,grep -Pzo而不是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键开头),请开始将条目保存在缓冲区中。将以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 -lu不适用于debian。但是OP仍在使用MacOS,因此该解决方案可以在具有BSD的系统上使用ifconfig。我在下方发布了另一个答案,该答案无需使用即可完成ifconfig -lu
Rakib Fiha

1

阅读您的评论和问题,看来您实际上只是想获得分配了IP地址的接口。

您可以使用ifconfig和快速完成此操作grep

运行命令:

ifconfig | grep 'Link\|inet'

应产生类似以下内容:

eth0链接encap:以太网HWaddr 00:11:22:33:44:55
eth1链接encap:以太网HWaddr 00:11:22:33:44:66  
          inet地址:192.168.0.8广播:192.168.0.255掩码:255.255.255.0
lo链接封套:本地环回  
          inet地址:127.0.0.1掩码:255.0.0.0

这将显示每行的接口名称和IP(如果有的话)。

一些更具体的REGEX魔术可能会为您提供所需的确切信息。


2
谢谢,但是在哪里active考虑?
qweruiop 2013年

如果接口后有一行,则为其分配了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
  • Grep包含“ inet addr”的行
    • 这些行包含IP。
  • 不包含“ 127.0.0.1”的行的Grep
    • 我们通常不关心本地主机。
    • -v是反向grep
  • 在剩余的行中,删除“广播”
  • 使用“:”作为分隔符剪切字段2
    • 打印答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.