2017-01-10 2 views
1

Wie kann ich alle BSSIDs der iw und iwinfo Befehle erhalten? Hier sind die Befehle iw und iwinfo, um alle SSIDs zu erhalten. IW:Alle SSIDs und BSSIDs von WiFis erhalten

iw dev wlan0 scan 2>/dev/null | awk ' 
/SSID:/{ 
    if (!seen[$0]++) { 
    printf "\"" 
    for (i = 2; i <= NF; i++) if (i == 2) printf $i 
    else printf " " $i 
    printf "\" " 
    } 
} 
' 

iwinfo:

iwinfo wlan0 scan | awk ' 
/ESSID: ".*"/ { 
    ORS = " " 
    if (!seen[$0]++) for (i = 2; i <= NF; i++) print $i 
} 
' 

Current awk output:

"WiFi-1" "WiFi-2" "WiFi-3" "WiFi-4" „WiFi -5" ...

iw Konsolausgabe:

BSS 01:23:45:67:89:AB(on wlan0) 
     TSF: 128785915910 usec (1d, 11:46:25) 
     freq: 2437 
     beacon interval: 200 TUs 
     capability: ESS ShortPreamble ShortSlotTime (0x0421) 
     signal: -71.00 dBm 
     last seen: 990 ms ago 
     Information elements from Probe Response frame: 
     SSID: WiFi-1 
     Supported rates: 1.0* 2.0* 5.5* 6.0 9.0 11.0* 12.0 18.0 
     DS Parameter set: channel 6 
     Country: SK  Environment: Indoor/Outdoor 
       Channels [1 - 13] @ 20 dBm 
     ERP: <no flags> 
     Extended supported rates: 24.0 36.0 48.0 54.0 
     WMM:  * Parameter version 1 
       * BE: CW 15-1023, AIFSN 3 
       * BK: CW 15-1023, AIFSN 7 
       * VI: CW 7-15, AIFSN 2, TXOP 3008 usec 
       * VO: CW 3-7, AIFSN 2, TXOP 1504 usec 
BSS CD:EF:A0:A1:A2:A3(on wlan0) 
     TSF: 2381690679244 usec (27d, 13:34:50) 
     freq: 2467 
     beacon interval: 200 TUs 
     capability: ESS ShortPreamble ShortSlotTime (0x0421) 
     signal: -94.00 dBm 
     last seen: 90 ms ago 
     Information elements from Probe Response frame: 
     SSID: WiFi-2 
     Supported rates: 1.0* 2.0* 5.5* 6.0 9.0 11.0* 12.0 18.0 
     DS Parameter set: channel 12 
     Country: SK  Environment: Indoor/Outdoor 
       Channels [1 - 13] @ 20 dBm 
     ERP: <no flags> 
     Extended supported rates: 24.0 36.0 48.0 54.0 
     WMM:  * Parameter version 1 
       * BE: CW 15-1023, AIFSN 3 
       * BK: CW 15-1023, AIFSN 7 
       * VI: CW 7-15, AIFSN 2, TXOP 3008 usec 
       * VO: CW 3-7, AIFSN 2, TXOP 1504 usec 

iwinfo Konsolenausgabe:

Cell 01 - Address: 01:23:45:67:89:AB 
      ESSID: "WiFi-1" 
      Mode: Master Channel: 11 
      Signal: -49 dBm Quality: 61/70 
      Encryption: WPA2 PSK (CCMP) 

Cell 02 - Address: CD:EF:A0:A1:A2:A3 
      ESSID: "WiFi-2" 
      Mode: Master Channel: 11 
      Signal: -53 dBm Quality: 57/70 
      Encryption: WPA2 PSK (CCMP) 

Ich möchte folgende Ausgabe mit dem awk bekommen:

"01: 23: 45: 67: 89: AB" „CD: EF : A0: A1: A2: A3" ...

Was ist der richtige Weg, um alle BSSIDs zu erfassen die Awk für beide libs (iw & iwinfo) mit?

+1

'{iw dev ...; iwinfo ...; } | awk ...'vielleicht –

+3

Zeigen Sie einige Ausgaben der' iw' und 'iwinfo' Befehle (d. h. die Beispieleingabe in den awk Befehl, den Sie schreiben möchten) und die gewünschte Ausgabe vom awk Befehl, der diese Eingabe gegeben hat. –

+1

