Gerenciamento de Bash wifi / lan

1

No trabalho eu tenho acesso à internet, mas só está disponível através de ethernet. Isso é bom para o meu laptop (executando XUbuntu 13.10 32-bit), mas quando se trata de meus outros dispositivos ... não tanto. Então, o que tenho que fazer é conectar meu laptop e, em seguida, configurar o Network Manager para "Criar nova rede Wi-Fi ...". Tudo isso é bom, e coloca os outros dispositivos online, mas eu gostaria de automatizar esse processo um pouco.

O que eu gostaria de fazer é configurar um script bash para executar na inicialização (essa parte eu posso fazer sem assistência) para executar o seguinte pseudocódigo:

While true
  If ethernet cable is plugged in and wlan0 is not broadcasting [Foo] signal
   - Drop any connection on wlan0
   - Create a new Wi-Fi network: [Foo], using WEP key: [bar]
  If ethernet cable is unplugged and wlan0 is broadcasting Omni signal
   - Stop broadcasting Omni on wlan0
End While

Agora, algumas notas aqui antes de continuar. Primeiro, eu entendo que o WEP é inseguro, mas no meu caso é necessário que os outros dispositivos em questão não manipulem o WPA / WPA2 de forma muito elegante, se é que o fazem. Segundo, eu também sei que provavelmente existe uma maneira de fazer isso dentro do Network Manager, mas eu gostaria de fazer isso no Bash (não apenas para torná-lo mais facilmente portável para futuros laptops, mas também para aprender mais sobre scripts Bash)

Agora, voltemos ao nosso código. A primeira linha é a mais simples:

#!/bin/bash

O próximo passo é manter este script rodando em segundo plano para ficar de olho na conexão ethernet, fazendo isso uma vez por minuto para evitar sobrecarregar uma das minhas CPUs:

while true; do
 # Loop contents to go here
 sleep 60
done

Agora vem a parte que eu preciso de ajuda, a lógica que verifica a conexão ethernet e cria / destrói a rede [Foo] conforme necessário. Para verificar o estado da conexão de rede, ponderei brevemente usando

ifconfig | grep eth0

Mas esta saída não me fornece a informação necessária 'estou conectado'. Sem o grep, eu posso ver muito bem se é RUNNING ou não, mas analisá-lo para um condicional no Bash é uma história diferente. Quanto a realmente derrubar ou colocar uma rede usando ifconfig em vez do Network Manager, isso também é um pequeno mistério para mim. Alguma idéia de como eu poderia implementar essa funcionalidade?

Como de costume, agradeço antecipadamente por qualquer contribuição construtiva.

    
por Aren 28.02.2016 / 22:57

1 resposta

0

ifconfig -s <interface> imprimirá uma saída bem formatada (e fácil de analisar):

% ifconfig -s enp4s0f2
Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
enp4s0f2   1500 0         0      0      0 0             0      0      0      0 BMU

Você poderia passá-lo para o AWK e manipular o status de saída do pipe de acordo com o campo Flg ; um sinalizador R atual significa que a interface está sendo executada:

ifconfig -s eth0 | awk 'NR == 2 {if($NF !~ /R/ ) {exit 1}}'
% ifconfig -s                                              
Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
enp4s0f2   1500 0         0      0      0 0             0      0      0      0 BMU
lo        65536 0     18990      0      0 0         18990      0      0      0 LRU
wlp3s0f0   1500 0    600316      0      0 0        425756      0      0      0 BMRU
% ifconfig -s enp4s0f2 | awk 'NR == 2{if($NF !~ /R/) {exit 1}}'
1 % ifconfig -s wlp3s0f0 | awk 'NR==2 {if($NF !~ /R/) {exit 1}}'
% 

Assim, o teste poderia ser algo assim:

if ifconfig -s eth0 | awk 'NR == 2 {if($NF !~ /R/ ) {exit 1}}'; then
    # do the stuff that needs to be done when eth0 is not running
done
    
por kos 28.02.2016 / 23:24