0

我知道有 ifconfig 命令我们可以列出网络接口信息。但我想按以下模式获取信息

Interface_Name IP_Address Net_Mask 状态(上/下)

例如

eth0 192.168.1.1 255.255.255.0 下

我尝试了 ifconfig 和 grep 命令,但无法获得正确的模式。还有另一个命令或一些技巧可以做到这一点吗?

4

3 回答 3

4

Python 很好 :D 但让我们看看 bash:

Interfaces=`ifconfig -a \
    | grep -o -e "[a-z][a-z]*[0-9]*[ ]*Link" \
    | perl -pe "s|^([a-z]*[0-9]*)[ ]*Link|\1|"`

for Interface in $Interfaces; do
    INET=`ifconfig $Interface | grep -o -e "inet addr:[^ ]*" | grep -o -e "[^:]*$"`
    MASK=`ifconfig $Interface | grep -o -e "Mask:[^ ]*"      | grep -o -e "[^:]*$"`
    STATUS="up"
    if [ "$INET" == "" ]; then
        INET="-"
        MASK="-"
        STATUS="down";
    fi
    printf "%-10s %-15s %-16s %-4s\n" "$Interface" "$INET" "$MASK" "$STATUS"
done

这很简单。

ifconfig interface这是在“不显示互联网地址”的假设下完成的,这意味着接口已关闭。

我希望这有帮助。

于 2009-09-21T05:37:29.713 回答
3

ifconfig有两种输出模式——默认一种是提供更多输出,-s另一种是提供较少输出的短模式(或者,更确切地说,从您想要的信息中选择不同的信息位)。那么,如何在默认模式下使用 ifconfig 并在脚本中挑选您想要的特定信息(python、perl、ruby、awk、bash+sed+...,无论您的船是什么;-)。例如,使用 Python:

import re
import subprocess

ifc = subprocess.Popen('ifconfig', stdout=subprocess.PIPE)
res = []
for x in ifc.stdout:
  if not x.strip():
    print ' '.join(res)
    del res[:]
  elif not res:
    res.append(re.match(r'\w+', x).group())
  else:
    mo = re.match(r'\s+inet addr:(\S+).*Mask:(\S+)', x)
    if mo:
      res.extend(mo.groups())
    elif re.match(r'\sUP\s', x):
      res.append('up')
    elif re.match(r'\sDOWN\s', x):
      res.append('down')

if res: print ' '.join(res)

并且输出应该是你想要的(我希望很容易翻译成我提到的任何其他语言)。

于 2009-09-21T04:59:12.533 回答
0

您可能对ip命令感兴趣。以下示例侧重于以 CIDR 表示法输出它们的全局有效 IPv4 地址。

# list interfaces that are up
ip -family inet -oneline addr show scope global | awk '{ printf "%s %s up\n", $2, $4 }'

# list interfaces that are down
ip -family inet -oneline link show scope global | grep ' DOWN ' | sed 's/\://g' | awk '{ printf "%s none down\n", $2}'

(请注意,示例中省略了所需的网络掩码表示。)

由于ip非常强大,您也许可以使用其他参数找到更清洁的解决方案。

于 2013-09-19T02:26:11.830 回答