2

В настоящее время я пишу shell-скрипт для моего Raspberry Pi, чтобы он настраивал точку доступа с уникальным SSID. Для этого я хочу использовать mac-адрес ключа WiFi в качестве моего SSID. Для этого я хочу использовать awk, с

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

Я могу записать правильно отформатированный MAC-адрес в файл, но как я могу вставить его в определенную строку / место в другом файле? Я имею в виду что-то вроде

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

Любая помощь плюс объяснение для новичка, как я, приветствуется.


Мой входной файл выглядит так:

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

и я пытаюсь получить его и заменить значение ssid в файле, который выглядит так:

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

3 ответа3

0

Затем загрузите и сохраните его на месте с помощью ex редактора, попробуйте:

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

который:

  • берет MAC-адрес из файла (system("cat file") который эквивалентен readfile('file')
  • заменить вывод, удалив все исключение [0-9a-z]
  • затем назначьте его в регистр @m
  • затем замените на hostapd.conf , найдя ssid и заменив \{12} символов [a-f0-9] значением регистра m (\=@m),

    другими словами, это похоже на: %s/^key=\zs.\+/new_value/

  • затем сохраните файл на месте (-cwq)

Для его устранения вы можете:

  • добавьте дополнительно +%p (чтобы напечатать его) и измените -scwq на -scq! для пробного прогона (без изменения файла)
  • добавить -V1 для более подробного

Чтобы получить только MAC-адрес из ifconfig это легко сделать с помощью grep , например:

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

или же:

grep -o ..:..:..:..:..:.. <(ifconfig wlan0)
0
sed -i.bak "s/^ssid=.*/ssid=$(tr -d ':'</sys/class/net/wlan0/address|tee file)/" /etc/hostapd/hostapd.conf

После проверки, вы можете удалить .bak часть, которая создает резервную копию hostapd.conf Я думаю, что вы также собираетесь удалить |tee file .

Знак ^ в регулярных выражениях означает "начало строки"; оператор s в sed заменяет регулярное выражение заданной строкой. Данная строка имеет подоболочку thru $(...) , получающую address содержимое, удаляющую его из : с помощью tr и возвращающую вывод после того, как копия сохранена в file file командой tee .

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

Текущая запись № (NR) равно текущей записи файла №. только для первого файла, затем выполняется подстановка : затем строка помещается в переменную macadd , а next пропускает вывод строки.

Другие инструкции применяются к файлу hostapd.conf ; финал 1 означает "истина", поэтому строки печатаются.

Если все работает нормально, вы можете перенаправить вывод команды в новый файл и заменить hostapd.conf .

Заметки:

  • порядок файлов имеет значение, как вы можете сказать
  • gawk поддерживает замену на месте, начиная с 4.1.0

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .