背景图

expect脚本实现自动登录

概述

现在的系统都是分布式系统,微服务已经是常态化了。就是环境也是多套,dev、sit、stable、pre、prod。但是带来的问题就是我们要经常连接不同的服务器去查问题,频繁的环境切换+密码查找带来不小的麻烦。今天就了来教大家如何实现自动连接服务器,而不用输入密码。

expect脚本这个就能满足大家的要求,如果你想更灵活的操作也可以试用一下fabric,但是fabric并不能进行交互shell,fabric虽然不用输入密码,但是它是每次一批一批命令的发。相比之下我更喜欢交互式shell,所以这里我就重点介绍一下expect shell脚本的编写。

expect脚本是基于Tcl包而构建的,是基于C语言开发的产品,所以Tcl的指令在expect中也是可以使用的。expect的官网也给了很多信息,我们这里只是一个简明的教程,里面的东西就不进行详细的介绍了。

安装

安装expect非常简单,Ubuntu用户,使用:

1
> apt-get install expect

Centos用户

1
> yum install expect

mac用户

1
> brew install expect

如果你widows用户,那就直接使用Xshell,而且这个Xshell还能开启ss5通道进行翻墙呢。😺 当然这个是基于ssh的功能进行的,如果你想利用ssh开启ss5通道翻墙,可以使用下面的命令:

1
while true; do ssh -D 7070 $user@$host -p $port || true; done

命令

Expect是在Tcl基础上创建起来的,它还提供了一些Tcl所没有的命令:

  • spawn命令激活一个Unix程序来进行交互式的运行。
  • send命令向进程发送字符串。
  • expect命令等待进程的某些字符串。expect支持正规表达式并能同时等待多个字符串,并对每一个字符串执行不同的操作。expect还能理解一些特殊情况,如超时和遇到文件尾。
  • expect命令和Tcl的case命令的风格很相似。都是用一个字符串去匹配多个字符串。(只要有可能,新的命令总是和已有的Tcl命令相似,以使得该语言保持工具族的继承性)。

示例

下面给一个expect脚本的示例,部分信息我做了隐藏。这个脚本是底层连接的脚本,我还在外面包了具体连接某一台机器的脚本。所以这个底层脚本需要输入你要连接的机器作为参数传进来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/local/bin/expect

send_user "开始进行连接......\n";
#从命令行参数中获取要连接的机器
set cmd [lindex $argv 0]

if { "$cmd" == "" } {
send_user "参数cmd不能为空\n"
exit 1
}

send_user "机器: $cmd \n"

# 进入交互式shell
spawn ssh log@$cmd
expect {
"*password:" {
send "【替换为你的连接的密码】\n"
}

# 第一次进行ssh连接的时候,会提示是否继续
"*(yes/no)?" {
send "yes\n"
expect {
"*password:" {
send "【替换为你的连接的密码】\n"
}
}
}
}

# 连接后进入特定的目录
# expect "*$*" {
# send "cd /home/admin/logs"
# send "export app=`uname -ar | awk '{print \$2}' | awk -F . '{print \$1}' | awk -F - '{print \$1}'`"
# }
#expect eof
#catch wait result
#send_user "结果:$result"

# 连接成功后在进行交互之前执行一些命令
spawn ls
spawn cd /home/admin/logs
spawn bash -c "app=`uname -ar | awk '{print \$2}' | awk -F . '{print \$1}' | awk -F - '{print \$1}'`"
send_user "登录机器的应用名:$app \n"
bash ~/util/common/pre

# 正式进入交互模式
interact

参考

更多关于expect的学习请参考:

  • expect教程中文版
  • expect - 自动交互脚本
  • Tcl
0%