Verwendung von ifconfig, um nur die aktive Schnittstelle anzuzeigen


22

Standardmäßig ifconfigwerden mir alle verfügbaren Schnittstellen angezeigt , aber was ist, wenn ich nur eine anzeigen möchte active? Wie, en0nur unten.

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

Kündigung ifconfig en0wird nicht befriedigen, en0ist nicht immer die aktive;)

Ich verwende Mac OS X.


2
Ihr Betriebssystem sollte unbedingt erwähnt werden, da die ifconfigImplementierungen unterschiedlich sind. Warum ist die Verwendung auch ifconfigerforderlich? Was ist dein Endziel?
Jordanien

Hallo @jordanm, mein Ziel ist es, die IP-Adresse der aktuell aktiven Schnittstelle zu ermitteln, häufig eine drahtlose oder kabelgebundene Ethernet-Schnittstelle.
Qweruiop

Wie definieren Sie die aktive Schnittstelle?
AnonymousLurker

Antworten:


24

Um eine vollständige Beschreibung aller aktiven Dienste zu erhalten, versuchen Sie Folgendes:

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

Dieser einfache reguläre Ausdruck sollte nur aktive Schnittstellen und alle ihre Informationen herausfiltern. Ich schlage vor, Sie haben einen Alias ​​dafür in Ihre Datei ~ / .profile oder ~ / .bash_profile eingefügt (möglicherweise inaktiv?)

Um nur den Schnittstellennamen zu erhalten (nützlich für Skripte), verwenden Sie:

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

Sie müssen pcregrep installieren, damit dies funktioniert. Es ist auf Macports im pcre-Paket. Alternativ kann diese sollte mit GNU arbeitet grep grep -Pzostatt , pcregrep -M -oaber mit dem Rest des gleiche, aber ich nicht getestet haben.


2

Wenn Sie den „Eintrag“ nur dann drucken möchten, wenn er enthält status: active, können Sie so etwas wie dieses awk- Programm als Filter für die ifconfig- Ausgabe verwenden:

#!/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 }

Wenn jeder „Eintrag“ beginnt (eine Zeile ist leer oder beginnt nicht mit einem Tabulator), speichern Sie den Eintrag in einem Puffer. Fügen Sie an diesen Puffer alle nachfolgenden Zeilen an, die mit einem Tabulator beginnen. Achten Sie auf die magische Schnur status: active; Wenn eine solche Zeile angezeigt wurde, drucken Sie den Puffer (den vorherigen "Eintrag") aus, wenn ein neuer "Eintrag" beginnt (oder die Eingabe endet).

Speichern Sie den obigen Programmtext in einer Datei und verwenden Sie ihn wie folgt:

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

Oder, wenn Sie chmod +xdie Datei, dann können Sie es ein bisschen vereinfachen:

ifconfig -a | /path/to/file

2

Wenn Sie mit Bash-Skripten nichts zu tun haben, können Sie Folgendes tun:

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

Hier werden die aktiven Netzwerkschnittstellen aufgelistet. Getestet unter Mac OS X 10.13.

Das Schöne ist, dass Sie nichts installieren müssen. Führen Sie einfach die oben genannten in einem Terminal.


Dies sollte die beste Antwort sein, ifconfig -luwird jedoch unter Debian nicht funktionieren. Da OP jedoch ohnehin MacOS verwendet, funktioniert diese Lösung auch auf Systemen mit BSD ifconfig. Ich gab eine andere Antwort , unter dem macht das gleiche , ohneifconfig -lu
Rakib Fiha

1

Wenn Sie Ihre Kommentare und Fragen lesen, möchten Sie anscheinend nur die Schnittstellen abrufen, denen eine IP-Adresse zugewiesen wurde.

Mit ifconfigund geht das schnell grep.

Befehl ausführen:

ifconfig | grep 'Link\|inet'

Sollte etwas ähnliches produzieren wie:

eth0-Verbindungskapsel: Ethernet HWaddr 00: 11: 22: 33: 44: 55
eth1-Verbindungskapsel: Ethernet HWaddr 00: 11: 22: 33: 44: 66  
          inet addr: 192.168.0.8 Bcast: 192.168.0.255 Mask: 255.255.255.0
lo Link encap: Lokales Loopback  
          inet addr: 127.0.0.1 Mask: 255.0.0.0

Dies würde jede Zeile mit einem Schnittstellennamen und einer IP anzeigen, wenn sie eine hatten.

Mit etwas spezifischerer REGEX-Magie erhalten Sie möglicherweise genau das, was Sie benötigen.


2
Danke aber wo ist activeGegenleistung?
Qweruiop

Wenn sich hinter der Schnittstelle eine Leitung befindet, ist ihr eine IP-Adresse zugewiesen, und was ich zusammenfasse, bedeutet dies, dass sie als "aktiv" eingestuft wird.
Nathan McCoy

1

Ich wünschte, die Frage wäre etwas klarer. Angenommen Active interface only, Sie wollten mit nur den Namen der aktiven Schnittstellen (in meinem Fall UPund in meinem RUNNINGStatus active) ohne weitere Details anzeigen. Dann versuchen Sie folgendes:

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

Die Ausgabe würde folgendermaßen aussehen:

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

Passen Sie das grep -vFeld an und fügen Sie bei Bedarf weitere unerwünschte Schnittstellen wie loopback-> loetc hinzu.

Wenn Sie möchten, müssen Sie jetzt prüfen, ob die gefundenen Schnittstellen derzeit aktiv sind. Dann können wir sie einfach als Argument für ifconfig <interface>Folgendes übergeben:

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

Dies weiter vereinfachen und in eine Funktion umsetzen:

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
}

Wenn Sie diese Funktion ausführen, werden nur die aktiven Schnittstellen zurückgegeben. In meinem Fall:

awdl0
en0
llw0

0

Das Folgende druckt nur die Schnittstellen aus, die für eine IP konfiguriert sind

ifconfig | grep "inet.*broadcast"

0

Erhalten Sie nur die MAC-Schnittstelle ACTIVE:

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

Beachten Sie, dass MacOS ipstandardmäßig nicht hat ; Dazu benötigen Sie HomeBrew. Führen Sie das Programm dann brew install iproute2maceinmal aus. Der Quellcode ist bei 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

Wie es funktioniert:

  • ifconfig
  • Grep für Zeilen mit "inet addr"
    • Diese Zeilen enthalten die IPs.
  • Grep für Zeilen, die nicht "127.0.0.1" enthalten
    • Wir kümmern uns normalerweise nicht um localhost.
    • -v ist Grep invertiert
  • Entfernen Sie aus den verbleibenden Zeilen den "Bcast"
  • Schneiden Sie Feld 2 mit ":" als Trennzeichen aus
    • Gibt die Antwort aus.

-1
ifconfig en0 | grep status

Dies zeigt den Status der Ethernet-Verbindung en0 an

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.