SHARE
TWEET

connect.sh

a guest Oct 23rd, 2013 2,534 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/bin/bash
  2.  
  3. # 23/10/2013
  4. # This script attempts to semi-automate / automate the wifi connection
  5. # process from the command line.
  6. # It is intended to be used on a headless machine without the
  7. # requirement of typing several commands for a connection.
  8. # The script stores previous connection credentials in PLAINTEXT as
  9. # *.wpa files in the executed directory and in /etc/wpasupplicant.conf.
  10. # These .wpa files are used to connect to several different AP using
  11. # previously stored info.
  12. # Probably a good idea to stop and other network managing software while
  13. # running this script, also in testing wpa_supplicant does a pretty good
  14. # job of re-connecting a disassociated link automatically.
  15. #
  16. # Mainly created from a combination of scripts taken from theses two
  17. # sources:
  18. # http://www.backtrack-linux.org/forums/archive/index.php/t-3367.html
  19. # AND
  20. # http://www.linuxquestions.org/questions/linux-general-1/wifi-connect\
  21. # -script-tested-in-ubuntu-772646/
  22. #
  23. # old version 1  http://pastebin.com/Pa90HBiU  01/06/2013
  24. #       very simple first version
  25. # old version 2  http://pastebin.com/FzJnv5Nk  02/06/2013
  26. #       minor additions
  27. # old version 3  http://pastebin.com/3mu1XT5Y  08/06/2013
  28. #       included ability to call up previous saved files from
  29. #       command line.  Some checking of command line parameters and
  30. #       checking for empty saved files
  31. # old version 4
  32. #       Added exit return values
  33. # Current version 5
  34. #       Removal of cleanslate function.  Capitalising of function names.
  35. #       Renaming of some function names.
  36. #       Addition of random_config to randomly select a previously saved
  37. #       config files, check for internet access and keep trying another
  38. #       connections if internet access is not made.  Can be used in
  39. #       conjunction with -f to initially select a conf_file of your choice.
  40. #       Improved program feedback and internet access checking.
  41. #
  42. # This script uses the following commands: find, printf, iwlist, awk,
  43. # cat, kill, ps, grep, xargs, iwconfig, dhclient, wpa_supplicant, curl.
  44. #
  45. # Copy, Distribute and Modify Freely.
  46. #
  47.  
  48.  
  49. ########################################################################
  50. ######################## FUNCTIONS #####################################
  51.  
  52. function HELP (){
  53.         HELP_MESSAGE="$1"
  54.         if [ "$HELP_MESSAGE" ]; then
  55.                 printf "$HELP_MESSAGE"
  56.         fi
  57.         printf "Usage: $0 -i [INTERFACE] OR AND -f [CONF_FILE.wpa] -r (RANDOM_CONF_MODE)\n"
  58. }
  59.  
  60.  
  61. function CHECK_ARGS () {
  62.         #
  63.         # Define Globals
  64.         #
  65.         INET_AVAIL=0
  66.         RANDOM_CONF_MODE=0
  67.         RANDOM_FIRST_RUN=0
  68.         CONF_FILE=""
  69.         INT=""
  70.  
  71.         if [ -z "$1" ]; then
  72.         HELP
  73.         exit 1
  74.         fi
  75.  
  76.         while getopts  "i:f:r" opt
  77.                 do
  78.                         case $opt in
  79.                                 i ) INT=${OPTARG};;
  80.                                 f ) CONF_FILE=${OPTARG};;
  81.                                 r ) RANDOM_CONF_MODE=1;;
  82.                                 \?) HELP
  83.                                         exit 1;;
  84.                                 * ) HELP
  85.                                         exit 1;;
  86.                         esac
  87.                 done
  88.  
  89.         #
  90.         # check if root
  91.         #
  92.         if [ "$(id -u)" != "0" ]; then
  93.                 HELP "This script must be run as root\n"
  94.                 exit 1
  95.         fi
  96.  
  97.         #
  98.         # check if interface is entered as command line argument
  99.         #
  100.         if [ -z "$INT" ]; then
  101.                 HELP
  102.                 exit 1
  103.         fi
  104.  
  105.         #
  106.         # Check if interface entered exists
  107.         #
  108.         if [ ! -e /sys/class/net/$INT ]; then
  109.                 HELP "Network Interface $INT does not exist\n"
  110.                 exit 1
  111.         fi
  112.  
  113.         #
  114.         # If random mode selected, check if wpa files are available
  115.         #
  116.         if [ $RANDOM_CONF_MODE -eq 1 ]; then
  117.                 local WPA_FILES=$(find . -type f -name "*.wpa" | wc -l)
  118.                 if [ "$WPA_FILES" -eq 0  ]; then
  119.                         HELP "No *.wpa files exist for RANDOM_CONF_MODE\n"
  120.                         exit 1
  121.                 fi
  122.         fi
  123. }
  124.  
  125.  
  126. function PINGCHECK (){
  127.         #
  128.         # Check for an internet connection using curl to download from a
  129.         # FQDN. 5 Second timeout.
  130.         # Ref: superuser.com/questions/545865/how-to-check-if-internet-\
  131.         # connection-is-available-via-terminal/625888
  132.         #
  133.         printf "Checking for internet access...\n"
  134.         curl --interface $INT -o /dev/null -m 5 -s http://www.google.com
  135.         if [[ $? == 0 ]]; then
  136.                 INET_AVAIL=1
  137.         else
  138.                 #
  139.                 # Check again for internet access
  140.                 #
  141.                 printf "Rechecking for internet access...\n"
  142.                 curl --interface $INT -o /dev/null -m 5 -s http://www.google.com
  143.                 if [[ $? == 0 ]]; then
  144.                         INET_AVAIL=1
  145.                 else
  146.                         INET_AVAIL=0
  147.                 fi
  148.         fi
  149. }
  150.  
  151.  
  152. function READ_SAVED (){
  153.         #
  154.         # Accepts a filename argument to read a saved file.  Also can search
  155.         # or use previous saved
  156.         # wpa configuration files.  Will automatically bypass new config
  157.         # prompting if RANDOM_CONF_MODE
  158.         # is being used.
  159.         # Filename checking involves testing file is greater than zero
  160.         # length and exists
  161.         # before writing the configuration to wpa_supplicant.conf
  162.         #
  163.  
  164.         local CONF_FILE=$1
  165.  
  166.         if [ $RANDOM_CONF_MODE -eq 0 ]; then
  167.                 if [ -n "$CONF_FILE" ]; then
  168.                         if [ -s "$CONF_FILE" ]; then
  169.                                 printf "File $CONF_FILE exists, proceeding to connect\n"
  170.                                 WRITE_CONF "$CONF_FILE"
  171.                                 exit 0
  172.                         else
  173.                                 printf "File $CONF_FILE is invalid or does not exist\n"
  174.                                 CONF_CREATE
  175.                                 exit 0
  176.                         fi
  177.                 fi
  178.         else
  179.                 if [ -n "$CONF_FILE" ]; then
  180.                         if [ -s "$CONF_FILE" ]; then
  181.                                 WRITE_CONF "$CONF_FILE"
  182.                                 exit 1
  183.                         else
  184.                                 printf "File $CONF_FILE is invalid or does not exist\n"
  185.                                 RANDOM_CONF
  186.                                 exit 1
  187.                         fi
  188.                 else
  189.                         RANDOM_CONF
  190.                         exit 1
  191.                 fi
  192.         fi
  193.  
  194.         #
  195.         # Save and change IFS so spaces in file names are not interpreted as
  196.         # separate lines in the array
  197.         #
  198.         OLDIFS=$IFS
  199.         IFS=$'\n'
  200.  
  201.         #
  202.         # Read all file names into an array
  203.         # ref:http://www.cyberciti.biz/tips/handling-filenames-with-spaces-\
  204.         # in-bash.html
  205.         #
  206.         # " -printf '%f\n' " removes path info from outputs
  207.         #
  208.         # ref:http://serverfault.com/questions/354403/remove-path-from-find\
  209.         # -command-output
  210.         #
  211.         SAVED_LIST=($(find . -type f -name "*.wpa" -printf '%f\n'))
  212.  
  213.         #
  214.         # restore ifs
  215.         #
  216.         IFS=$OLDIFS
  217.  
  218.         #
  219.         # Tests for number of saved wifi connections, if none exit
  220.         #
  221.         if [ -z "${SAVED_LIST[0]}" ]; then
  222.                 printf "There are no previous saved wifi connections\n"
  223.                 #
  224.                 # Create new connection
  225.                 #
  226.                 CONF_CREATE
  227.                 exit 0
  228.         fi
  229.  
  230.         #
  231.         #PS3 Sets the prompt for the select statement below
  232.         #
  233.         PS3="Choose a previously saved wifi connection or 's' to skip: "
  234.  
  235.         #
  236.         # Select one of the previous saved configurations to connect with or
  237.         # quit
  238.         #
  239.         select CONF_FILE in "${SAVED_LIST[@]}"; do
  240.                 #
  241.                 # Quit if selected number does not exist
  242.                 #
  243.                 if [ -z "$CONF_FILE" ] ; then
  244.                                 printf "Skipping\n\n"
  245.                                 PS3=""
  246.                                 CONF_CREATE
  247.                                 exit 0
  248.                 fi
  249.                 #
  250.                 # Quick check if file is greater than zero length and exists
  251.                 #
  252.                 if [ -s "$CONF_FILE" ]; then
  253.                         printf "File $CONF_FILE exists, proceeding to connect\n"
  254.                         PS3=""
  255.                         WRITE_CONF "$CONF_FILE"
  256.                         exit 0
  257.                         else
  258.                         printf "File $CONF_FILE is invalid or does not exist, proceeding to create a new configuration\n"
  259.                         PS3=""
  260.                         CONF_CREATE
  261.                         exit 0
  262.                 fi
  263.         done
  264. }
  265.  
  266.  
  267. function RANDOM_CONF (){
  268.         #
  269.         # This function randomly select a previously saved config files,
  270.         # check for internet access and keep trying another
  271.         # connections if internet access is not made.  If and internet
  272.         # connection is not found, it tries another
  273.         # connection.  Could be used as a faiover by specifying -f as your
  274.         # initial preferred network.
  275.         #
  276.  
  277.         local CONF_FILE=$1
  278.  
  279.         #
  280.         # Test to check if RANDOM_FIRST_RUN is 1.  If so then proceed to
  281.         # connect using the config file specified first.
  282.         #
  283.         if [ $RANDOM_FIRST_RUN -eq 1 ]; then
  284.                 RANDOM_FIRST_RUN=0
  285.                 READ_SAVED "$CONF_FILE"
  286.         fi
  287.  
  288.         #
  289.         # Test if INET_AVAIL is 1, initial value is 0 and if connection is
  290.         # good then it is 1.  Used to loop and recheck for
  291.         # a internet connection.  If there is no connection then it go to
  292.         # the random config selection.
  293.         #
  294.  
  295.         if [ $INET_AVAIL -eq 1 ]; then
  296.                 #
  297.                 # Sleep for a random period of 600 to 900 seconds
  298.                 #
  299.                 sleep $(((RANDOM % 300)+600))
  300.                 PINGCHECK
  301.                 RANDOM_CONF
  302.         else
  303.                 OLDIFS=$IFS
  304.                 IFS=$'\n'
  305.                 CONF_FILE=($(find . -type f -name "*.wpa" -printf '%f\n'|sort -R |tail -1))
  306.                 IFS=$OLDIFS
  307.                 READ_SAVED "$CONF_FILE"
  308.         fi
  309.         exit 1
  310. }
  311.  
  312.  
  313. function CONF_CREATE (){
  314.         #
  315.         # This is a user entry prompt function, used to create new config
  316.         # files.
  317.         #
  318.  
  319.         #
  320.         # Scans for wifi connections & isolates wifi AP name
  321.         #
  322.         eval LIST=( $(iwlist $INT scan 2>/dev/null | awk -F":" '/ESSID/{print $2}') )
  323.  
  324.         #
  325.         #PS3 Sets the prompt for the select statement below
  326.         #
  327.         PS3="Choose a new ESSID to create a connection or 'q' to quit: "
  328.  
  329.         #
  330.         # Tests for number of wifi connections, exits if none
  331.         #
  332.                 if [ -z "${LIST[0]}" ]; then
  333.                         printf "No available wifi connection using $INT\n"
  334.                         exit 1
  335.                 fi
  336.  
  337.         #
  338.         # Select from a LIST of scanned connections
  339.         #
  340.         select CONF_FILE in "${LIST[@]}"; do
  341.  
  342.                 #
  343.                 # Quit if selected number does not exist or alpha in entered
  344.                 #
  345.                 if [ -z "$CONF_FILE" ] ; then
  346.                                 printf "Exiting\n"
  347.                                 exit 0
  348.                 fi
  349.  
  350.                 #
  351.                 # Get user input for passphrase no need to escape spaces
  352.                 #
  353.                 printf "Enter the passphrase for $CONF_FILE?\n"
  354.                 read "PASSPHRASE"
  355.  
  356.                 #
  357.                 # Append the CONF_FILE variable (ESSID) to .wpa to make a
  358.                 # filename for saved configs
  359.                 #
  360.                 FILENAME=$CONF_FILE".wpa"
  361.  
  362.                 #
  363.                 # Run wpa_passphrase to generate a file for wpa_supplicant to
  364.                 # use, store it locally and in etc/wpa_supplicant.conf
  365.                 #
  366.                 printf "Running wpa_passphrase\n"
  367.                 wpa_passphrase "$CONF_FILE" "$PASSPHRASE" > "$FILENAME" | xargs
  368.                 #
  369.                 # Jump to WRITE_CONF function, append configuration filename
  370.                 # to CONF_FILE variable
  371.                 #
  372.  
  373.                 PS3=""
  374.                 WRITE_CONF "$FILENAME"
  375.                 exit 1
  376.         done
  377. }
  378.  
  379.  
  380. function WRITE_CONF (){
  381.  
  382.         local CONF_FILE=$1
  383.         #
  384.         # Copy local wpa_supplicant file to etc/wpa_supplicant.conf
  385.         #
  386.         printf "Writing new configuration file using $CONF_FILE\n"
  387.         cat "$CONF_FILE">/etc/wpa_supplicant.conf | xargs
  388.         #
  389.         # Jump to connect function, pass on the ESSID variable for connection
  390.         #
  391.         CONNECT "$CONF_FILE"
  392.         exit 1
  393. }
  394.  
  395.  
  396. function CONNECT (){
  397.         #
  398.         # Capture first incoming argument as SSID
  399.         #
  400.         local ESSID=$1
  401.  
  402.         #
  403.         # Kill previous instances of wpa_supplicant to stop other instances
  404.         # wpa_supplicant fighting several different AP's
  405.         # Kill based on
  406.         # ref: http://thegeekstuff.com/2011/10/grep-or-and-not-operators
  407.         # and
  408.         # http://stackoverflow.com/questions/3510673/find-and-kill-a-\
  409.         # process-in-one-line-using-bash-and-regex
  410.         #
  411.         # Release dhcp ip's and bring down the interface
  412.         #
  413.         kill $(ps aux | grep -E '[w]pa_supplicant.*\'$INT'' |  awk '{print $2}') 2>/dev/null | xargs
  414.         dhclient $INT -r
  415.         ifconfig $INT down
  416.  
  417.         #
  418.         # Assign new credentials to config file
  419.         #
  420.         iwconfig $INT mode managed essid "$ESSID"
  421.         printf "Configured interface $INT; Config file is $ESSID\n"
  422.         ifconfig $INT up
  423.         printf "Interface $INT is up\n"
  424.         wpa_supplicant -B -Dwext -i$INT -c/etc/wpa_supplicant.conf 2>/dev/null | xargs
  425.         printf "wpa_supplicant running, sleeping for 15...\n"
  426.  
  427.         #
  428.         # Wait to connect before asking for a ip address
  429.         #
  430.         sleep 15
  431.         printf "Running dhclient\n"
  432.         dhclient $INT
  433.  
  434.         #
  435.         # Print current ip for interface to screen
  436.         #
  437.         ifconfig $INT | grep inet
  438.  
  439.         #
  440.         # Check if internet is available and print status to screen
  441.         #
  442.         sleep 5
  443.         PINGCHECK
  444.         if [ $INET_AVAIL -eq 1 ]; then
  445.                 printf "Internet is available on this connection\n"
  446.         else
  447.                 printf "Internet is unavailable on this connection\n"
  448.         fi
  449.  
  450.         if [ $RANDOM_CONF_MODE -eq 1 ]; then
  451.         RANDOM_CONF
  452.         fi
  453.  
  454.         exit 0
  455. }
  456.  
  457. ########################################################################
  458. ######################## START HERE ####################################
  459.  
  460. #
  461. # Call check args function to check the command line argument supplied are valid.
  462. #
  463. CHECK_ARGS "$@"
  464.  
  465. #
  466. # Check if RANDOM_CONF_MODE is selected and/or config file specified,
  467. # routes to correct function set
  468. # with file name arguments or no arguments depending on what is specified.
  469. #
  470. if [ $RANDOM_CONF_MODE -eq 1 ]; then
  471.         if [ "$CONF_FILE" ]; then
  472.                 RANDOM_FIRST_RUN=1
  473.                 RANDOM_CONF "$CONF_FILE"
  474.         else
  475.         RANDOM_CONF
  476.         fi
  477. else
  478.         if [ "$CONF_FILE" ]; then
  479.                 READ_SAVED "$CONF_FILE"
  480.         else
  481.                 READ_SAVED
  482.         fi
  483. fi
  484.  
  485. exit 0
RAW Paste Data
Top