一、Expect 概述
Expect 是创建在 Tcl 语言根本上的一个工具,常被用于举行主动化控制和测试,办理 shell 脚本中交相互干的标题。
1.1 Expect 的安装
Expect 是一个步伐,因此必要提前安装才华利用。
- rpm -q expect
- rpm -q tcl
- yum -y install expect # yum 或者光盘安装都可
复制代码
1.2 根本下令
1.2.1 脚本表明器
在 Expect 脚本中起首引入文件,表明利用的是哪一个 shell。
1.2.2 spawn
spawn 反面通常跟一个 Linux 实行下令,表现开启一个会话、启动进程,并跟踪后续交互信息。
例:spawn passwd root
1.2.3 expect
判断前次输出结果中是否包罗指定的字符串,假如有则立刻返回,否则就等候超时时间后返回。只能捕捉由 spawn 启动的进程的输出,用于吸收下令实行后的输出,然后和渴望的字符串匹配。
1.2.4 send
向进程发送字符串,用于模拟用户的输入。该下令不能主动回车换行,一样平常要加 \r (回车) 大概 \n。
例:
方式一:
- expect "密码" { send "abc123\r" } # 同一行 send 部分要有 {}
复制代码 方式二:
- expect "密码"
- send "abc123\r" # 换行 send 部分不需要有 {}
复制代码 方式三:
- expect "密码1" { send "abc123\r" }
- expect "密码2" { send "123456\r" }
- expect "密码3" { send "123123\r" }
复制代码
1.2.5 expect eof
表现交互竣事,等候实行竣事,退回到原用户,与 spawn 对应。
1.2.6 interact
实行完成后保持交互状态,把控制权交给控制台,会停顿在目标终端而不会退回到原终端,这个时间可以手工利用。利用 interact 会保持在终端而不会退回到原终端。注意:expect eof 与 interact 只能二选一。
1.2.7 set
Expect 默认的超时时间是10秒,通过 set 下令可以设置会话超时时间,若不限定超时时间则应设置为-1。
例:set timeout 30
1.2.8 exp_continue
exp_continue 附加于某个 expect 判断项之后,可以使该项被匹配后,还能继续匹配该 expect 判断语句内的其他项。
例:
- expect {
- "(yes/no)" { send "yes\r"; exp_continue; }
- "*password" { set timeout 300; send "abc123\r"; }
- }
复制代码
1.2.9 send_user
send_user 表现回显下令,相当于 echo。
1.2.10 吸收参数
Expect 脚本可以担当从 bash 下令行通报的参数,利用 [lindex $argv n] 得到。此中 n 从 0 开始,分别表现第一个、第二个、第三个参数。
例:
- set hostname [lindex $argv 0]
- set password [lindex $argv 1]
复制代码 二、用 Expect 编写脚本
2.1 例1:SSH 无交互登录到长途服务器
2.1.1 编写脚本
- [root@sjserver ~]# vim expect.sh #!/usr/bin/expect
- # 利用 Expect 的表明器spawn ssh root@192.168.78.22 # 开启一个会话,这个会话是 SSH 长途登录expect { "password:" { send "123456\r"; }}interact # 交互,否则会直接退出长途服务器
复制代码 2.1.2 实行脚本
- [root@sjserver ~]# chmod +x expect.sh # 加执行权限
- [root@sjserver ~]# ./expect.sh
- spawn ssh root@192.168.78.22
- root@192.168.78.22's password:
- Last login: Mon Jul 27 23:31:00 2020 from 192.168.78.22
复制代码
2.2 例2:在对方服务器上举行利用退却出
2.2.1 编写脚本
- [root@localhost ~]# vim expect.sh#!/usr/bin/expect
- spawn ssh root@192.168.245.211expect { "password:" { send "123456\r"; }}expect "#" # 当捕捉到 # 的时间send "ls\r" # 实行 ls 下令send "ifconfig ens33\r" # 实行 ifconfig ens33 下令send "exit\r" # 实行完 exit 退出登录expect eof # 不必要举行交互了,意味着竣事 Expect 步伐
复制代码 2.2.2 实行脚本
- [root@localhost ~]# chmod +x expect.sh # 加执行权限
- [root@localhost ~]# ./expect.sh
复制代码
2.3 界说和引用变量
2.3.1 界说变量
用 set 关键字界说变量,变量名和变量的值中心用空格分开,其他用法与 shell 脚本同等。
- #!/usr/bin/expect
- set user rootset ip 192.168.245.211set pass 123456
复制代码 2.3.2 引用位置变量
- #!/usr/bin/expect
- set user rootset ip [lindex $argv 0] # 设置第一个位置变量为 ipset pass [lindex $argv 1] # 设置第二个位置变量为登录暗码spawn ssh $user@$ipexpect { "password:" { send "$pass\r"; }}expect "#"send "ls\r"send "ifconfig ens33\r"send "exit\r"expect eof
复制代码- [root@localhost ~]# ./expect.sh 192.168.245.211 123456 # 执行时需要加位置变量
复制代码
2.4 界说其他参数
比方超时时间、日志 等。
- # 超时时间
- set timeout 20 # 登录超时多少秒退出
- # 开启日志
文件 - log_file test.log # 日志
记录操作 - # 显示信息
- log_user 1 # 1 为屏幕输出信息,0 为不输出
复制代码
三、在 Shell 脚本中调用 Expect
3.1 创建用户并设置用户暗码
3.1.1 示例脚本
- #!/bin/bash
- username=$1
- useradd $username
- /usr/bin/expect <<-EOF
- spawn passwd $username
- expect {
- "密码" { send "123456\r"; exp_continue; }
- "新的密码" { send "123456\r"; }
- }
- EOF
复制代码
3.1.2 验证结果
- [root@server ~]# . user.sh wangwu
- spawn passwd wangwu
- 更改用户 wangwu 的密码 。
- 新的 密码:
- 无效的密码: 密码少于 8 个字符
- 重新输入新的 密码:
- passwd:所有的身份验证令牌已经成功更新。
复制代码 3.1.3 另一种写法
- #!/bin/bash
- user=$1
- password=$2
- useradd $user
- expect << EOF
- spawn passwd $user # 开启一个进程跟踪 passwd 命令,expect 只能捕捉该进程信息
- expect "新的*" # 匹配输出信息 "新的*"
- send "${password}\r" # 自动输入密码
- expect "重新*" # 匹配输出信息 "重新*"
- send "${password}\r" # 自动输入密码
- expect eof # 等待结束标记
- EOF
复制代码
3.2 SSH 长途到服务器
3.2.1 案例1
- #!/bin/bash
- expect -c " # 需要用 expect -c 调用 expect 程序
- spawn ssh root@192.168.78.22
- expect "password:" { send "123456\r" }
- interact
- "
复制代码
3.2.2 案例2
- [root@localhost ~]# vim expects.sh
- #!/bin/bash
- expect -c "
- spawn ssh root@192.168.245.211
- expect "password:" { send "123456\r" }
- expect "]#" { send "ifconfig\r" }
- expect "]#" { send
- "exit\r" }
- expect eof
- "
复制代码
四、利用 Expect 完成 FTP 登录过程
- #!/usr/bin/expect
- -f set timeout 10spawn ftp 192.168.78.22expect "Name*" { send "ftp\r" }expect "Password:*" { send "\r" }expect "ftp>*" { interact }expect eof
复制代码
Expect 是一个强盛的工具,可以或许实现复杂的主动化控制和测试,通过与 shell 脚本联合,可以简化很多交互式任务的处置惩罚。
66823)]
四、利用 Expect 完成 FTP 登录过程
- #!/usr/bin/expect
- -f set timeout 10spawn ftp 192.168.78.22expect "Name*" { send "ftp\r" }expect "Password:*" { send "\r" }expect "ftp>*" { interact }expect eof
复制代码 [外链图片转存中…(img-3tB3MEw0-1723317966823)]
Expect 是一个强盛的工具,可以或许实现复杂的主动化控制和测试,通过与 shell 脚本联合,可以简化很多交互式任务的处置惩罚。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |