Wie finde ich den aktuell verbundenen Netzwerkdienst über die Befehlszeile?

20

Ich möchte herausfinden, welche der verfügbaren Netzwerkdienste (z. B. Ethernet oder Wi-Fi ) derzeit aktiv sind. In diesem Screenshot aus den Netzwerkeinstellungen können Sie sehen, dass Wi-Fi derzeit aktiv ist (der grüne Punkt):

Netzwerkeinstellungen

Wie kann ich diese Informationen über die Befehlszeile abrufen?

Mit dem networksetupBefehl kann ich die verfügbaren Netzwerkdienste auflisten:

$ networksetup -listallnetworkservices
An asterisk (*) denotes that a network service is disabled.
Ethernet
FireWire
Wi-Fi

Es können auch einige Details zum Dienst angezeigt werden, z. B. der Gerätename:

$ networksetup -listnetworkserviceorder
An asterisk (*) denotes that a network service is disabled.
(1) Ethernet
(Hardware Port: Ethernet, Device: en0)

(2) FireWire
(Hardware Port: FireWire, Device: fw0)

(3) Wi-Fi
(Hardware Port: Wi-Fi, Device: en1)

Leider ist die Information, welcher Dienst aktiv ist (der grüne Punkt auf dem Screenshot), in dieser Information nicht verfügbar. Gibt es einen anderen Befehl, mit dem ich diese Informationen abrufen kann?

nwinkler
quelle

Antworten:

7

Einfach ausstellen

    ifconfig

Listen Sie alle Netzwerkschnittstellen und deren Status auf.

fd0
quelle
True - Jeder Datensatz enthält ein statusFeld mit activeoder inactiveals Wert.
Nwinkler
1
Wenn Sie Ihr Internet teilen, erhalten Sie ein falsches Ergebnis. Angenommen, Sie teilen Ethernet-Internet über WLAN, dann ist der Status für Ethernet und WLAN "aktiv"
Harshal Chaudhari
3
Dies zeigt Ihnen nicht, welcher Dienst verwendet wird - sowohl WLAN als auch Ethernet werden als "aktiv"
angezeigt
1
Dies ist sehr praktisch, um zu überprüfen, ob eine Verbindung nicht besteht. Zum Beispiel ist mein Ethernet in der Regel nur bei der Arbeit verbunden. Daraus kann ich schließen, dass ich zu Hause bin, wenn ich nicht auf der Liste stehe. ifconfig | grep $(networksetup -listnetworkserviceorder | grep 'Ethernet, Device' | sed -E "s/.*(en[0-9]).*/\1/"). Dann kann ich den Standort wechseln, wenn das oben Gesagte leer ist.
Chris Rymer
Dies listet einfach alle Netzwerkschnittstellen auf, nicht die Netzwerkdienste.
Algen
16

Alles in allem habe ich ein Skript geschrieben, um diese Aufgabe zu erfüllen:

#!/bin/bash

services=$(networksetup -listnetworkserviceorder | grep 'Hardware Port')

while read line; do
    sname=$(echo $line | awk -F  "(, )|(: )|[)]" '{print $2}')
    sdev=$(echo $line | awk -F  "(, )|(: )|[)]" '{print $4}')
    #echo "Current service: $sname, $sdev, $currentservice"
    if [ -n "$sdev" ]; then
        ifout="$(ifconfig $sdev 2>/dev/null)"
        echo "$ifout" | grep 'status: active' > /dev/null 2>&1
        rc="$?"
        if [ "$rc" -eq 0 ]; then
            currentservice="$sname"
            currentdevice="$sdev"
            currentmac=$(echo "$ifout" | awk '/ether/{print $2}')

            # may have multiple active devices, so echo it here
            echo "$currentservice, $currentdevice, $currentmac"
        fi
    fi
done <<< "$(echo "$services")"

if [ -z "$currentservice" ]; then
    >&2 echo "Could not find current service"
    exit 1
fi

Das Skript ruft zuerst eine Dienstliste vom networksetupBefehl ab und prüft dann, ob sich jeder Dienst im aktiven Status von befindet ifconfig.

Nennen Sie das Skript networkservice.shbeispielsweise so, dass es ausgeführt wird, um den aktuellen Netzwerkdienst abzurufen, auf dem Sie sich befinden.

