Получить информацию о сетевом интерфейсе - PullRequest
0 голосов
/ 21 сентября 2009

Я знаю, что есть команда ifconfig, которая может вывести информацию о сетевом интерфейсе. но я хочу получить информацию по следующей схеме

Interface_Name IP_Address Net_Mask Status(up/down)

например

eth0 192.168.1.1 255.255.255.0 down

Я пробовал команды ifconfig и grep, но не могу получить правильный шаблон. Для этого есть другая команда или какой-то трюк?

Ответы [ 3 ]

4 голосов
/ 21 сентября 2009

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 не показывает интернет-адрес», что означает, что интерфейс не работает.

Надеюсь, это поможет.

3 голосов
/ 21 сентября 2009

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)

и вывод должен быть по вашему желанию (я надеюсь, что легко перевести на любой другой язык, который я упомянул).

0 голосов
/ 19 сентября 2013

Возможно, вас заинтересует команда ip. В следующем примере основное внимание уделяется глобально действительным адресам IPv4, выводящим их в нотации CIDR.

# 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 достаточно мощный, вы можете найти более чистое решение, используя другие параметры.

...