Як використовувати 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 . Це на макпортах у пакеті 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

Якщо ви не заважаєте деяким баш сценаріям, ви можете зробити це:

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 не вийде. Але ОП в будь-якому випадку використовує 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  
          inet addr: 192.168.0.8 Bcast: 192.168.0.255 Маска: 255.255.255.0
lo Link encap: Local Loopback  
          inet addr: 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
Jeroen Wiert Pluimers

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

Як це працює:

  • ifconfig
  • Зчіпка для рядків, що містять "inet addr"
    • Ці рядки містять IP-адреси.
  • Перехват для рядків, які не містять "127.0.0.1"
    • Ми, як правило, не піклуємося про localhost.
    • -v - перевернутий греп
  • З решти рядків видаліть "Bcast"
  • Виріжте поле 2, використовуючи ":" як роздільник
    • Друкує відповідь.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.