====== Use Shell Scripting To Automate System Maintenance Tasks ====== **General Information** Review of common shell scripting syntax. ---- ====== Lab Setup ====== The following virtual machines will be used: * server1.example.com (192.168.1.150) -> Create and test some scripts ---- ====== Help ====== Finding help in this section. * Not many references. Be comfortable with basic bash scripting * Variables * Arguments * Input * Output * Decisions (if statements, case) * Loops ---- ====== General Layout ====== General bash script layout #!/bin/bash echo "Hello world" exit 0 ---- ====== Arguments ====== Sending and parsing arguments to scripts. #!/bin/bash echo "The first argument is: $1" echo "The second argument is: $2" echo "There are $# total arguments." echo "All of the arguments are: $@" # Loop through arguments one at a time for myarg in $@; do echo "Argument is: $myarg" done ---- ====== Getting User Input ====== User input with the read command #!/bin/bash # If there is no argument passed, prompt for input if [ -z $1 ]; then echo "Enter something: " read myname else # There is an argument, use that myname=$1 fi echo "You entered: $myname" exit 0 ---- ====== Conditionals ====== If/else conditional testing if [ -f $1 ]; then echo "Argument is a file" elif [ -d $1 ]; then echo "Argument is a directory" else echo "Argument is something else..." fi exit 0 \\ Logical operators # Logical AND: If first command is true, execute second command [ -f $1 ] && echo "This is a file" # Logical OR: If first command is true, do not execute second command [ -f $1 ] || echo "This is not a file" ---- ====== Loops ====== Iterating through data. ===== For Loops ===== Useful for processing ranges of information. Specific amount of iterations for (( count=1; count <= 100; count++ )); do echo "The count is: $count" done exit 0 \\ Unknown iterations through a range of data for node in $(cat system_list.txt); do ssh $node "uptime" done \\ Range of numbers for number in {100..200}; do ping -c 1 192.168.1.$number > /dev/null && echo "192.168.1.$number is up" done ===== While Loops ===== While loops are useful for monitoring something or to repeat something forever and break under certain conditions. \\ Loop infinitely # Keep checking to see if a specific host is up (the first argument to the script) while true; do ping -c 1 $1 # if the last command (ping) returns successful (0 exit code) if [[ $? -eq 0 ]]; then echo "$1 is up" exit 0 else sleep 5 fi done \\ Monitor a process # While output results are true, go back to sleep while ps aux | grep $1 | grep -v grep; do sleep 5 done # Mail when no results from ps (process stopped) echo "The process($1) is no longer running." | mail -s "Process $1 stopped" root ===== Case Evaluation ===== Evaluate data and provide matches for expected values. case $1 in start) start_program ;; stop) stop_program ;; status) status_of_program ;; *) echo "Usage: $0 (start|stop|status)" ;; esac ---- ====== Debugging ====== To debug a script, execute it with a special argument: bash -x myscript.sh * -x -> Shows line by line what the script is doing, which allows easier debugging when it breaks ----