Como buscar endereço e modificar o valor no arquivo de formato chave / valor?

2

Atualmente estou escrevendo um script de shell para o meu Raspberry Pi para que ele configure um ponto de acesso com um SSID exclusivo. Para fazer isso, quero usar o endereço MAC do dongle WiFi como meu SSID. Para fazer isso eu quero usar o awk, com

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

Eu posso escrever o endereço mac corretamente formatado em um arquivo, mas como posso inseri-lo em uma linha / lugar específico em outro arquivo? Eu tenho em mente algo como

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

Qualquer ajuda ou explicação para um novato como eu é apreciada.

Meu arquivo de entrada é como:

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

e eu estou tentando buscá-lo e substituir o valor de ssid no arquivo que é como:

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
    
por Jabaal 27.10.2015 / 00:04

3 respostas

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

Registro atual no. ( NR ) é igual ao registro do arquivo atual no. apenas para o primeiro arquivo, então a substituição de : é feita, subsequentemente a linha é colocada na variável macadd , e next pula a saída de linha.

As outras instruções são aplicadas ao arquivo hostapd.conf ; final 1 significa "verdadeiro", assim linhas são impressas.

Se tudo funcionar bem, você pode redirecionar a saída do comando para um novo arquivo e substituir hostapd.conf .

Notas:

  • o pedido de arquivos importa, como você pode dizer
  • gawk apresenta substituição no local a partir de 4.1.0
por 27.10.2015 / 15:40
0
sed -i.bak "s/^ssid=.*/ssid=$(tr -d ':'</sys/class/net/wlan0/address|tee file)/" /etc/hostapd/hostapd.conf

Após o teste, você pode remover a parte .bak , que cria um backup de hostapd.conf . Eu acho que você também vai apagar |tee file .

O sinal ^ na expressão regular significa "início da linha"; o operador s em sed substitui um regexp por uma determinada string. Dada string, aqui tem uma subshell chamada thru $(...) , obtendo address content, limpando-a de : com tr e retornando a saída depois que uma cópia é armazenada no arquivo file pelo tee comando.

    
por 27.10.2015 / 00:33
0

Em seguida, carregue e salve no local usando o editor ex , tente:

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

qual:

  • recebe o endereço MAC do arquivo ( system("cat file") , que é equivalente a readfile('file')
  • substitua a saída removendo tudo isento [0-9a-z]
  • atribua-o em @m register
  • em seguida, substitua hostapd.conf encontrando ssid e substituindo \{12} caracteres de [a-f0-9] pelo valor de m register ( \=@m ),

    em outras palavras, é como: %s/^key=\zs.\+/new_value/

  • salve o arquivo no local ( -cwq )

Para depurá-lo, você pode:

  • adicione +%p extra (para imprimi-lo) e altere -scwq para -scq! para execução a seco (sem alterar o arquivo)
  • adicione -V1 para mais verboso

Para buscar apenas o endereço MAC de ifconfig , é fácil fazer com grep , como:

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

ou:

grep -o ..:..:..:..:..:.. <(ifconfig wlan0)
    
por 27.10.2015 / 11:35