Advertisement
Guest User

connect.sh

a guest
Oct 23rd, 2013
7,350
0
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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement