实战演练
本节将展示一个实用脚本,该脚本在处理用户输入的同时,使用 ping 命令或 ping6 命令来测试与其他网络主机的连通性。
ping 命令或 ping6 命令可以快速测试网络主机是否可用。这个命令很有用,经常作为首选工具。如果只是检查单个主机,那么直接使用该命令即可。
但是如果有数个甚至数百个主机需要检查,则 shell 脚本可以助你一臂之力。
这个脚本通过两种方法来选择要检查的主机:一是使用命令行选项,二是使用文件。下面是
该脚本在 Ubuntu 系统中使用命令行选项的用法演示:
$ ./CheckSystems.sh -t IPv4 192.168.1.102 192.168.1.104
Checking system at 192.168.1.102...
[...]
--- 192.168.1.102 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss,[...]
Checking system at 192.168.1.104...
[...]
--- 192.168.1.104 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss,[...]
$
如果没有指定 IP 地址参数,则脚本会提示用户并退出:
$ ./CheckSystems.sh -t IPv4
IP Address(es) parameters are missing.
Exiting script...
$
$ cat CheckSystems.sh
#!/bin/bash
# Check systems on local network allowing for
# a variety of input methods.
#
#
########### Determine Input Method ###################
#
# Check for command-line options here using getopts.
# If none, then go on to File Input Method
#
while getopts t: opt
do
case "$opt" in
t) # Found the -t option
if [ $OPTARG = "IPv4" ]
then
pingcommand=$(which ping)
#
elif [ $OPTARG = "IPv6" ]
then
pingcommand=$(which ping6)
#
else
echo "Usage: -t IPv4 or -t IPv6"
echo "Exiting script..."
exit
fi
;;
*) echo "Usage: -t IPv4 or -t IPv6"
echo "Exiting script..."
exit;;
esac
#
shift $[ $OPTIND - 1 ]
#
if [ $# -eq 0 ]
then
echo
echo "IP Address(es) parameters are missing."
echo
echo "Exiting script..."
exit
fi
#
for ipaddress in "$@"
do
echo
echo "Checking system at $ipaddress..."
echo
$pingcommand -q -c 3 $ipaddress
echo
done
exit
done
#
########### File Input Method ###################
#
echo
echo "Please enter the file name with an absolute directory reference..."
echo
choice=0
while [ $choice -eq 0 ]
do
read -t 60 -p "Enter name of file: " filename
if [ -z $filename ]
then
quitanswer=""
read -t 10 -n 1 -p "Quit script [Y/n]? " quitanswer
#
case $quitanswer in
Y | y) echo
echo "Quitting script..."
exit;;
N | n) echo
echo "Please answer question: "
choice=0;;
*) echo
echo "No response. Quitting script..."
exit;;
esac
else
choice=1
fi
done
#
if [ -s $filename ] && [ -r $filename ]
then
echo "$filename is a file, is readable, and is not empty."
echo
cat $filename | while read line
do
ipaddress=$line
read line
iptype=$line
if [ $iptype = "IPv4" ]
then
pingcommand=$(which ping)
else
pingcommand=$(which ping6)
fi
echo "Checking system at $ipaddress..."
$pingcommand -q -c 3 $ipaddress
echo
done
echo "Finished processing the file. All systems checked."
else
echo
echo "$filename is either not a file, is empty, or is"
echo "not readable by you. Exiting script..."
fi
#
#################### Exit Script #####################
#
exit
$