背景
工作中常常会通过ssh登录各个服务器,我们可以直接把这些ssh信息用alias
进行重命名,但是始终还是有个问题,就是密码还是得输,如果工作服务器是经过跳板机来跳转的,还得蛋疼的再ssh一下,那我们有没有啥办法能解决这个呢?有!用expect
Expect
From Wikipedia:Expect是Unix系统中用来进行自动化控制和测试的软件工具,由Don Libes制作,作为Tcl脚本语言的一个扩展,应用在交互式软件中如telnet,ftp,Passwd,fsck,rlogin,tip,ssh等等。该工具利用Unix伪终端包装其子进程,允许任意程序通过终端接入进行自动化控制;也可利用Tk工具,将交互程序包装在X11的图形用户界面中。
示例
文件以.sh
结尾
#!/usr/bin/expectset timeout 5
# 跳板机spawn ssh [your name]@[server_ip]
expect "*password*"
send "[pwd]\r"
expect "xxxi@jumpserver*"
send "ssh dp@172.1.1.1\r"
expect "*password*"
send "[pwd]\r"
interact
安装
首先查看当前的类Unix环境中是否已经支持expect,可以使用ls -l /usr/bin/expect
或ls -l /bin/expect
中是否存在,如果不支持的话下面提供两个环境的安装方法
- MacOS
brew install expect
- Linux
sudo yum install expect
或sudo apt install expect
说明
下面是对我们来说常用的命令,用了这几个也就能应付80%的使用场景了,相当简单
set
类似于定义常量,给变量赋值,如上面的
set timeout 5
,设置超时时间为5秒spawn
执行shell命令,expect特有
expect
等待当前回话出现的条件if,可以直接匹配正则,比如我希望等出现某个字符串后再执行某些命令,就是使用expect,e.g.
expect "*password*"
匹配提示中的关键词passwordsend
向终端会话中输入指定数据,我们常用的是密码等,如
send "123123\r"
,记得其中的\r
,相当于我们输入完密码按的那个回车键,必不可少的interact
脚本的结束标志语
小结
使用expect+alias能方便我们快速的登录各个终端服务器,哪怕跳板机再跳跳板机也能采用这几个命令简单实现。
文章评论