背景

工作中常常会通过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/expect

set 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/expectls -l /bin/expect中是否存在,如果不支持的话下面提供两个环境的安装方法

  • MacOS brew install expect
  • Linux sudo yum install expectsudo apt install expect

说明

下面是对我们来说常用的命令,用了这几个也就能应付80%的使用场景了,相当简单

set

类似于定义常量,给变量赋值,如上面的set timeout 5,设置超时时间为5秒

spawn

执行shell命令,expect特有

expect

等待当前回话出现的条件if,可以直接匹配正则,比如我希望等出现某个字符串后再执行某些命令,就是使用expect,e.g.expect "*password*" 匹配提示中的关键词password

send

向终端会话中输入指定数据,我们常用的是密码等,如send "123123\r",记得其中的'\r',相当于我们输入完密码按的那个回车键,必不可少的

interact

脚本的结束标志语

小结

使用expect+alias能方便我们快速的登录各个终端服务器,哪怕跳板机再跳跳板机也能采用这几个命令简单实现。

© 2019·蜀ICP备18036663号-1 · 本页总阅读量 · 本站总访问量 · 本站总访客数