Come trovare il servizio di rete attualmente connesso dalla riga di comando?


20

Vorrei scoprire quale dei servizi di rete disponibili (ad es. Ethernet o Wi-Fi ) è attualmente attivo. In questo screenshot dalle Preferenze di rete, puoi vedere che il Wi-Fi è attualmente attivo (il punto verde):

Preferenze di rete

Come posso ottenere queste informazioni dalla riga di comando?

Il networksetupcomando mi consente di elencare i servizi di rete disponibili:

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

Può anche mostrare alcuni dettagli sul servizio, come il nome del dispositivo:

$ 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)

Sfortunatamente, le informazioni su quale servizio è attivo (il punto verde dello screenshot) non sono disponibili in queste informazioni. C'è un altro comando che potrei usare per ottenere queste informazioni?

Risposte:


7

Emettere semplicemente

    ifconfig

Elencare tutte le interfacce di rete e il loro stato.


Vero: ogni record contiene un statuscampo che ha activeo inactivecome valore.
nwinkler,

1
Ti darà risultati falsi se condividi Internet. Supponiamo che tu stia condividendo Internet Ethernet tramite Wi-Fi, quindi lo stato per Ethernet e Wi
Fi

3
Questo non ti mostra quale servizio viene utilizzato - sia wifi che Ethernet mostreranno come 'attivi' se hai entrambi abilitato e un cavo ethernet collegato.
tog22

1
Questo è abbastanza utile per verificare se una connessione non è connessa. Ad esempio il mio ethernet è generalmente collegato solo al lavoro. Quindi posso dedurre che sono a casa da questo non essere nella lista. ifconfig | grep $(networksetup -listnetworkserviceorder | grep 'Ethernet, Device' | sed -E "s/.*(en[0-9]).*/\1/"). Quindi posso cambiare posizione in base a quanto sopra è vuoto.
Chris Rymer,

Questo semplicemente elenca tutte le interfacce di rete e non i servizi di rete.
algal,

16

Metto tutto insieme, ho scritto una sceneggiatura per svolgere questo compito:

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

Lo script prima ottiene un elenco di servizi dal networksetupcomando, quindi controlla se ogni servizio è nello stato attivo da ifconfig.

Assegna un nome allo script, ad networkservice.shesempio, quindi eseguilo per ottenere l'attuale servizio di rete in cui ti trovi.

$ bash networkservice.sh
USB 10/100/1000 LAN, en4, 00:e0:4a:6b:4d:0c
Wi-Fi, en0, 8c:85:90:a0:4b:ec

Ho dovuto reindirizzare la prima linea per tacscorrere le interfacce in ordine inverso perché spesso ho il WiFi collegato e un adattatore Ethernet USB (che è il dispositivo preferito in rete). In questo caso desidero stampare il dispositivo attivo più preferito:services=$(networksetup -listnetworkserviceorder | grep 'Hardware Port' | tac)
ghr,

@ghr che non ha alcun senso, networksetup -listnetworkserviceorderemette già "il dispositivo più preferito" prima ...
Motsel

Sembra che abbia finito per modificare un po 'lo script sopra in modo che stampi solo 1 servizio, piuttosto che qualsiasi altro collegato. Ho dovuto fare in tacmodo che i servizi successivi (non preferiti) non vengano sovrascritti $currentservice. Avrebbe dovuto essere più chiaro in quel commento originale.
ghr

5

Il scutil --dnscomando fornisce tutte le informazioni sul routing di rete necessarie per mappare le etichette dell'interfaccia hardware sui percorsi di rete.

Un po ' awke greppuoi inventarlo se devi scrivere le informazioni o ridurle. Inizia con la presa per "if_index" se sei curioso.


Sembra utile - ci giocherò!
nwinkler,

3

Nel caso in cui qualcun altro si imbattesse in questo come ho fatto il codice qui sotto potrebbe essere più di quello che stai cercando.

Questo per espandere la risposta di PeterVP

Visibile anche su https://www.kittell.net/code/mac-os-x-get-network-information/

#! / Bin / sh

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

# Elenca tutte le porte di rete
NetworkPorts = $ (ifconfig -uv | grep '^ [a-z0-9]' | awk -F: '{print $ 1}')
#echo $ NetworkPorts

