Wie kann ich eine Adresse abrufen und den Wert in der Datei mit dem Schlüssel- / Wertformat ändern?

2

Momentan schreibe ich ein Shell-Skript für meinen Raspberry Pi, um einen Zugangspunkt mit einer eindeutigen SSID einzurichten. Dazu möchte ich die Mac-Adresse des WLAN-Dongles als meine SSID verwenden. Dafür möchte ich awk verwenden, mit

awk '{ gsub(/:/, ""); print > "file" }' /sys/class/net/wlan0/address

Ich kann die korrekt formatierte Mac-Adresse in eine Datei schreiben, aber wie kann ich sie in eine bestimmte Zeile / Stelle in einer anderen Datei einfügen? Ich habe so etwas im Sinn

awk '{ gsub(/:/, ""); "replace ssid= at /etc/hostapd/hostapd.conf"  }' /sys/class/net/wlan0/address

Jede Hilfe und Erklärung für einen Neuling wie mich wird geschätzt.


Meine Eingabedatei sieht folgendermaßen aus:

$ cat /sys/class/net/wlan0/address
01:23:45:67:89:ab

und ich versuche es zu holen und den Wert von zu ersetzen ssid in der datei was ist wie:

interface=wlan0 driver=nl80211 ssid=7cdd907f6b07 hw_mode=g channel=11 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=1 wpa_passphrase=My_Passphrase wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP
Jabaal
quelle
Können Sie einige Beispielinhalte von / sys / class / net / wlan0 / address einfügen, um sie zu analysieren? Und welche Ergebnisse erwarten Sie?
kenorb
@kenorb der inhalt ist eine mac adresse: 7c:dd:90:7f:6b:07 und die erwarteten Ergebnisse sind ssid=pi_7cdd907f6b07 innerhalb des /etc/hostapd/hostapd.conf
Jabaal
Nur eine Zeile mit so etwas wie 01:23:45:67:89:ab? Kannst du einfach benutzen grep: grep -o ..:..:..:..:..:.. >> file? Oder ist die Ausgabe eher, dass Sie es an der bestimmten Linie wünschen? Hast du ex in Himbeer-Pi?
kenorb
Ich habe mehrere Zeilen innerhalb der /etc/hostapd/hostapd.conf - Ich muss nur die mit ändern ssid=some_ssid - das grep Befehl schreibt nur in eine Datei.
Jabaal

Antworten:

0
 awk 'NR==FNR{gsub(":","");macadd=$0;next}{sub(/^ssid=.*/,"ssid="macadd)}1' /sys/class/net/wlan0/address /etc/hostapd/hostapd.conf

Aktueller Rekord Nr. ( NR ) entspricht dem aktuellen Aktenzeichen also nur für die erste datei : Die Ersetzung wird durchgeführt, anschließend wird die Zeile auf die platziert macadd Variable und next Überspringt die Zeilenausgabe.

Die anderen Anweisungen gelten für die hostapd.conf Datei; Finale 1 steht für "true", somit werden Zeilen gedruckt.

Wenn alles funktioniert, können Sie die Befehlsausgabe in eine neue Datei umleiten und ersetzen hostapd.conf.

Anmerkungen:

  • Dateien bestellen tut Materie, wie Sie sehen können
  • gawk Ersetzte Funktionen ab 4.1.0
SΛLVΘ
quelle
perfekt! genau das, wonach ich gesucht habe.
Jabaal
Danke für Ihre Rückmeldung! Eine Bemerkung, obwohl Sie wahrscheinlich in diese Definition eingetreten sind: Wenn Sie "record" in awk lesen, können Sie sich eine Zeile (wie in diesem Fall) oder einen Teil davon (ein "Feld") vorstellen.
SΛLVΘ
0
sed -i.bak "s/^ssid=.*/ssid=$(tr -d ':'</sys/class/net/wlan0/address|tee file)/" /etc/hostapd/hostapd.conf

Einmal getestet, können Sie die entfernen .bak Teil, der ein Backup von erstellt hostapd.conf. Ich denke, Sie werden auch löschen |tee file.

Das ^ sign in regexps steht für "Zeilenanfang"; das s Betreiber in sed Ersetzt einen regulären Ausdruck durch eine bestimmte Zeichenfolge. Die hier angegebene Zeichenfolge hat eine Subshell mit dem Namen thru $(...), bekommen address Inhalt, löscht es aus : ist mit trund Zurücksenden der Ausgabe nach dem Speichern einer Kopie in file Datei von der tee Befehl.

SΛLVΘ
quelle
1
Ihre Antwort ist hilfreich und funktioniert, obwohl ich speziell nach einer suche awk Lösung.
Jabaal
Wird die ganze Zeile ersetzt oder nur ssid:=?
Jabaal
Kein Doppelpunkt in meinem regulären Ausdruck. Es gelten folgende Regeln: ^ bedeutet Zeilenanfang; . bedeutet ein einzelnes Zeichen; a* bedeutet null oder mehr von a. Probier es aus dich selbst. Übrigens, hast du das verpasst? awk Lösung Ich habe versucht, aufzuschreiben?
SΛLVΘ
0

Dann laden und speichern Sie es an Ort und Stelle mit ex Editor, versuchen Sie:

ex +'let @m = substitute(system("cat /sys/class/net/wlan0/address"), "[^0-9a-z]", "", "g")' +'%s/ssid=\zs[a-f0-9]\{12}/\=@m/' -scwq /etc/hostapd/hostapd.conf

welche:

  • entnimmt der Datei die MAC-Adresse ( system("cat file") das ist äquivalent zu readfile('file')
  • Ersetzen Sie die Ausgabe, indem Sie alle Ausnahmen entfernen [0-9a-z]
  • dann ordne es zu in @m registrieren
  • dann ersetzen auf hostapd.conf durch das Finden ssid und ersetzen \{12} Zeichen von [a-f0-9] mit Wert von m registrieren ( \=@m ),

    Mit anderen Worten: %s/^key=\zs.\+/new_value/

  • Speichern Sie dann die Datei an Ort und Stelle ( -cwq )

Um es zu debuggen, können Sie:

  • extra hinzufügen +%p (um es zu drucken) und zu ändern -scwq in -scq! für den Trockenlauf (ohne die Datei zu ändern)
  • hinzufügen -V1 für ausführlicher

Um nur die MAC-Adresse abzurufen ifconfig es ist leicht zu machen grep, mögen:

ifconfig wlan0 | egrep -om1 "..(:..){5}"

oder:

grep -o ..:..:..:..:..:.. <(ifconfig wlan0)
kenorb
quelle