Linux好用命令之expect命令
文章发布较早,内容可能过时,阅读注意甄别。
# 1、expect 是什么
使用 Linux 的程序员对输入密码都不会陌生,在 Linux 下对用户有严格的权限限制,干很多事情越过了权限就得输入密码,比如使用超级用户执行命令,又比如 scp、ssh 连接远程主机等等。 比如我们要是 到 10.20.24.103 这台机器上去,就需要输入密码:
$ ssh 10.20.24.103
root@10.20.24.103's password:
1
2
2
那么问题来了,如果我们脚本里面有 scp 的操作,总不可能执行一次 scp 就输入密码一次,这样就需要一个人盯着脚本运行了。 为了解决这个问题,我们需要一个自动输入密码的功能。
# 2、expect 的原理
针对这种 scp 或者 ssh 命令的功能,可能很多人想到的就是勉密钥登录。这种其实可以但是这种在生产环境不建议这么做,不安全。
至于 ssh 勉密钥登录的操作可以自行去百度。目前大数据上的分布式处理就是用这种方式来建立主机的互信关系的。
今天我们主要是讲没有建立信任关系下自动输入密码的功能,这个引入今天的主角 expect,使用如下命令进行安装:
$ sudo yum install expect
1
# 3、入门脚本
简单示例如下:
$ cat expect.sh
#!/usr/bin/expect
set timeout 20
spawn ssh root@10.20.24.103
expect "root"
send "paic1234\n"
interact
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
说明 :
- 第一行是指定执行的模式,我们平时写 shell 是用 #!/bin/bash 等等,这个我们执行我们用
#!/usr/bin/expect
- set timeout 20 这个是用来设置相应的时间,如果里面的脚本执行或者网络问题超过了这个时间将不执行,这个 timeout 模式是 10
- spawn 表示在 expect 下面需要执行的 shell 脚本
- expect 是捕获执行 shell 以后系统返回的提示框内容。
""
这个表示提示框里面是否包括这个内容 - send 如果 expect 监测到内容了,那么就将 send 后的内容发送出去 \n 表示回车
- interact 表示结束 expect 回话,可以继续输入,但是不会返回终端
$ hostname
SZB-L0032014
$ ./expect.sh
spawn ssh root@10.20.24.103
root@10.20.24.103's password:
Last login: Wed Mar 1 08:24:22 2017 from szb-l0032014
$ hostname
SZB-L0032013
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 4、expect 的案例
登录一台机器,将本机的一个文件传到远程机器上
$ cat expect1.sh
#!/usr/bin/expect
set timeout 20
if { [llength $Extra close brace or missing open braceargv] < 2} {
puts "Usage:"
puts "$argv0 local_file remote_path"
exit 1
}
set local_file [lindex $argv 0]
set remote_path [lindex $argv 1]
set passwd paic1234
set passwderror 0
spawn scp ${local_file} ${remote_path}
expect {
"password" {
if { $passwderror == 1 } {
put "passwd is error"
exit 2
}
set timeout 1000
set passwderror 1
send "paic1234\n"
exp_continue
}
"*es/no)?*" {
send "yes\n"
exp_continue
}
timeout {
put "connect is timeout"
exit 3
}
}
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
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
# 5、注意事项
- 1、llength argv 表示参数的个数 2、argv 表示参数的个数
- 2、argv0 表示脚本的名称
- 3、lindex $argv 0 表示第一个参数,依次类推到 n,参数下标是从 0 开始的
- 4、if 判断需要用{}括起来
- 5、if 与后面的{}直接需要有空格
- 6、expect {},多行期望,匹配到哪条执行哪条,有时执行 shell 后预期结果是不固定的,有可能是询问是 yes/no,有可能是去输入密码,所以可以用 expect{}
- 7、else 不能单独放一行,所以 else 要跟在}后面
- 8、两个花括号之间必须有空格隔开,比如 if {} {},否则会报错 expect:extra characters after close-brace
- 9、使用{来衔接下一行,所以 if 的条件后需要加左花括号{
通过各种脚本发现 expect 对脚本的格式要求特别高,比如{}直接要空格、else 以后需要增加{等等,如果发现不能正常运行,优先检查格式是否有问题
上次更新: 2024/11/19, 23:11:42