场景1:公司新招聘了一个配置管理员,他的工作是负责将公司开发人员写的新代码依次分发到办公室测试环境、IDC测试环境和正式线上环境。因此公司需要开发一个程序,当配置管理员登录服务器,只能进入分发的管理界面,无法进行其他操作或直接进入bash界面。
场景2:公司有大量的服务器,我们不能让每个人用root用户登录服务器,这样很危险。但我们又不能再每一台服务器上为所有人创建登录账户,这样管理起来非常繁琐,于是就有一种叫做跳板机或堡垒机的解决方案。
我们可以用shell脚本实现上面的功能,但通常shell脚本有一个不是bug的bug。平时我们执行脚本时发现有什么问题时,就会用ctrl+c强制终止脚本。但是上面的场景中我们可不希望自己的shell脚本在运行中被其他用户使用快捷键之类进入到bash界面,做我们不希望做的事情,这里就引出了我们接下来介绍的信号处理。
查看系统信号:
使用kill –l或trap –l都可以列出linux系统的信号名称:
trap信号处理:是内置命令,用于在接收到信号后将要采取的行动,常见用途在脚本被中断时完成清理工作。
trap命令:
trap -l 把所有信号打印出来
trap -p 把当前的trap设置打印出来
trap “” signals =====>为空表示这个信号失效。
trap “commands”signals ======>收到signals指定的信号时,信号功能复位同时执行commands命令
trap signals =====>没有命令部分,信号复原
常用信号:
在使用信号名时需要省略SIG前缀,通常我们需要忽略的信号有HUP INT QUIT TSIP TERM,也就是信号1,2,3,15,20。
用stty -a 可以列出中断信号与键盘的对应。
trap命令测试:
测试:同时处理多个信号
注意:TSTP(20)命令没有显示出来,但在脚本就可以显示。
我们也可以用字母来创建信号的:
信号名不能直接批量取消的
trap “:” HUP INT QUIT TSTP TERM 等价于trap HUP INT QUIT TSTP TERM
:也是一个内置命令
例如:写循环程序是可以这么写
while :
do uptimesleep 1
done
注:历史上,shell总是用数字来代替信号,而新的脚本程序应该使用信号的名字。
linux信号的生产应用案例:
测试1:触发信号后清理/tmp下以bqh_开头的文件
[root@bqh-118 scripts]# vim tarp1.sh
#!/bin/sh
# ******************************************************
# Author : a?锦衣卫
# Last modified: 2019-05-09 22:37
# Email : 1147076062@qq.com
# blog : https://www.cnblogs.com/su-root
# Filename : tarp1.sh
# Description :
# ******************************************************
trap "find /tmp -type f -name 'bqh_*'|xargs rm -f && exit" INT
while :dotouch /tmp/bqh_$(date +%F_%T)sleep 1
done
注:执行脚本前用watch ls 监控一下状态
测试二:shell跳板机(触发信号后屏蔽信号)
① 首先做好ssh key验证或使用expect脚本
② 实现传统的远程连接菜单选择脚本
③ 利用linux信号防止用户在跳板机上操作
④ 用户登录后调用脚本
ssh免密钥登录:
ssh-keygen –t dsa –P ‘’ –f ~/.ssh/id_dsa #这种格式不用交互,可以man ssh-keygen
ssh-copy-id –I .ssh/id_dsa.pub “-p 22 root@192.168.43.119”
/etc/profile.d/ #加载系统登录程序的一个目录
这个目录下即使没有执行权限,开机也会加载的。
下面我们来写一个跳板机,准备2台及以上虚拟机即可。
第一台 MySQL server:192.168.43.117
第二台 Web server:192.168.43.118
第三台 Application server:192.168.43.119
① 在所有机器上创建跳板机用户:
useradd tbj
echo 123456|passwd --stdin tbj
② 在跳板机上创建密钥
su – tbj
ssh-keygn –t das –P ‘’ –f ~/.ssh/id_dsa
③ 将公钥分发至其他机器上
ssh-copy-id –I .ssh/id_dsa.pub “-p 22 tbj@192.168.43.117”
④ 再开一个窗口使用root用户写脚本
[root@bqh-118 scripts]# vim tiaoban.sh
#!/bin/bash
trap '' INT QUIT TSTP TERM HUPfunction menu() {cat <<-bqh #cat <<-字母 用-的话开头结尾都得用tab键隔开。
=========Server List=============
1) Conneciton to the MySQL Server.
2) Conneciton to the Web Server.
3) Conneciton to the Application Server.
4) exit
==============================bqh #前面是一个tab键,非4个空格
}function wait_info {
echo -n "Please wait a moment, Connecting."
sleep 1
echo -n "."
sleep 1
echo -n "."
clear
echo "The Connection is Successfully!"
sleep 1
}function host() {case "$1" in1)wait_infossh -p22 $USER@192.168.43.117;;2)wait_infossh -p22 $USER@192.168.43.118;;3)wait_infossh -p22 $USER@192.168.43.119;;4)exit;;*)echo -e "\e[31;5m Invalid options. \e[0m" && sleep 1exit
esac
}function main() {
while :
doclearmenuread -p "please select:" numhost $num
done
}
main
接着我们在跳板机/etc/profile.d下写一个脚本来加载跳板脚本:
[root@bqh-118 profile.d]# cat tiaoban.sh
#!/bin/sh
[ $UID -ne 0 ] && [ $UID -ne 501 ] &&\
. /server/scripts//tiaoban.sh
接下来我们执行脚本,从新打开窗口登录
ok,测试完成。
注:脚本程序通常是由上到下的顺序解释执行的,所有必须在你想保护的那部分代码以前指定trap命令。
跳板机安全应用:
1、 首先跳板机禁止外网ip登录,只能内网ip登录。
ListenAddress 192.168.43.1
2、 其他服务器有外网ip的也别忘了禁止外网ip登录,只能内网ip登录。同时禁止root登录,等做完ssh-key认证,连密码登录也被禁止了,只能通过证书登录,而且只有跳板机有其他服务器的密钥。
修改/etc/ssh/sshd_config
PasswordAuthentication yes
改为:no
3、先远程拨号登录VPN,然后登录跳板机,最后再从跳板机登录其他服务器。
----------如果感觉还不安全,那就跳板机后再跳板机…