$ bash networkservice.sh
USB 10/100/1000 LAN, en4, 00:e0:4a:6b:4d:0c
Wi-Fi, en0, 8c:85:90:a0:4b:ec
Reorx
quelle
Ich musste die erste Leitung tacumleiten, um die Schnittstellen in umgekehrter Reihenfolge zu durchlaufen, da ich häufig WLAN sowie einen USB-Ethernet-Adapter (der das bevorzugte Gerät im Netzwerk ist) angeschlossen habe. In diesem Fall möchte ich, dass das am meisten bevorzugte aktive services=$(networksetup -listnetworkserviceorder | grep 'Hardware Port' | tac)
Gerät
@ghr das macht keinen Sinn, networksetup -listnetworkserviceordergibt bereits "das am meisten bevorzugte Gerät" zuerst aus ...
Motsel
Es sieht so aus, als hätte ich das obige Skript ein wenig modifiziert, sodass es nur einen Dienst ausgibt und keinen verbundenen. Ich musste tacdamit später (nicht bevorzugte) Dienste nicht überschreiben $currentservice. Sollte in diesem ursprünglichen Kommentar klarer sein.
ghr
5

Mit diesem scutil --dnsBefehl erhalten Sie alle Netzwerk-Routing-Informationen, die Sie zum Zuordnen von Hardwareschnittstellenbezeichnungen zu Netzwerkrouten benötigen.

Ein wenig awkund grepkann es hübsch machen, wenn Sie die Informationen skripten oder abschneiden müssen. Beginnen Sie mit der Suche nach "if_index", wenn Sie neugierig sind.

bmike
quelle
Das sieht nützlich aus - damit spiele ich rum!
nwinkler
2

Ich werde nicht vorgeben, die Antwort auf diese Frage sortiert zu haben, aber dies, aber das ist vielleicht hilfreich.

Sie können sich fragen, wie Pakete derzeit an etwas weitergeleitet werden:

$ route get example.com | grep interface
interface: en8

Und dann können Sie fragen, welcher "Netzwerkdienst" diese Schnittstelle verwaltet:

$ networksetup -listnetworkserviceorder | grep en8
(Hardware Port: Broadcom NetXtreme Gigabit Ethernet Controller, Device: en8)

Aber ehrlich gesagt bezweifle ich, dass ein "Netzwerkdienst" eins zu eins mit einem Hardware-Port ist. Einige Schnittstellen, z. B. tun0, verfügen nicht über einen "Netzwerkdienst". Zumindest manchmal nicht.

Ben Hyde
quelle
2

Wenn nur jemand anderes darüber stolpert, wie ich es getan habe, könnte der folgende Code eher das sein, wonach Sie suchen.

Hiermit wird die Antwort von PeterVP erweitert

Auch sichtbar unter https://www.kittell.net/code/mac-os-x-get-network-information/

#! / bin / sh

klar
sExternalMACALService = "http://dns.kittell.net/macaltext.php?address="

# Alle Netzwerkanschlüsse auflisten
NetworkPorts = $ (ifconfig -uv | grep '^ [a-z0-9]' | awk -F: '{print $ 1}')
#echo $ NetworkPorts

