Vraag shellscript voor wifi-verbinding via terminal


Hoe schrijf je een shell-script dat interactieve stappen automatiseert om verbinding te maken met wifi via een terminal?

Stappen die worden beschreven in Hoe maak ik verbinding met een WPA wifi-netwerk via de opdrachtregel? met verdere details:

  1. voer script uit, vraag om ssid in te voeren
  2. ssid enter, vraag om een ​​wachtwoordzin in te voeren
  3. geretourneerde psk-hash genereert ssid + hash-uitvoer naar wpa_supplicant.conf
  4. stel de interface in om naar te luisteren en op de achtergrond uit te voeren
  5. verbinden met netwerk
  6. ifconfig wlan0 om de status te tonen
  7. vraag om nameservers in te voeren, schrijf script naar /etc/resolv.conf
  8. kwestie ping naar een domein uit en geef ctrl-c uit om het na een minuut of zo te stoppen

1
2018-03-27 22:43


oorsprong


waarom schrijf je zelf een script? Gebruik wicd-cli of iets dergelijks - Panther
um. . . weet je dat er ook is nmcli ? erg handig voor gebruik in de terminal, weet u. lees gewoon de man-pagina voor meer info. - Sergiy Kolodyazhnyy
Ik ben niet bekend met een van deze, kan je me alsjeblieft een voorbeeld laten zien? Het doel is dat het wordt gebruikt door niet-linux-personen, dus het kan geen handmatige opdrachttool zijn. Het systeem heeft geen desktopinterface. - Sean Lee
Hier ben je een voorbeeld. - Helio


antwoorden:


Ik heb dit gemaakt:

#!/bin/bash

## Restores the screen when the program exits.
trap "tput rmcup; exit"  SIGHUP SIGINT SIGTERM

## Saves the screen contents.
tput smcup

## Clears the screen.
clear

## Loop through available interfaces.
while read interface; do                    # While reads a line of the output
    i=$((i+1))                                  # Only God knows what does this (view note 1).
    type=$(cut -f2 -d ' ' <<< $interface)       # Saves the interface type to check if is wifi.
    status=$(cut -f3 -d ' ' <<< $interface)     # Saves the status of the current interface.
    interface=$(cut -f1 -d ' ' <<< $interface)  # Selects the INTEFACE field of the output.
    if [[ "$type" == "802-11-wireless" ]]; then # If is a WiFi interface then:
      interfaces[$i]=$interface                     # Adds the current interface to an array.
      echo "$i: $interface ($status)"               # Prints the name of current interface.
    fi                                          # Ends the if conditional
done < <(nmcli device | tail -n +2)         # Redirects the output of the command nmcli device to the loop.

## If there is only one interface
if [[ "$i" == "2" ]]; then
    iface=1 # Selected interface is the only one
    clear   # Quick and dirty workaround for make disappear the interface list.
else
    ## Prompts the user for the interface to use.
    read -p "Select the interface: " iface
fi

## If the entered number is valid then...
if [[ "$iface" -le $i ]]; then
    read -p "Enter the SSID or BSSID: " b_ssid # Prompts the user for the ESSID/BSSID
    read -p "Enter the password: " pass # Prompts the user for the password
    output=$(nmcli device wifi connect "$b_ssid" password "$pass" iface wlan0 --timeout 10) # Tries to connect
    wget -q --tries=5 --timeout=5 --spider http://google.com &> /dev/null # Is connected to Internet?
    if [[ $? -eq 0 ]]; then
            echo "You're connected." # Is connected to Internet
            exit 0
    else
            echo "Error. $output" # Anything goes wrong
            exit 1
    fi
else
    echo "Invalid interface entered. Exiting..."
    exit 2
fi

## Note 1: this line increments $i

3
2018-03-28 12:38



Bedankt voor het voorbeeld, maar zoals beschreven in mijn opmerking hierboven, is er geen bureaubladinterface op het systeem. nmcli vereiste glib, en niet de manier om te gaan. Het was mijn slechte om niet duidelijk te maken dat ik een voorbeeld nodig heb over het shellscript, niet over nmcli. - Sean Lee
Wat voor nut zou u dan gebruiken? is wpa_cli geïnstalleerd? - Helio