1.捕捉信号(trap 命令)
常用信号 :
ctrl+c (终止进程)
ctrl +z (暂停进程)
[root@base1 mnt]# stty -a # 列出中断信号与键盘的关系
2.信号屏蔽
trap “” 2 # 把2信号置空,即屏蔽信号2
trap : 2 # 撤销屏蔽
[root@base1 mnt]# trap " " 2 # 屏蔽信号2,当再次按ctrl+c时不生效
[root@base1 mnt]# trap : 2 # 取消屏蔽
[root@base1 mnt]# ^C # ctrl+C又重新生效
练习:写一个信号屏蔽的脚本
[root@base1 mnt]# vim siginal_01.sh
#!/bin/bash
trap "echo 'sorry! I have trapped Ctrl+C' " 2
echo "This is a test script ..."
count=1
while [ $count -le 5 ]
do
echo "Loop hello$count"
sleep 2
count=$[ $count + 1 ]
done
echo "This is the end of the script..."
[root@base1 mnt]# sh siginal_01.sh
3.捕捉脚本的退出
xargs # 获取上一条命令结果全部输出到一行
练习:先自动建立文件,然后用ctrl+c全部删除建立的文件
[root@base1 mnt]# vim siginal_02.sh
#!/bin/bash
trap "find /tmp -path */westos* | xargs rm -fr && exit " 2
while true
do
touch /tmp/westos_$(date +%F-%H:%M:%S)
sleep 2
ls -l /tmp/westos*
done
[root@base1 mnt]# sh siginal_02.sh
[root@base1 mnt]# ls /tmp # 查看到以westos开头的文件全部都被删除
练习:写一个跳板机的脚本,当连接我的主机不是我允许的主机时,设定那个主机跳转到规定界面,干我只允许干的事情,当连接我的主机是我允许连接的主机时,可以任意操作我的电脑
[root@base1 mnt]# vim tiaoban.sh
#!/bin/bash
function trapper() {
trap "" INT EXIT TSTP TERM HUP
}
function main() {
while true
do
trapper
clear
cat <<menu
\033[036m 1 172.25.254.178 \033[0m
\033[032m 2 172.25.254.188 \033[0m
\033[033m 3 退出 \033[0m
menu
read -p "please input a letter:" a
case $a in
1)
echo "login in 172.25.254.178"
ssh [email protected]
;;
2)
echo "login in 172.25.254.188"
ssh [email protected]
;;
3)
exit 0
;;
esac
done
}
main
[root@base1 profile.d]# cd /etc/profile.d # 必须切换到此目录里 ,当我的电脑被别人连接时,会自动执行这个目录里的所有脚本
[root@base1 profile.d]# vim user_check.sh
#!/bin/bash
[ $UID -ne 0 ]&& sh /mnt/tiaoban.sh
练习2:编写脚本,使得连接本机失败次数大于三次的主机IP直接加入到本机的黑名单里
[root@base1 mnt]# vim ssh_check.sh
#!/bin/bash
function fun() {
cat /var/log/secure | awk -F " " '{print $6,$11}' >> /mnt/file
sort -n file | uniq -cd | awk ' {if($1>=3 && $2=="Failed") {print $3}}' >> /mnt/fil e1 # 截取失败的行和失败的次数
cat file1 | while read line
do
a=$line # 遍历文件
grep $a /etc/hosts.deny >& /dev/null # 判断遍历出来的内容是否已经存在文件中
if [ $? -gt 0 ];then # 如果不存在,就把遍历出来的内容写入黑名单里
echo "sshd:$a" >> /etc/hosts.deny
fi
done
}
fun
先用其他主机错误连接超过3次以上
[root@base1 mnt]# > /etc/hosts.deny # 清空黑名单
[root@base1 mnt]# sh ssh_check.sh # 执行脚本
[root@base1 mnt]# cat /etc/hosts.deny # 查看黑名单,成功加入
sshd:172.25.254.188
sshd:172.25.254.78
再次用其他主机去连接,连接不上