Vraag Bash wifi / lan management


Op het werk heb ik toegang tot internet, maar het is alleen beschikbaar via ethernet. Dit is prima voor mijn laptop (met XUbuntu 13.10 32-bit), maar als het gaat om mijn andere apparaten ... niet zozeer. Dus wat ik moet doen is mijn laptop inpluggen en vervolgens Network Manager instellen op 'Nieuw wifi-netwerk maken ...' Dit is allemaal goed en wel, en het krijgt de andere apparaten online, maar ik wil graag automatiseren dit proces een beetje.

Wat ik zou willen doen is een bash-script instellen om bij het opstarten uit te voeren (dit deel kan ik zonder hulp doen) om de volgende pseudocode uit te voeren:

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

Nu een paar opmerkingen hier voordat ik verder ga. Ten eerste begrijp ik dat WEP onveilig is, maar in mijn geval is het noodzakelijk omdat de andere apparaten in kwestie WPA / WPA2 niet zo sierlijk of helemaal niet verwerken. Ten tweede besef ik ook dat er waarschijnlijk een manier is om dit binnen Network Manager te doen, maar ik zou dit graag in Bash doen (niet alleen om het draagbaarder te maken voor toekomstige laptops, maar ook om meer te leren over Bash-scripting)

Nu, terug naar onze code. De eerste regel is de eenvoudigste:

#!/bin/bash

De volgende is onze lus om dit script op de achtergrond te laten draaien om die ethernet-verbinding in de gaten te houden, en wel eens per minuut om te voorkomen dat ik een van mijn CPU's overbelast:

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

Nu komt het gedeelte waar ik hulp bij nodig heb, de logica die de ethernet-verbinding controleert en het [Foo] -netwerk naar behoefte creëert / vernietigt. Om de status van de netwerkverbinding te controleren, had ik er even over nagedacht

ifconfig | grep eth0

Maar deze uitvoer geeft mij niet de vereiste 'ben ik verbonden'-informatie. Zonder de grep kan ik prima zien of het wel of niet werkt, maar het voor een voorwaardelijke in Bash ontleden is een ander verhaal. Wat betreft het daadwerkelijk verwijderen of opzetten van een netwerk met ifconfig in plaats van de netwerkbeheerder, is ook dit een klein mysterie voor mij. Om het even welke ideeën over hoe ik deze functionaliteit kon uitvoeren?

Zoals altijd bedankt voor alle constructieve input.


1
2018-02-28 21:57


oorsprong


Ik betwijfel ten zeerste of dit haalbaar zal zijn - NetworkManager en dergelijke houden er niet van om aardig te spelen met dit type doel - Thomas Ward♦
Met ifconfig controleert u uw eeuwige adapter. Met ethtool <if> kunt u uw verbinding controleren. - Underscore


antwoorden:


ifconfig -s <interface> zal een mooi opgemaakte (en gemakkelijk te parsen) uitvoer afdrukken:

% 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

Je zou het aan AWK kunnen doorgeven en de uitgangstatus van de pijp kunnen manipuleren volgens de Flg veld; een cadeau R vlag betekent dat de interface actief is:

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}}'
% 

Dus de test kan ongeveer zo zijn:

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

0
2018-02-28 22:24