Как использовать 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реализации варьируются. Кроме того, почему использование ifconfigявляется требованием? Какова ваша конечная цель?
Иордания

Привет @jordanm, моя цель - получить IP-адрес активного в данный момент интерфейса, часто беспроводного или проводного интерфейса Ethernet.
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. В качестве альтернативы, это должно работать с использованием 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 }

Когда начинается каждая «запись» (строка пуста или не начинается с табуляции), начинайте сохранять запись в буфере. Добавьте в этот буфер любые последующие строки, начинающиеся с табуляции. Наблюдайте за волшебной последовательностью 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
Ракиб Фиха

1

Читая ваши комментарии и вопросы, кажется, что вы действительно хотите просто получить интерфейсы, которым назначен 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  
          адрес в сети Интернет: 192.168.0.8 Bcast: 192.168.0.255 Маска: 255.255.255.0
lo Link encap: Local Loopback  
          адрес в сети: 127.0.0.1 маска: 255.0.0.0

Это покажет каждую строку с именем интерфейса и и IP, если они есть.

Некоторая более специфическая магия REGEX может дать вам именно то, что вам нужно.


2
Спасибо, но где это activeрассмотрение?
qweruiop

если после интерфейса есть строка, то ему назначен IP-адрес, и, как я понимаю, вы подразумеваете, что он будет «активным».
Натан Маккой

1

Я хотел бы, чтобы вопрос был немного яснее. Предполагая, что под этим Active interface onlyвы подразумевали отображение только имени активных интерфейсов (в моем случае UPи RUNNINGстатуса 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

0

Далее будут распечатаны только те интерфейсы, которые настроены на использование IP

ifconfig | grep "inet.*broadcast"

0

Получить ACTIVE интерфейс MAC только:

cat /sys/class/net/$(ip addr | awk '/state UP/ {print $2}' | sed 's/.$//')/address

Обратите внимание, что MacOS не имеет ipпо умолчанию; для этого вам нужен HomeBrew, затем запустите brew install iproute2macодин раз. Исходный код этого находится на github.com/brona/iproute2mac
Йерун Wiert Pluimers

-1
$ ifconfig | grep "inet addr:" | grep -v 127.0.0.1 | sed -e 's/Bcast//' | cut -d: -f2

Как это устроено:

  • Ifconfig
  • Grep для строк, содержащих "inet addr"
    • Эти строки содержат IP-адреса.
  • Grep для строк, которые не содержат "127.0.0.1"
    • Мы обычно не заботимся о localhost.
    • -v перевернутый grep
  • Из оставшихся строк уберите «Bcast»
  • Вырежьте поле 2, используя «:» в качестве разделителя
    • Распечатывает ответ.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.