Sie sollten das wahrscheinlich auch lesen: [Was soll ich tun, wenn jemand meine Frage beantwortet] (http://stackoverflow.com/help/someone-answers) –

Antwort

1

Mit GNU awk für die 3. arg übereinstimmen():

{ cat iw_output; cat iwinfo_output; } | 
awk 'match($0,/([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}/,a) && !seen[a[0]]++{print a[0]}' 
01:23:45:67:89:AB 
CD:EF:A0:A1:A2:A3 

oder das Ausgabeformat in Ihrer Frage gebeten werden:

{ cat iw_output; cat iwinfo_output; } | 
awk 'match($0,/([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}/,a) && !seen[a[0]]++{printf "%s\"%s\"", (c++?OFS:""), a[0]} END{print ""}' 
"01:23:45:67:89:AB" "CD:EF:A0:A1:A2:A3" 

Mit anderen awks würden Sie substr($0,RSTART,RLENGTH) statt a[0] verwenden .

+0

Danke Ed, diese ist die, die ich gesucht habe! Ich musste substr ($ 0, RSTART, RLENGTH) anstelle von [0] verwenden, wie Sie vorgeschlagen haben. Kann ich wissen, wie man den führenden Platz vor dem Ausgang mit dem awk entfernt? Ich konnte es nur mit sed erreichen. Vielen Dank. Übrigens hätte ich nie gedacht, dass dies nur mit dem Awk erreicht werden kann. Du hast meine Bewunderung: D –

+1

Ändere '++ c' in' C++ ', also ist' c' das erste Mal, wenn es getestet wird. Ich habe meine Antwort aktualisiert, um das zu tun, es war ein Fehler. Bitte. Sie können nur mit awk eine Textmanipulation durchführen, es ist ein extrem mächtiges und prägnantes Werkzeug/Sprache, das für die Manipulation von Text entwickelt wurde. Holen Sie sich das Buch Effective Awk Programming, 4. Auflage, von Arnold Robbins. –

+1

Vielen Dank für die Aktualisierung und Studienreferenz. –

1

aktualisiert Antwort

Wenn Sie die Ausgänge einzigartig machen wollen, würden Sie das Ergebnis der Befehle in meiner ursprünglichen Antwort durch sort und uniq laufen:

{ iw ...; iwinfo ...; } | grep -Eo '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}' | sort | uniq 

Wenn Sie wollten dann wickle sie in doppelte Anführungszeichen und ersetze die neue Zeile durch ein Leerzeichen, das du tun würdest:

{ iw ...; iwinfo ...; } | grep -Eo '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}' | sort | uniq | sed -E 's|(.*)|"\1"|' | tr '\n' ' ' 

"01:23:45:67:89:AB" "CD:EF:A0:A1:A2:A3" 

Original-Antwort

ich Ihre Frage verwirrt bin, aber ich denke, das tun, was Sie wollen:

{ iw dev wlan0 scan 2>/dev/null; iwinfo wlan0 scan; } | grep -Eo '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}' 

Beispielausgabe

01:23:45:67:89:AB 
CD:EF:A0:A1:A2:A3 
01:23:45:67:89:AB 
CD:EF:A0:A1:A2:A3 
+0

Danke, dieser funktioniert am besten. Wie kann ich den Befehl machen, nur eindeutige BSSIDs zu erfassen? Ich habe einige Duplikate in der Ausgabe. Vielleicht ist das der Grund, warum awk zusammen mit! Seen [$ 0] verwendet wird. Also was ich brauche: Unikate & genau das gleiche Format der Ausgabe: "01: 23: 45: 67: 89: AB" "CD: EF: A0: A1: A2: A3" ... - wie im ersten Post. Bitte bewahren Sie auch dieses eine Format für weitere Referenzen auf (falls Sie sich entscheiden, es zu bearbeiten). Vielen Dank. –

+0

Danke Mark, du hast mir den Tag gerettet. Jetzt kann ich das Skript für die Verwendung von BSSIDs anstelle von ESSIDs vollständig neu schreiben und die Funktion zum Deaktivieren der SSID-Übertragung verwenden. Bitte stellen Sie mir auch eine gute Dokumentation oder vielleicht bessere Literatur zur Verfügung. Ich bin ziemlich gut mit Regexes, aber ich bin nicht vertraut mit denen [: Notationen:]. Sort und uniq sieht cool aus, dachte nie über sie nach. Der Hauptpunkt war, diese App mit awk zu schreiben, aber ich denke, dass ich auf awk verzichten und bei der sed bleiben werde. Nochmals vielen Dank für deine großartige Hilfe! :) –

1

@ Martin: Versuchen:

Your_command | awk -vs1="\"" '/^Cell/{VAL=VAL?VAL s1 $NF s1:s1 $NF s1} END{print VAL}' 
+0

Danke, dieser arbeitet nur mit iwinfo. –

Verwandte Themen