shell script para conexão wifi via terminal

1

Como escrever um script de shell que automatizará as etapas interativas para se conectar ao Wi-Fi via terminal?

Etapas descritas em Como eu me conecto a uma rede Wi-Fi WPA usando a linha de comando? com mais detalhes:

  1. execute o script, peça para inserir o ssid
  2. ssid digite, peça para digitar a senha
  3. o hash do psk retornou, gere a saída ssid + hash para o wpa_supplicant.conf
  4. defina a interface para ouvir e executar em segundo plano
  5. conectar-se à rede
  6. ifconfig wlan0 para mostrar o status
  7. peça para inserir os servidores de nomes, escreva o script em /etc/resolv.conf
  8. emitem ping para um domínio e emitem ctrl-c para interrompê-lo após um minuto ou mais
por Sean Lee 27.03.2015 / 23:43

1 resposta

3

Eu fiz isso:

#!/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
    
por Helio 28.03.2015 / 13:38