Expect

[复制链接]
发表于 2026-2-10 10:01:08 | 显示全部楼层 |阅读模式
一、Expect 概述

Expect 是创建在 Tcl 语言根本上的一个工具,常被用于举行主动化控制和测试,办理 shell 脚本中交相互干的标题。
1.1 Expect 的安装

Expect 是一个步伐,因此必要提前安装才华利用。
  1. rpm -q expect
  2. rpm -q tcl
  3. yum -y install expect  # yum 或者光盘安装都可
复制代码

1.2 根本下令

1.2.1 脚本表明器

在 Expect 脚本中起首引入文件,表明利用的是哪一个 shell。
  1. #!/usr/bin/expect
复制代码
1.2.2 spawn

spawn 反面通常跟一个 Linux 实行下令,表现开启一个会话、启动进程,并跟踪后续交互信息。
例:spawn passwd root
1.2.3 expect

判断前次输出结果中是否包罗指定的字符串,假如有则立刻返回,否则就等候超时时间后返回。只能捕捉由 spawn 启动的进程的输出,用于吸收下令实行后的输出,然后和渴望的字符串匹配。
1.2.4 send

向进程发送字符串,用于模拟用户的输入。该下令不能主动回车换行,一样平常要加 \r (回车) 大概 \n。
例:
方式一:
  1. expect "密码" { send "abc123\r" }  # 同一行 send 部分要有 {}
复制代码
方式二:
  1. expect "密码"
  2. send "abc123\r"  # 换行 send 部分不需要有 {}
复制代码
方式三:
  1. expect "密码1" { send "abc123\r" }
  2. expect "密码2" { send "123456\r" }
  3. 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 判断语句内的其他项。
例:
  1. expect {
  2.     "(yes/no)" { send "yes\r"; exp_continue; }
  3.     "*password" { set timeout 300; send "abc123\r"; }
  4. }
复制代码

1.2.9 send_user

send_user 表现回显下令,相当于 echo。
1.2.10 吸收参数

Expect 脚本可以担当从 bash 下令行通报的参数,利用 [lindex $argv n] 得到。此中 n 从 0 开始,分别表现第一个、第二个、第三个参数。
例:
  1. set hostname [lindex $argv 0]
  2. set password [lindex $argv 1]
复制代码
二、用 Expect 编写脚本

2.1 例1:SSH 无交互登录到长途服务器

2.1.1 编写脚本

  1. [root@sjserver ~]# vim expect.sh #!/usr/bin/expect
  2.   # 利用 Expect 的表明器spawn ssh root@192.168.78.22  # 开启一个会话,这个会话是 SSH 长途登录expect {    "password:" { send "123456\r"; }}interact  # 交互,否则会直接退出长途服务器
复制代码
2.1.2 实行脚本

  1. [root@sjserver ~]# chmod +x expect.sh  # 加执行权限
  2. [root@sjserver ~]# ./expect.sh
  3. spawn ssh root@192.168.78.22
  4. root@192.168.78.22's password:
  5. Last login: Mon Jul 27 23:31:00 2020 from 192.168.78.22
复制代码

2.2 例2:在对方服务器上举行利用退却出

2.2.1 编写脚本

  1. [root@localhost ~]# vim expect.sh#!/usr/bin/expect
  2. 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 实行脚本

  1. [root@localhost ~]# chmod +x expect.sh  # 加执行权限
  2. [root@localhost ~]# ./expect.sh
复制代码

2.3 界说和引用变量

2.3.1 界说变量

用 set 关键字界说变量,变量名和变量的值中心用空格分开,其他用法与 shell 脚本同等。
  1. #!/usr/bin/expect
  2. set user rootset ip 192.168.245.211set pass 123456
复制代码
2.3.2 引用位置变量

  1. #!/usr/bin/expect
  2. 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
复制代码
  1. [root@localhost ~]# ./expect.sh 192.168.245.211 123456  # 执行时需要加位置变量
复制代码

2.4 界说其他参数

比方超时时间、日志日志等。
  1. # 超时时间
  2. set timeout 20  # 登录超时多少秒退出
  3. # 开启日志日志文件
  4. log_file test.log  # 日志日志记录操作
  5. # 显示信息
  6. log_user 1  # 1 为屏幕输出信息,0 为不输出
复制代码

三、在 Shell 脚本中调用 Expect

3.1 创建用户并设置用户暗码

3.1.1 示例脚本

  1. #!/bin/bash
  2. username=$1
  3. useradd $username
  4. /usr/bin/expect <<-EOF
  5. spawn passwd $username
  6. expect {
  7.     "密码" { send "123456\r"; exp_continue; }
  8.     "新的密码" { send "123456\r"; }
  9. }
  10. EOF
复制代码

3.1.2 验证结果

  1. [root@server ~]# . user.sh wangwu
  2. spawn passwd wangwu
  3. 更改用户 wangwu 的密码 。
  4. 新的 密码:
  5. 无效的密码: 密码少于 8 个字符
  6. 重新输入新的 密码:
  7. passwd:所有的身份验证令牌已经成功更新。
复制代码
3.1.3 另一种写法

  1. #!/bin/bash
  2. user=$1
  3. password=$2
  4. useradd $user
  5. expect << EOF
  6. spawn passwd $user  # 开启一个进程跟踪 passwd 命令,expect 只能捕捉该进程信息
  7. expect "新的*"  # 匹配输出信息 "新的*"
  8. send "${password}\r"  # 自动输入密码
  9. expect "重新*"  # 匹配输出信息 "重新*"
  10. send "${password}\r"  # 自动输入密码
  11. expect eof  # 等待结束标记
  12. EOF
复制代码

3.2 SSH 长途到服务器

3.2.1 案例1

  1. #!/bin/bash
  2. expect -c "  # 需要用 expect -c 调用 expect 程序
  3. spawn ssh root@192.168.78.22
  4. expect "password:" { send "123456\r" }
  5. interact
  6. "
复制代码

3.2.2 案例2

  1. [root@localhost ~]# vim expects.sh
  2. #!/bin/bash
  3. expect -c "
  4. spawn ssh root@192.168.245.211
  5. expect "password:" { send "123456\r" }
  6. expect "]#" { send "ifconfig\r" }
  7. expect "]#" { send
  8. "exit\r" }
  9. expect eof
  10. "
复制代码

四、利用 Expect 完成 FTP 登录过程

  1. #!/usr/bin/expect
  2. -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 登录过程

  1. #!/usr/bin/expect
  2. -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企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表