场景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
uptime
sleep 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 :
do
touch /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 HUP function 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" in
1)
wait_info
ssh -p22 $USER@192.168.43.117
;;
2)
wait_info
ssh -p22 $USER@192.168.43.118
;;
3)
wait_info
ssh -p22 $USER@192.168.43.119
;;
4)
exit
;;
*)
echo -e "\e[31;5m Invalid options. \e[0m" && sleep 1
exit
esac
} function main() {
while :
do
clear
menu
read -p "please select:" num
host $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,然后登录跳板机,最后再从跳板机登录其他服务器。

----------如果感觉还不安全,那就跳板机后再跳板机…

linux跳板机开发之trap信号机应用的更多相关文章

  1. Linux内核驱动开发之KGDB原理介绍及kgdboe方式配置

    接博文<Linux内核驱动开发之KGDB单步调试内核(kgdboc方式)>.上篇博文中,仅简单介绍使用串口的Kgbd的流程(kgdboc方式),本文将重点介绍KGDB调试Linux内核的原 ...

  2. Python_基于Python同Linux进行交互式操作实现通过堡垒机访问目标机

    基于Python同Linux进行交互式操作实现通过堡垒机访问目标机   by:授客 QQ:1033553122 欢迎加入全国软件测试交流群:7156436 实现功能 1 测试环境 1 代码实践 2 注 ...

  3. Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值

    Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值 题外话:一个问题研究到最后,那边记录文档的前半部分基本上都是没用的,甚至是错误的. 重点在最后,前边不过一些假想猜測. ht ...

  4. DarkStone - 跨平台移动应用开发之 Flex 的崛起

    我的好友Ds 发布一个flex的消息.我帮忙转发 DarkStone - 跨平台移动应用开发之 Flex 的崛起 (2013-08-20 22:28:32)     此文章由 周戈 (DarkSton ...

  5. 微信公众号开发之VS远程调试

    目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 前言 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流 ...

  6. UWP开发之Mvvmlight实践七:如何查找设备(Mobile模拟器、实体手机、PC)中应用的Log等文件

    在开发中或者后期测试乃至最后交付使用的时候,如果应用出问题了我们一般的做法就是查看Log文件.上章也提到了查看Log文件,这章重点讲解下如何查看Log文件?如何找到我们需要的Packages安装包目录 ...

  7. Mobile开发之meta篇

    Mobile开发之meta篇 <meta name="viewport" content="width=device-width, initial-scale=1, ...

  8. android开发之http协议

    http协议学习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web C ...

  9. Android Studio快速开发之道

    概述 现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的,今天就根据自己的经验来给大家介绍一下Android Studio快速开发之道. P ...

随机推荐

  1. 算法习题---5.9数据库(Uva1592)

    一:题目 对数据库中数据进行检测,是否出现数据冗余现象.即是否某一列出现两个及以上数据重复 如上图中,第二列中第2,3行数据重复,所以我们判断为数据冗余.因为他可以分解为下面两张表 (一)样例输入 H ...

  2. RabbitMQ 入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)

    发布/订阅 在上篇第二部分教程中,我们搭建了一个工作队列.每个任务之分发给一个工作者(worker).在本篇教程中,我们要做的之前完全不一样——分发一个消息给多个消费者(consumers).这种模式 ...

  3. Spring Cloud Hystrix 服务容错保护 5.1

    Spring Cloud Hystrix介绍 在微服务架构中,通常会存在多个服务层调用的情况,如果基础服务出现故障可能会发生级联传递,导致整个服务链上的服务不可用为了解决服务级联失败这种问题,在分布式 ...

  4. 【Leetcode_easy】965. Univalued Binary Tree

    problem 965. Univalued Binary Tree 参考 1. Leetcode_easy_965. Univalued Binary Tree; 完

  5. echars 3.0 去掉柱状图阴影用什么属性

    原图展示: 效果图展示: 在代码中注释掉这段 // tooltip : { // trigger: 'axis', // axisPointer : { // 坐标轴指示器,坐标轴触发有效 // ty ...

  6. vue react 路由history模式刷新404问题解决方案

    vue单页因微信分享和自动登录需要,对于URL中存在’#’的地址,处理起来比较坑.用history模式就不会存在这样的问题.但是换成history模式,就会有个新的问题,就是页面刷新后,页面就无法显示 ...

  7. 提示不是内部或外部命令-Java的jdk、JRE包

    因为要测试后台程序的功能,所以要先安装Java的jdk包,配置环境变量. 首先要安装jdk和jre,才是完整的,只安装其中一个的话,在cmd命令行输入“JAVAC”会提示“不是内部或外部命令” 目前最 ...

  8. WDL学习笔记

    WDL是什么? WDL是由Broad Institute开发的一种流程开发语言,全称workflow description language,官方链接如下:https://software.broa ...

  9. ubuntu16.04 下Mongo数据库搭建

    一 数据库安装 1.下载自己需要的数据库版本和系统,下载地址:https://www.mongodb.com/download-center/community . 本文下载的为ubuntu 16.0 ...

  10. access函数的使用

    #include<unistd.h> int access(const char* pathname, int mode); 参数介绍: pathname 是文件的路径名+文件名 mode ...