简单方便的堡垒机自动登录脚本
Photo by Sami Anas from Pexels
1. 堡垒机简介
在日常的后端开发中,与服务器打交道是家常便饭的事情,通常生产中的开发会采用堡垒机这种设施来提供一个受控制的访问手段。
跳板机(Jump Server、JumpBox),也称堡垒机,是一类可作为跳板批量操作远程设备的网络设备,是系统管理员或运维人员常用的操作平台之一。跳板机最核心的功能是以本机作为跳板来操作远程设备,较为普遍地是通过 ssh 协议实现远程管理。
以上描述翻译自Wikipedia:https://en.wikipedia.org/wiki/Jump_server
= =! 最近公司更换了使用的堡垒机产品,之前写的脚本不能通用了,重写后顺便记录一下。
堡垒机示意图,图片来源:https://medium.com/rangle-io/jumpboxes-how-to-avoid-storing-ssh-keys-59e3dc78e5e6
2. 为何需要脚本
相信实际使用过堡垒机的同学都明白,连接处于堡垒机后方的服务器时需要先进行一些选择的操作,虽然并不是很麻烦,但是和自己搭建的Linux虚拟机相比总是少了一点方便快捷。如下图,左边虚拟机直接连接,而右边的堡垒机则需要进行选择,作为一向追求效率(懒)的程序猿怎么能浪费宝贵的时间在做这种选择上~
3. 怎么通过脚本跳转
如第二小节的图示,一般的堡垒机终端连接时都提供了一些便捷选项,让我们通过键盘快捷的找到目标机器,于是我们可以通过脚本来模拟从堡垒机登录的过程。
例如以下Shell脚本就可以完成堡垒机的跳转,虽然实现的比较简陋,但足以帮助理解:
#!/bin/bash
# 需要先安装expect
expect -c "
# 开启新会话
spawn -noecho ssh abc@buzhidao-public.buzhidao.aliyuncs.com -p 12345;
# 等待屏幕上出现password,然后模拟键盘输入发送密码
expect *password:*;
send -- bu gao su ni\r;
# 等待屏幕上出现堡垒机Shell界面,然后发送跳转符
expect *NUM*;
send :;
sleep 1
# 发送跳转的编号和回车
send 1\r;
sleep 1
send \r;
# 交还交互式控制权给用户
interact;
"
这里为了演示直接发送了跳转固定ID的机器,如果确实用Shell脚本实现的话可以在这里发送正则表达式来让脚本变得通用
4. XShell版脚本
事实上在XShell中也是一样的实现步骤,只不过可以便捷的写入到会话设置中,双击一下像是登录虚拟机一样方便。
右击XShell的会话,打开属性设置,进入登录脚本项即可开始编写脚本:
XShell的Expect发送规则支持正则表达式,所以用起来也是很方便的,可以先尝试一下用发送规则,但是发送规则是无序的,如果跳转过程依赖顺序或者比较复杂就需要使用脚本语言了。如图,可以选择发送规则和脚本,或者两者同时使用也是可以的。
这里以我自己的登录脚本作为示例:
def Main():
global xsh
xsh.Screen.WaitForString("NUM")
xsh.Screen.Send("/")
xsh.Screen.WaitForString("/")
xsh.Screen.Send("*这里是匹配主机的正则表达式*")
xsh.Screen.Send("\n")
XShell脚本文档:XShell | Script Starting and Ending