# Funktion zum Konvertieren der IP-Subnetzmaske in CIDR
mask2cdr ()
{
# Angenommen, es gibt kein "255". nach einem Nicht-255-Byte in der Maske
local x = $ {1 ## * 255.}
set - 0 ^^^ 128 ^ 192 ^ 224 ^ 240 ^ 248 ^ 252 ^ 254 ^ $ ((($ {# 1} - $ {# x}) * 2)) $ {x %%. *}
x = $ {1 %% $ 3 *}
echo $ (($ 2 + ($ {# x} / 4))
}

# Entfernte / öffentliche IP-Adresse abrufen
remoteip = $ (dig + short myip.opendns.com @ resolver1.opendns.com)

# Computername abrufen
Computername = $ (scutil --get ComputerName)

# Seriennummer abrufen
sSerialNumber = $ (system_profiler SPHardwareDataType | grep "Seriennummer (System)" | awk '{print $ 4}' | cut -d / -f1)
#echo $ sSerialNumber

# Name und Version des Betriebssystems abrufen - Starten
OSvers1 = $ (sw_vers -productVersion | cut -d. -F1)
OSvers2 = $ (sw_vers -productVersion | cut -d. -F2)
OSvers3 = $ (sw_vers -productVersion | cut -d. -F3)
case $ OSvers2 in
8)
OSName = "Berglöwe"
;;
9)
OSName = "Mavericks"
;;
10)
OSName = "Yosemite"
;;
11)
OSName = "El Capitan"
;;
12)
OSName = "Sierra"
;;
Standard)
OSName = "Unbekannt"
;;
esac
# Name und Version des Betriebssystems abrufen - Beenden


echo "$ computername"
Echo "--------------"
echo "Betriebssystem: Mac OS X - $ OSName $ OSvers1. $ OSvers2. $ OSvers3"
Echo "Computername: $ Computername"
echo "Aktueller Benutzername: $ (whoami)"
echo "Seriennummer: $ sSerialNumber"

if [[$ remoteip]]; dann
Echo "Remote-IP-Adresse: $ remoteip \ n"
sonst
Echo "Remote-IP-Adresse: Bestimmung nicht möglich \ n"
fi

für val in $ NetworkPorts; do # Ermittelt für alle verfügbaren Hardware-Ports deren Status
enabled = $ (ifconfig -uv "$ val" | grep 'status:' | awk '{print $ 2}')
#echo $ aktiviert
label = $ (ifconfig -uv "$ val" | grep 'type' | awk '{print $ 2}')
#echo $ label
#ActiveNetwork = $ (route get default | grep interface | awk '{print $ 2}')
ActiveNetworkName = $ (networksetup -listallhardwareports | grep -B 1 "$ label" | awk '/ Hardware Port / {print}' | cut -d "" -f3- | uniq)
#echo $ ActiveNetwork
#echo $ ActiveNetworkName
state = $ (ifconfig -uv "$ val" | grep 'status:' | awk '{print $ 2}')
#echo $ state
ipaddress = $ (ifconfig -uv "$ val" | grep 'inet' | awk '{print $ 2}')
# echo $ ipaddress

if [[-z $ (ifconfig -uv "$ val" | grep 'link rate:' | awk '{print $ 3, $ 4}' | sed 'N; s / \ n / up /')]; dann
networkspeed = "$ (ifconfig -uv" $ val "| grep 'link rate:' | awk '{print $ 3}') up / down"
sonst
networkspeed = "$ (ifconfig -uv" $ val "| grep 'link rate:' | awk '{print $ 3, $ 4}' | sed 'N; s / \ n / up /') down"
fi

#echo $ networkspeed
macaddress = $ (ifconfig -uv "$ val" | grep 'ether' | awk '{print $ 2}')
#echo $ macaddress
macal = $ (locken -s "$ sExternalMACALService $ macaddress")
#echo $ macal
quality = $ (ifconfig -uv "$ val" | grep 'Linkqualität:' | awk '{print $ 3, $ 4}')
#echo $ Qualität
netmask = $ (ipconfig getpacket "$ val" | grep 'subnet_mask (ip):' | awk '{print $ 3}')
#echo $ netmask
router = $ (ipconfig getpacket "$ val" | grep 'router (ip_mult):' | sed '/.* router (ip_mult): {\ ([^}] * \)}. * / \ 1 /')
#echo $ router
DHCPActive = $ (networksetup -getinfo "Wi-Fi" | grep DHCP)
#echo $ DHCPActive
dnsserver = $ (networksetup -getdnsservers "$ ActiveNetworkName" | awk '{print $ 1, $ 2}' | sed 'N; s / \ n //')
#echo $ dnsserver

if ["$ enabled" = 'active']; dann
#echo "Netzwerkanschluss ist aktiv"
if [[$ ipaddress]]; dann
echo "$ ActiveNetworkName ($ val)"
Echo "--------------"
# Handelt es sich um einen WiFi-Port? Wenn ja, dann wollen wir den Netzwerknamen
if ["$ label" = "Wi-Fi"]; dann
WiFiName = $ (/ System / Library / PrivateFrameworks / Apple80211.framework / Versions / A / Resources / airport -I | grep '\ sSSID:' | sed 's /.*: //')
#echo $ WiFiName
echo "Netzwerkname: $ WiFiName"
fi

Echo "IP-Adresse: $ ipaddress"
echo "Subnet Mask: $ netmask"
echo "Router: $ router"
echo "IP CIDR: $ ipaddress / $ (mask2cdr $ netmask)"

if [[-z $ dnsserver]]; dann
if [[$ DHCPActive]]; dann
Echo "DNS-Server: Mit DHCP einstellen"
sonst
Echo "DNS-Server: Unbekannt"
fi
sonst
echo "DNS Server: $ dnsserver"
fi

Echo "MAC-Adresse: $ macaddress ($ macal)"
echo "Netzwerkgeschwindigkeit: $ networkspeed"
echo "Link Qualität: $ Qualität"
Echo ""
fi

# Zeigen Sie die inaktiven Ports nicht an.
fi

erledigt
David Kittell
quelle
In meinem Skript habe ich die öffentliche Abfrage durch set public (dig +short myip.opendns.com @resolver1.opendns.com) Folgendes ersetzt: Mein Grund dafür ist, dass ein DNS-Server (wie opendns) mit geringerer Wahrscheinlichkeit nicht verfügbar ist als eine Website und schneller ist. Und ich habe die Schlafanweisung entfernt. Warten Sie nicht auf die Antwort des DNS-Servers. Ausführungszeit für mein Skript 177 ms. Ihre dauert 5,237 Sekunden, macht aber natürlich mehr. Immer noch ein großer Unterschied.
PeterVP
Toller Vorschlag
David Kittell
1

Entnommen aus Find Detailed Wi-Fi Connection History über die Befehlszeile von Mac OS X | OSXDaily :

Verwenden Sie für moderne Versionen von Mac OS X, OS X Yosemite 10.10 und neuer Folgendes:

defaults read /Library/Preferences/SystemConfiguration/com.apple.airport.preferences |grep LastConnected -A 7

Wenn Sie die Eingabetaste drücken, wird sofort eine umfassende Liste der Details zur drahtlosen Netzwerkverbindung angezeigt.

Sie erhalten viele Informationen zum Verlauf der Verbindungen, einschließlich der Details für die aktuelle Verbindung.

Nicht perfekt, aber Sie erhalten die Informationen, die Sie suchen - und viele zusätzliche Informationen mehr!

JJarava
quelle
1

Hier ist ein Skript für Fischschalen, das ich geschrieben habe:

function netinfo -d "get network information"

  # Get public ip address
  set public (dig +short myip.opendns.com @resolver1.opendns.com)
  set hostname (uname -n)

  if test -z "$public" # We got an empty string, meaning:
    set public "No Internet connection available"
  end

  echo ''
  echo "    Public IP: $public"
  echo "     Hostname: $hostname"
  echo ''

  # Get all available hardware ports
  set ports (ifconfig -uv | grep '^[a-z0-9]' | awk -F : '{print $1}')

  # Get for all available hardware ports their status
  for val in $ports
    set activated (ifconfig -uv $val | grep 'status: ' | awk '{print $2}')

    # We want information about active network ports...
    if test $activated = 'active' ^/dev/null
      set ipaddress (ifconfig -uv $val | grep 'inet ' | awk '{print $2}')

      # and of these, the ones with an IP-address assigned to it
      if test -n "$ipaddress" ^/dev/null

        # Do we have an IP address?
        # Then give us the information
        set label (ifconfig -uv $val | grep 'type' | awk '{print $2}')
        set macaddress (ifconfig -uv $val | grep 'ether ' | awk '{print $2}')
        set quality (ifconfig -uv $val | grep 'link quality:' | awk '{print $3, $4}')
        set netmask (ipconfig getpacket $val | grep 'subnet_mask (ip):' | awk '{print $3}')
        set router (ipconfig getpacket $val | grep 'router (ip_mult):' | sed 's/.*router (ip_mult): {\([^}]*\)}.*/\1/')
        set dnsserver (ipconfig getpacket $val | grep 'domain_name_server (ip_mult):' | sed 's/.*domain_name_server (ip_mult): {\([^}]*\)}.*/\1/')

        # Header for the network interfaces
        echo -n $label ; echo -n ' ('; echo -n $val ; echo ')'
        echo "--------------"

        # Is this a WiFi associated port? If so, then we want the network name
        switch $label
          case Wi-Fi
            # Get WiFi network name
            set wifi_name (/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I | grep '\sSSID:' | sed 's/.*: //')
            echo " Network Name: $wifi_name"
            # Networkspeed for Wi-Fi
            set networkspeed (/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I | grep lastTxRate: | sed 's/.*: //' | sed 's/$/ Mbps/')
          case '*'
            # Networkspeed  for other ports
            set networkspeed (ifconfig -uv $val | grep 'link rate:' | awk '{print $3, $4}')
        end

        echo "   IP-address: $ipaddress"
        echo "  Subnet Mask: $netmask"
        echo "       Router: $router"
        echo "   DNS Server: $dnsserver"
        echo "  MAC-address: $macaddress"
        echo "Network Speed: $networkspeed"
        echo " Link quality: $quality"
        echo ''
      end

      # Don't display the inactive ports.
    else if test $activated = 'inactive' ^/dev/null
    end
  end
end

Es zeigt alle aktiven Netzwerkschnittstellen und relevanten Daten.

Kommentieren Sie, was Sie nicht wollen / brauchen

PeterVP
quelle
1
Könnte einfacher sein, eine echo_italicShell-Funktion zu definieren, als all diese echos in set_colorAufrufe zu packen.
Nohillside
Alle set_colorBefehle können entfernt werden. Sie sind nur "dekorativ".
PeterVP
1
set_colorBefehle entfernt und Variablen in echo-Anweisungen
eingefügt
0

Ich bin mir nicht sicher, ob dies für jemanden hilfreich ist, aber als ich an der gleichen Frage bastelte, kam ich zu dieser Lösung:

ifconfig | grep flags=8863 | grep -v bridge

Die Ausgabe sieht ungefähr so ​​aus und listet nur die Ethernet-Ports und das WLAN auf, die aktiv verwendet werden:

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500

Wenn Sie auch die zugewiesene IPv4-Adresse sehen möchten:

ifconfig | grep 'flags=8863\|inet ' | grep -v 'bridge\|127.0.0.1'

Was so etwas hervorbringt;

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    inet 192.168.2.147 netmask 0xffffff00 broadcast 192.168.2.255
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    inet 192.168.2.244 netmask 0xffffff00 broadcast 192.168.2.255

Eine andere Alternative:

scutil --nwi

Was die Online-Netzwerkgeräte zeigt, zeigt die letzte Zeile tatsächlich die aktuell aktiven Netzwerkschnittstellen:

Network information

IPv4 network interface information
     en0 : flags      : 0x5 (IPv4,DNS)
           address    : 192.168.2.147
           reach      : 0x00000002 (Reachable)
     en1 : flags      : 0x5 (IPv4,DNS)
           address    : 192.168.2.244
           reach      : 0x00000002 (Reachable)

   REACH : flags 0x00000002 (Reachable)

IPv6 network interface information
   No IPv6 states found


   REACH : flags 0x00000000 (Not Reachable)

Network interfaces: en0 en1

Die weitere Bearbeitung, falls erforderlich, liegt bei Ihnen. :-)


Hinweis:

Wohlgemerkt, ich bin kein Kenner der Flaggen (8863). Sie können die Flagge Details in dem finden if.h Header - Datei - Spotlight ist dein Freund „if.h“ zu finden. Ich habe meine zum Beispiel hier gefunden:

/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/net/if.h

was Ihnen zeigt, was die Flags bedeuten (beachten Sie: hexadezimal);

#define IFF_UP          0x1             /* interface is up */
#define IFF_BROADCAST   0x2             /* broadcast address valid */
#define IFF_DEBUG       0x4             /* turn on debugging */
#define IFF_LOOPBACK    0x8             /* is a loopback net */
#define IFF_POINTOPOINT 0x10            /* interface is point-to-point link */
#define IFF_NOTRAILERS  0x20            /* obsolete: avoid use of trailers */
#define IFF_RUNNING     0x40            /* resources allocated */
#define IFF_NOARP       0x80            /* no address resolution protocol */
#define IFF_PROMISC     0x100           /* receive all packets */
#define IFF_ALLMULTI    0x200           /* receive all multicast packets */
#define IFF_OACTIVE     0x400           /* transmission in progress */
#define IFF_SIMPLEX     0x800           /* can't hear own transmissions */
#define IFF_LINK0       0x1000          /* per link layer defined bit */
#define IFF_LINK1       0x2000          /* per link layer defined bit */
#define IFF_LINK2       0x4000          /* per link layer defined bit */
#define IFF_ALTPHYS     IFF_LINK2       /* use alternate physical connection */
#define IFF_MULTICAST   0x8000          /* supports multicast */
Hanzaplastique
quelle