Jak używać ifconfig do wyświetlania tylko aktywnego interfejsu

22

Domyślnie ifconfigpokażą mi wszystkie dostępne interfejsy, ale co jeśli chcę tylko je wyświetlić active? Na przykład en0tylko poniżej.

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**

Zawiadomienie ifconfig en0nie spełni, en0nie zawsze jest aktywne;)

Używam Mac OS X.

qweruiop
źródło
2
Twój system operacyjny byłby czymś ważnym, o czym warto wspomnieć, ponieważ ifconfigimplementacje są różne. Ponadto, dlaczego użycie ifconfigjest wymagane? Jaki jest twój cel końcowy?
jordanm
Cześć @jordanm, moim celem jest uzyskanie adresu IP aktualnie aktywnego interfejsu, często bezprzewodowego lub przewodowego interfejsu Ethernet.
qweruiop,
jak definiujesz aktywny interfejs?
AnonymousLurker

Odpowiedzi:

24

Aby uzyskać pełny opis wszystkich aktywnych usług, spróbuj:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active'

Ten prosty regex powinien odfiltrowywać tylko aktywne interfejsy i wszystkie ich informacje. Sugeruję umieszczenie aliasu w tym pliku ~ / .profile lub ~ / .bash_profile (może ifactive?)

Aby uzyskać nazwę interfejsu (przydatną w skryptach), użyj:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active' | egrep -o -m 1 '^[^\t:]+'

Aby to zadziałało, musisz zainstalować program pcregrep . Jest na Macports w pakiecie pcre. Alternatywnie, powinno to działać z użyciem GNU grep grep -Pzozamiast, pcregrep -M -oale z resztą to samo, ale nie przetestowałem tego.

g. gniazdo
źródło
2

Jeśli chcesz wydrukować tylko „wpis”, jeśli on zawiera status: active, możesz użyć czegoś takiego jak ten program awk jako filtra do wyjścia 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 }

Kiedy zaczyna się każda „pozycja” (linia jest pusta lub nie zaczyna się od tabulatora), zacznij zapisywać pozycję w buforze. Dołącz do tego bufora wszelkie kolejne wiersze rozpoczynające się od Tab. Uważaj na magiczny sznurek status: active; jeśli taka linia była widoczna, wydrukuj bufor (poprzedni „wpis”), gdy rozpocznie się nowy „wpis” (lub wejście się zakończy).

Zapisz powyższy tekst programu w pliku i użyj go w następujący sposób:

ifconfig -a | awk -f /path/to/file

Lub, jeśli masz chmod +xplik, możesz go trochę uprościć:

ifconfig -a | /path/to/file
Chris Johnsen
źródło
2

Jeśli nie masz negatywnego wpływu na niektóre skrypty bash, możesz to zrobić:

for i in $(ifconfig -lu); do if ifconfig $i | grep -q "status: active" ; then echo $i; fi; done

Spowoduje to wyświetlenie aktywnych interfejsów sieciowych. Testowane na Mac OS X 10.13.

Zaletą jest to, że nie trzeba niczego instalować. Po prostu uruchom powyższe w terminalu.

Claudio
źródło
To powinna być najlepsza odpowiedź, jednak ifconfig -lunie będzie działać na Debianie. Ale OP i tak używa MacOS, więc to rozwiązanie będzie działać na systemach z BSD ifconfig. Poniżej zamieściłem inną odpowiedź, która robi to samo bez użyciaifconfig -lu
Rakib Fiha
1

Czytając komentarze i pytania, wydaje się, że naprawdę chcesz po prostu uzyskać interfejsy, które mają przypisany adres IP.

Możesz to zrobić szybko za pomocą ifconfigi grep.

Uruchomienie polecenia:

ifconfig | grep 'Link\|inet'

Powinien produkować coś podobnego do:

eth0 Link encap: Ethernet HWaddr 00: 11: 22: 33: 44: 55
Interfejs eth1 Link: Ethernet HWaddr 00: 11: 22: 33: 44: 66  
          adres inet: 192.168.0.8 Emisja: 192.168.0.255 Maska: 255.255.255.0
lo Link encap: Lokalna pętla zwrotna  
          adres inet: 127.0.0.1 Maska: 255.0.0.0

Spowodowałoby to wyświetlenie każdej linii z nazwą interfejsu i adresem IP, jeśli takowe miały.

Niektóre bardziej szczegółowe magie REGEX mogą zapewnić ci dokładnie to, czego potrzebujesz.

Nathan McCoy
źródło
2
Dzięki, ale gdzie jest activerozważanie?
qweruiop,
jeśli po interfejsie jest linia, to ma do niej przypisany adres IP, a przez to, co rozumiem, rozumiesz jako „aktywny”.
Nathan McCoy,
1

Chciałbym, żeby pytanie było nieco jaśniejsze. Zakładając, że przez Active interface only, chciałeś pokazać tylko nazwę aktywnych interfejsów (w moim przypadku UPi RUNNINGstatusie active) bez żadnych innych szczegółów. Następnie spróbuj tego:

ifconfig | \
  grep "UP\|RUNNIG" \
  | awk '{print $1}' \
  | grep ':' \
  | tr -d ':' \
  | grep -v lo

Dane wyjściowe wyglądałyby następująco:

en0
en1
en2
bridge0
p2p0
awdl0
llw0
utun0
utun1
utun2
utun3
en6

Dostosuj grep -vpole i dodaj więcej niechcianych interfejsów, takich jak loopback-> loitp., Jeśli to konieczne.

Teraz, jeśli chcesz i musisz sprawdzić, czy znalezione interfejsy są obecnie aktywne. Następnie możemy po prostu przekazać je jako argument za ifconfig <interface>jak pokazano poniżej:

[[ $(ifconfig en0 | grep -w active) ]] && echo "en0 is active"

Dalsze uproszczenie i wdrożenie w funkcji:

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
}

Wykonanie tej funkcji zwróci tylko aktywne interfejsy. W moim przypadku:

awdl0
en0
llw0
Rakib Fiha
źródło
0

Poniżej zostaną wydrukowane tylko te interfejsy, które są skonfigurowane do posiadania adresu IP

ifconfig | grep "inet.*broadcast"
Yousif Atique
źródło
0

Uzyskaj tylko interfejs MAC AKTYWNY:

cat /sys/class/net/$(ip addr | awk '/state UP/ {print $2}' | sed 's/.$//')/address
Alex P.
źródło
Zauważ, że MacOS nie ma ipdomyślnie; potrzebujesz do tego HomeBrew, a następnie uruchom brew install iproute2macraz. Kod źródłowy jest na 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

Jak to działa:

  • ifconfig
  • Grep dla linii zawierających „adres inet”
    • Te linie zawierają adresy IP.
  • Grep dla linii, które nie zawierają „127.0.0.1”
    • Zazwyczaj nie dbamy o localhost.
    • -v jest odwróconym grep
  • Z pozostałych linii usuń „Bcast”
  • Wytnij pole 2, używając „:” jako separatora
    • Drukuje odpowiedź.
ohlemacher
źródło
-1
ifconfig en0 | grep status

Spowoduje to wyświetlenie statusu połączenia Ethernet en0

swartenfagen
źródło