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[*]}
相關文章
相關標籤/搜索