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