# Funzione per convertire la maschera di sottorete IP in CIDR
mask2cdr ()
{
# Suppone che non ci sia "255". dopo un non-255 byte nella maschera
local x = $ {1 ## * 255.}
set - 0 ^^^ 128 ^ 192 ^ 224 ^ 240 ^ 248 ^ 252 ^ 254 ^ $ (((($ {# 1} - $ {# x}) * 2)) $ {x %%. *}
x = $ {1 %% $ 3 *}
echo $ (($ 2 + ($ {# x} / 4)))
}

# Ottieni indirizzo IP remoto / pubblico
remoteip = $ (dig + short myip.opendns.com @ resolver1.opendns.com)

# Ottieni nome computer
nomecomputer = $ (scutil --get ComputerName)

# Ottieni il numero di serie
sSerialNumber = $ (system_profiler SPHardwareDataType | grep "Numero di serie (sistema)" | awk '{print $ 4}' | cut -d / -f1)
#echo $ sSerialNumber

# Ottieni nome e versione del sistema operativo - Avvia
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 = "Mountain Lion"
;;
9)
Osname = "Mavericks"
;;
10)
OSName = "Yosemite"
;;
11)
OSName = "El Capitan"
;;
12)
OSName = "Sierra"
;;
predefinito)
OSName = "Sconosciuto"
;;
esac
# Ottieni nome e versione del sistema operativo - Stop


echo "$ nomecomputer"
eco "--------------"
echo "Sistema operativo del computer: Mac OS X - $ OSName $ OSvers1. $ OSvers2. $ OSvers3"
echo "Nome computer: $ nomecomputer"
echo "Nome utente corrente: $ (whoami)"
echo "Numero di serie: $ sSerialNumber"

if [[$ remoteip]]; poi
echo "Indirizzo IP remoto: $ remoteip \ n"
altro
echo "Indirizzo IP remoto: impossibile determinare \ n"
fi

per val in $ NetworkPorts; do # Ottieni il loro stato per tutte le porte hardware disponibili
attivato = $ (ifconfig -uv "$ val" | grep 'status:' | awk '{print $ 2}')
#echo $ attivato
label = $ (ifconfig -uv "$ val" | grep 'type' | awk '{print $ 2}')
#echo $ label
#ActiveNetwork = $ (route get default | interfaccia grep | 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 $ indirizzo IP

if [[-z $ (ifconfig -uv "$ val" | grep 'velocità di collegamento:' | awk '{stampa $ 3, $ 4}' | sed 'N; s / \ n / up /')]]; poi
networkspeed = "$ (ifconfig -uv" $ val "| grep 'velocità di collegamento:' | awk '{print $ 3}') su / giù"
altro
networkspeed = "$ (ifconfig -uv" $ val "| grep 'velocità di collegamento:' | awk '{stampa $ 3, $ 4}' | sed 'N; s / \ n / su /') giù"
fi

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

if ["$ enabled" = 'active']; poi
#echo "La porta di rete è attiva"
if [[$ ipaddress]]; poi
echo "$ ActiveNetworkName ($ val)"
eco "--------------"
# È una porta associata al WiFi? In tal caso, vogliamo il nome della rete
if ["$ label" = "Wi-Fi"]; poi
WiFiName = $ (/ System / Library / PrivateFrameworks / Apple80211.framework / Versions / A / Resources / airport -I | grep '\ sSSID:' | sed 's /.*: //')
#echo $ WiFiName
echo "Nome rete: $ WiFiName"
fi

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

if [[-z $ dnsserver]]; poi
if [[$ DHCPActive]]; poi
echo "Server DNS: impostato con DHCP"
altro
echo "Server DNS: sconosciuto"
fi
altro
echo "Server DNS: $ dnsserver"
fi

echo "indirizzo MAC: $ ​​macaddress ($ macal)"
echo "Velocità di rete: $ networkspeed"
echo "Qualità collegamento: qualità $"
eco " "
fi

# Non visualizzare le porte inattive.
fi

fatto

Nel mio script ho sostituito la query pubblica con: Il set public (dig +short myip.opendns.com @resolver1.opendns.com) mio ragionamento è che un server DNS (come Opendns) ha meno probabilità di essere inattivo rispetto a un sito Web ed è più veloce. E ho rimosso l'istruzione sleep. Non è necessario attendere la risposta del server DNS. Tempo di esecuzione per il mio script 177 ms. Il tuo richiede 5,237 secondi, ma ovviamente fa di più. Ancora una grande differenza.
PeterVP

Ottimo consiglio
David Kittell,

2

Non farò finta di avere la risposta a questa domanda ordinata, ma questo, ma questo potrebbe essere utile.

Puoi chiedere in che modo indirizzerà i pacchetti verso qualcosa:

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

E poi puoi chiedere quale "Servizio di rete" gestisce quell'interfaccia:

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

Ma onestamente, dubito che un "Network Services" sia uno a uno con una porta hardware. E alcune interfacce, ad esempio tun0, non hanno un "Servizio di rete". Beh, almeno a volte no.


1

Tratto da Trova la cronologia dettagliata delle connessioni Wi-Fi dalla riga di comando di Mac OS X | OSXDaily :

Per le versioni moderne di Mac OS X, OS X Yosemite 10.10 e successive, utilizzare quanto segue:

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

Premi Invio e vedrai immediatamente l'elenco completo dei dettagli della connessione di rete wireless.

Ricevi molte informazioni sulla cronologia delle connessioni, inclusi i dettagli per quella corrente.

Non perfetto ma ottieni le informazioni che stai cercando - e molte altre informazioni in più!


1

Ecco uno script di conchiglia di pesce che ho scritto:

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

Mostra tutte le interfacce di rete attive e i dati rilevanti.

Commenta ciò che non vuoi / non hai bisogno


1
Potrebbe essere più semplice definire una echo_italicfunzione shell invece di racchiudere tutte queste chiamate echonelle set_colorchiamate.
Nohillside

Tutti i set_colorcomandi possono essere rimossi. Sono solo "decorativi".
PeterVP,

1
Rimossi i set_colorcomandi e inserite le variabili nelle dichiarazioni dell'eco
PeterVP,

0

Non sono sicuro che questo sia utile a nessuno, ma dato che stavo armeggiando con la stessa domanda, sono arrivato a questa soluzione:

ifconfig | grep flags=8863 | grep -v bridge

L'output sarà simile a questo ed elenca solo le porte Ethernet e il wifi che sono in uso attivo:

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

Se desideri vedere anche l'indirizzo IPv4 assegnato:

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

Che produce qualcosa del genere;

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

Un'altra alternativa:

scutil --nwi

Che mostra i dispositivi di rete online l'ultima riga mostra effettivamente le interfacce di rete attualmente attive:

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

L'ulteriore elaborazione, se necessario, dipende da te. :-)


Nota:

Intendiamoci che non sono un esperto di bandiere (8863). Puoi trovare i dettagli della bandiera nel file di intestazione if.h - Spotlight è tuo amico nel trovare "if.h". Ho trovato il mio per esempio qui:

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

che ti mostrerà cosa significano le bandiere (tieni presente: esadecimale);

#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 */
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.