shell 脚本编程之信号捕捉和主机探测

shell 脚本编程之信号捕捉和主机探测shell

===============================================================================编程

概述:centos


===============================================================================api

主机探测

1.写一个脚本,探测192.168.0.0网段中主机在线状态安全

[root@centos7 bin]# cat ping.sh 
#!/bin/bash
#authoe:tao
#describtion:给定一个网络地址,并探测此网络中主机的在线状态,并统计出在线主机和离线主机的个数

read -p "请输入您的IP地址: " IP

declare -i i=0
declare -i j=0

address=$(echo $IP |egrep "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])")
arg3=$(echo $IP |cut -d. -f1-3).

if [[ -z "$IP" ]];then
	echo "At least one IPv4." && exit 1
elif [[ "$IP" == "$address" ]];then
	for arg4 in $(seq 100 110);do
		if ping -c1 -W1 $arg3$arg4 &> /dev/null ;then
			echo -e "$arg3$arg4\tup."
			let i++
		else
			echo -e "$arg3$arg4\tdown."
			let j++
		fi
	done
else
	echo "您输入的格式不正确,请从新输入!" && exit 2
fi

echo "在线主机的个数为:$i"
echo "不在线主机的个数为:$j"

#==================================================================================
[root@centos7 bin]# bash ping.sh 
请输入您的IP地址: 
At least one IPv4.

[root@centos7 bin]# bash ping.sh 
请输入您的IP地址: 192.168.1
您输入的格式不正确,请从新输入!

[root@centos7 bin]# bash ping.sh 
请输入您的IP地址: 192.168.1.0
192.168.1.100	up.
192.168.1.101	up.
192.168.1.102	up.
192.168.1.103	down.
192.168.1.104	down.
192.168.1.105	down.
192.168.1.106	up.
192.168.1.107	down.
192.168.1.108	down.
192.168.1.109	down.
192.168.1.110	down.
在线主机的个数为:4
不在线主机的个数为:7

2.写一个脚本探测 A类,B类,C类网络中主机的在线状态bash

# 以下定义的A,B,C三类网络探测的函数脚本,能够按需调用函数执行便可
[root@centos7 function]# cat hostping.sh 
#!/bin/bash
#

cping() {
	local i=1
	while [ $i -le 5 ];do
		if ping -c1 -W1 $1.$i &> /dev/null; then
			echo "$1.$i is up."
		else
			echo "$1.$i is down."
		fi
		let i++
	done
}

bping() {
	local j=0
	while [ $j -le 5 ];do
		cping $1.$j
		let j++
	done
}

aping() {
	local k=0
	while [ $k -le 5 ];do
		bping $1.$k
		let k++
	done
}

aping 10
bping 172.16
cping 192.168.1

信号捕捉

 1.定义和功能:
网络

列出信号:ide

  • trap -l函数

  • kill -lui

获取帮助:

  • man 7 single

每一个信号有三种表示方式:

  • 信号的数字标识;如 1

  • 信号的完整名称; SIGHUB

  • 信号的简写名称;如 HUB

经常使用的信号:

  • SIGHUP,1:无须从新启动进程而让其重读配置文件,并生效;

  • SIGINT,2:打断正在运行的进程;至关于Ctrl+c;

  • SIGKILL,9:强行终止(杀死)正在运行的进程;

  • SIGTERM,15:安全终止正在运行的进程;

  • SIGCONT,18:继续运行指定的进程;

  • SIGSTOP,19:暂停进程;

trap命令用法:

语法:

  • trap 'COMMAND' SINGLE

经常使用来捕捉的信号:

  • HUB ,INT

演示:

1.列出全部信号

[root@centos7 function]# kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	
[root@centos7 function]# trap -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

2.trap 命令 在接受到 INT信号时,就会执行定义的命令和参数

[root@centos7 bin]# cat trap.sh
#!/bin/bash
#

trap 'echo "逗你玩!!!"' INT

for i in {100..250};do
	ping -c1 -W1 192.168.1.$i
done 

# 执行结果以下:即每次执行 Ctrl+c 都会发送INT 信号,因此都会显示信息,
PING 192.168.1.247 (192.168.1.247) 56(84) bytes of data.
^C
--- 192.168.1.247 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

逗你玩!!!
PING 192.168.1.248 (192.168.1.248) 56(84) bytes of data.
^C
--- 192.168.1.248 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

逗你玩!!!

#=========================================================================
# 为了避免使如上的循环一直执行下去,咱们能够传送 exit 命令,即脚本只要已收到INT信号就执行 Quit 并退出
[root@centos7 bin]# cat trap.sh
#!/bin/bash
#

trap 'echo "Quit";exit 1' INT

for i in {100..250};do
	ping -c1 -W1 192.168.1.$i
done

3.在接收到INT信号时,由于命令尚未结束,可是又想把命令产生的文件删除,则能够定义一个函数,在使用 trap 命令时直接调用函数便可,示例以下:

[root@centos7 bin]# cat trap.sh 
#!/bin/bash
#

mytrp() {
	echo "Quit"
	rm -f ${hostmpfiles[*]}
	exit 1
}

declare -a hosmpfiles

trap 'mytrp' INT

for i in {100..250};do
	tmpfile=$(mktemp /tmp/ping.XXXXXX)
	if ping -c1 -W1 192.168.1.$i &> /dev/null; then
		echo "192.168.1.$i is up" |tee $tmpfile
	else
		echo "192.168.1.$i is down" |tee $tmpfile
	fi
	hostmpfiles[${#hostmpfiles[*]}]=$tmpfile
done

rm -f ${hostmpfiles[*]}
相关文章
相关标签/搜索