expect 安装入门手册
expect 安装入门手册
一、expect 与 tcl 简介
expect 是一款自动化交互套件,也是交互性很强的脚本语言,主要应用于执行命令和程序时,当系统以交互形式要求输入指定字符串时,它能实现交互通信,可帮助运维人员实现对成千上百台服务器的批量管理操作,是一款实用的批量部署工具。
expect 依赖于 tcl,而 Linux 系统通常不自带 tcl,因此需要手动安装 tcl 后再安装 expect。
二、安装前准备
(一)下载软件包
需要下载的软件包为 expect5.45.3.tar.gz 和 tcl8.6.1-src.tar.gz。其中,
tcl 的下载地址为
http://www.tcl.tk/software/tcltk/downloadnow84.tml,
可选择 tcl8.4.20-src.tar.gz;expect 的下载地址为https://sourceforge.net/projects/expect/files/latest/download,
对应版本为 expect5.45.tar.gz。
(二)放置软件包
将下载好的 expect 和 tcl 软件包放到 /usr/local/src 目录下。
三、安装步骤
(一)安装 tcl
- 解压 tcl:在 /usr/local/src 目录下,执行命令
[root@*** src]# tar -zvxf tcl8.6.1-src.tar.gz`。
- 进入相关目录:解压完成后,执行
. ```bash
.[root@*** src]# cd tcl8.6.1/unix
进入 tcl 解压目录下的 unix 目录。3. 编译安装:执行```bash
[root@*** unix]# ./configure --prefix=/usr/local/tcl --enable-shared
该命令将 tcl 安装到 /usr/local/tcl 目录并开启共享功能;之后执行`
[root@*** unix]# make && make install`
- 复制配置文件:在当前 unix 目录下,执行
`[root@*** unix]# cp tclUnixPort.h ../generic/`
- 将 tclUnixPort.h 复制到 generic 目录中,这在安装 expect 时会用到。
(二)安装 expect
- 解压 expect:在 /usr/local/src 目录下,执行`
[root@*** src]# tar -zvxf expect-5.45.3.tar.gz
进入安装目录:执行`
[root@`***` src]# cd expect-5.45.3`
进入 expect 解压目录。
- 配置安装路径:执行
`[root@`***`expect-5.45.3]#./configure --prefix=/usr/local/expect --with-tcl=/usr/local/tcl/lib -with tclinclude=/usr/local/src/tcl8.6.1/generic/`
–prefix 指定 expect 的安装路径,
–with-tcl 告诉 configure 脚本 tcl 解释器位置,
–with-tclinclude 告诉脚本 tcl 头文件位置。
- 编译安装:执行
`[root@`xxx` expect-5.45.3]# make && make install`完成安装。
- 创建软连接:为了便于使用 expect,需要创建软连接,执行以下命令:
`ls -s /usr/local/tcl/bin/expect /usr/local/expect/bin/expect``ls -s /usr/local/tcl/bin/expect /bin/expect``ls -s /usr/local/tcl/bin/expect /usr/bin/expect`
- 需要注意的是,expect 的命令实际在 Tcl 包里,所以要把 tcl 中的 expect 命令做软链接到 expect 包里。
四、安装测试
安装完成后,在终端执行[root@*** ~]# expect
,若出现expect1.1>
的提示,则说明安装成功。
五、expect 常用命令
-
spawn:交互程序开始,后面跟命令或者指定程序。
-
expect:等待一个进程的反馈,获取匹配信息,匹配成功则执行后面的程序动作。
-
send、exp_send:用于发送指定的字符串信息。
-
exp_continue:在 expect 中多次匹配时需要用到。
-
send_user:用来打印输出,相当于 shell 中的 echo。
-
exit:退出 expect 脚本。
-
eof:expect 执行结束并退出。
-
set:定义变量。
-
puts:输出变量。
-
set timeout:设置超时时间。
-
interact:退出自动化,开始允许用户交互。
六、应用场景
expect 凭借其自动化交互的特性,在多个领域都有广泛应用。在服务器管理方面,可用于批量登录多台服务器进行命令执行、配置修改等操作,极大减少运维人员的重复劳动;在软件部署时,能自动完成安装过程中的各种交互确认,实现软件的批量部署;在自动化测试领域,可模拟用户与程序的交互过程,对程序的交互功能进行测试;还能用于数据备份、系统监控等需要频繁人机交互的场景。
七、应用实例
(一)自动登录远程服务器
以下是一个使用 expect 自动登录远程服务器的脚本示例:
#!/usr/bin/expect -f
set timeout 30
spawn ssh [用户名]@[远程主机地址]
expect "password:"
send "[登录密码]\r"
interact
脚本说明:
-
#!/usr/bin/expect -f
:指定脚本使用 expect 解释器执行。 -
set timeout 30
:设置超时时间为 30 秒。 -
spawn ssh [用户名]@[远程主机地址]
:启动 ssh 命令,连接到远程服务器,其中[用户名]
为远程服务器的用户名,[远程主机地址]
为远程服务器的 IP 地址或域名。 -
expect "password:"
:等待服务器提示输入密码。 -
send "[登录密码]\r"
:发送密码,\r
表示回车,[登录密码]
为登录远程服务器的密码。 -
interact
:允许用户与远程服务器进行交互。
使用方法:将上述脚本保存为login_remote.exp
,然后执行chmod +x login_remote.exp
赋予脚本执行权限,最后运行./login_remote.exp
即可自动登录远程服务器。
(二)批量执行命令
如果需要在多台远程服务器上执行相同的命令,可使用如下脚本:
#!/usr/bin/expect -f
set timeout 30
set host_list {[主机1地址] [主机2地址] [主机3地址]}
set username "[用户名]"
set password "[登录密码]"
set command "[需执行的命令]"foreach host $host_list {spawn ssh $username@$hostexpect "password:"send "$password\r"expect "#"send "$command\r"expect "#"send "exit\r"expect eof
}
脚本说明:
-
set host_list {[主机1地址] [主机2地址] [主机3地址]}
:定义需要操作的远程服务器列表,[主机1地址]
、[主机2地址]
、[主机3地址]
为服务器的 IP 地址或域名。 -
set username "[用户名]"
:设置登录用户名,[用户名]
为远程服务器的登录用户名。 -
set password "[登录密码]"
:设置登录密码,[登录密码]
为远程服务器的登录密码。 -
set command "[需执行的命令]"
:设置需要在远程服务器上执行的命令。 -
foreach host $host_list { ... }
:遍历服务器列表,对每台服务器执行登录、执行命令、退出等操作。 -
expect "#"
:等待服务器返回命令提示符,不同系统的提示符可能不同,可根据实际情况修改。 -
send "exit\r"
:执行完命令后退出远程服务器。 -
expect eof
:等待命令执行结束。
使用时,将脚本保存为batch_exec.exp
,赋予执行权限后运行即可在多台服务器上批量执行指定命令。
(注:文档部分内容可能由 AI 生成)