Come posso ottenere l'elenco di tutte le interfacce di rete attive a livello di programmazione?

4

Il mio obiettivo è determinare l'indirizzo IP per Ethernet su un dispositivo. Ma supponendo che ci siano connessioni come WiFi e USB Ethernet, c'è un modo particolare per ottenere l'IP Ethernet?

Su una shell vorrei fare: networksetup -listallhardwareports

che mi darebbe una mappatura di Hardware Port to Device. Da quello vorrei grep il dispositivo per porta hardware: Ethernet e quindi utilizzare ifaddr struct per ottenere il mio IP.

Conosco la parte ifaddr, per favore suggerisci come fare la prima parte a livello di programmazione. Inoltre, esiste un approccio alternativo?

    
posta user447851 10.02.2016 - 06:09
fonte

2 risposte

4

Potrebbero esserci diversi modi per realizzare ciò che stai chiedendo, tuttavia, lo butto qui.

Ho un MacBook Pro che non ha una porta Ethernet integrata, quindi nei miei esempi userò Porta hardware: Wi-Fi poiché ho provato questo in entrambi gli esempi di seguito ha funzionato, tuttavia è possibile cambiarlo in Porta hardware: Ethernet se questo è ciò che l'output di
networksetup -listallhardwareports mostra per te.

Se vuoi solo inviare l'indirizzo IP del dispositivo di destinazione a stdout , usa il seguente esempio:

$ ipconfig getifaddr $(networksetup -listallhardwareports | awk '/Hardware Port: Wi-Fi/{getline; print $2}')
$ 192.168.1.100

Se vuoi assegnarlo a una variabile in uno script , usa il seguente esempio:

ipAddress="$(ipconfig getifaddr $(networksetup -listallhardwareports | awk '/Hardware Port: Wi-Fi/{getline; print $2}'))"


Spiegazione:

L'output pertinente di networksetup -listallhardwareports per il mio sistema è:

Hardware Port: Wi-Fi
Device: en0
Ethernet Address: 28:cf:e3:10:a4:cd

(Nota: questo non è il mio vero indirizzo MAC)

Uso della sostituzione del comando $(...) per avere qualcosa da passare a ipconfig getifaddr <args> Determina il nome dispositivo della porta hardware con l'output di networksetup -listallhardwareports e pipe | attraverso awk che sta cercando Hardware Port: Wi-Fi e utilizza la funzione get line , che legge la riga successiva dopo la corrispondenza e viene passata a print $2 , che in sostanza stampa la seconda parte della riga seguendo la corrispondenza , che nel caso è en0 e che viene passato a ipconfig getifaddr come argomento nel primo esempio, ad esempio ipconfig getifaddr en0 . L'output di cui è l'indirizzo IP.

Nel secondo esempio viene utilizzata una seconda sostituzione di comando $(...) attorno alla complessa riga di comando utilizzata per l'esempio stdout per assegnarla alla variabile ipAddress variabile quando usata in un lo script .

Nota: Questo è davvero pensato per essere un esempio in quanto non l'ho codificato per tenere conto che il dispositivo è inattivo. In altre parole se il dispositivo non ha e indirizzo IP non ci sarà alcun output in stdout e nulla assegnato alla ipAddress variabile nello script . Anche se nello script può essere codificato per verificare se la variabile ipAddress variabile è vuota e agire di conseguenza.

    
risposta data 10.02.2016 - 07:32
fonte
1

Utilizzare SCNetworkInterfaceCopyAll per ottenere un elenco di interfacce, quindi filtrare quelli che non restituiscono Ethernet con SCNetworkInterfaceGetInterfaceType . Da lì puoi ottenere il gateway e la maschera, ecc. In Python io uso netifaces per questo.

    
risposta data 03.06.2018 - 18:54
fonte

Leggi altre domande sui tag