Come utilizzare ifconfig per mostrare solo l'interfaccia attiva


22

Per impostazione predefinita ifconfigmi mostrerà tutte le interfacce disponibili, ma cosa succede se voglio solo visualizzarne una active? Come, en0solo in basso.

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

L'avviso ifconfig en0non soddisferà, en0non è sempre quello attivo;)

Sto eseguendo Mac OS X.


2
Il tuo sistema operativo sarebbe qualcosa di importante da menzionare poiché le ifconfigimplementazioni variano. Inoltre, perché l'uso è ifconfigun requisito? Qual è il tuo obiettivo finale?
Jordan

Ciao @jordanm, il mio obiettivo è quello di ottenere l'indirizzo IP dell'interfaccia attualmente attiva, spesso un'interfaccia Ethernet wireless o cablata.
Qweruiop,

come si definisce l'interfaccia attiva?
AnonymousLurker

Risposte:


24

Per ottenere una descrizione completa di tutti i servizi attivi, prova:

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

Questa semplice regex dovrebbe filtrare solo le interfacce attive e tutte le loro informazioni. Ti suggerisco di inserire un alias per questo nel tuo file ~ / .profile o ~ / .bash_profile (forse ifactive?)

Per ottenere solo il nome dell'interfaccia (utile per gli script), utilizzare:

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

Devi installare pcregrep per farlo funzionare. È su macports nel pacchetto pcre. In alternativa, questo dovrebbe funzionare con GNU grep usando grep -Pzoinvece pcregrep -M -olo stesso, ma con il resto lo stesso, ma non l'ho provato.


2

Se vuoi solo stampare la "voce" se contiene status: active, puoi usare qualcosa come questo programma awk come filtro per l' output 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 }

Quando ogni "voce" inizia (una riga è vuota o non inizia con una scheda), inizia a salvare la voce in un buffer. Aggiungi a questo buffer tutte le righe successive che iniziano con una scheda. Fai attenzione alla corda magica status: active; se è stata vista una linea simile, stampare il buffer (la "voce" precedente) quando inizia una nuova "voce" (o quando termina l'input).

Salvare il testo del programma sopra in un file e usarlo in questo modo:

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

Oppure, se sei chmod +xil file, puoi semplificarlo un po ':

ifconfig -a | /path/to/file

2

Se non sei contrario ad alcuni script bash, puoi farlo:

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

Questo elencherà le interfacce di rete attive. Testato su Mac OS X 10.13.

La cosa bella è che non è necessario installare nulla. Basta eseguire quanto sopra in un terminale.


Questa dovrebbe essere la risposta migliore, tuttavia ifconfig -lunon funzionerà su Debian. Ma OP utilizza comunque MacOS, quindi questa soluzione funzionerebbe su sistemi con BSD ifconfig. Di seguito ho pubblicato un'altra risposta che fa lo stesso senza usareifconfig -lu
Rakib Fiha,

1

Leggendo i tuoi commenti e le tue domande, sembra che tu voglia semplicemente ottenere le interfacce a cui è assegnato un indirizzo IP.

Puoi farlo rapidamente con ifconfige grep.

Esecuzione del comando:

ifconfig | grep 'Link\|inet'

Dovrebbe produrre qualcosa di simile a:

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

Ciò mostrerebbe ogni riga con un nome di interfaccia e e IP se ne avessero uno.

Qualche magia REGEX più specifica potrebbe darti esattamente ciò di cui hai bisogno.


2
Grazie, ma dov'è activeconsiderazione?
Qweruiop,

se c'è una riga dopo l'interfaccia, allora gli viene assegnato un indirizzo IP, e per cosa intendo intendi, costituirebbe "attivo".
Nathan McCoy,

1

Vorrei che la domanda fosse un po 'più chiara. Supponendo che Active interface only, intendevi mostrare solo il nome delle interfacce attive (nel mio caso UPe RUNNINGstato active) senza altri dettagli. Quindi prova questo:

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

L'output sarebbe simile a:

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

Regola il grep -vcampo e aggiungi altre interfacce indesiderate come loopback-> loecc., Se necessario.

Ora, se lo desideri e dovresti verificare se le interfacce trovate sono attive al momento. Quindi possiamo semplicemente passarli come argomento per ifconfig <interface>come mostrato di seguito:

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

Semplificando ulteriormente e implementandolo in una funzione:

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
}

L'esecuzione di questa funzione restituirà solo le interfacce attive. Nel mio caso:

awdl0
en0
llw0

0

Di seguito verranno stampate solo quelle interfacce configurate per avere un IP

ifconfig | grep "inet.*broadcast"

0

Ottieni solo MAC con interfaccia ACTIVE:

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

Nota che MacOS non ha ipdi default; hai bisogno di HomeBrew per quello, quindi corri brew install iproute2macuna volta. Il codice sorgente è su 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

Come funziona:

  • ifconfig
  • Grep per righe contenenti "inet addr"
    • Queste righe contengono gli IP.
  • Grep per le righe che non contengono "127.0.0.1"
    • Di solito non ci interessa localhost.
    • -v è grep invertito
  • Dalle righe rimanenti, rimuovere il "Bcast"
  • Tagliare il campo 2 usando ":" come delimitatore
    • Stampa la risposta.

-1
ifconfig en0 | grep status

Questo mostrerà lo stato della connessione Ethernet en0

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.