背景
shell执行命令在路由器交换机等需要等待执行结果确认ok后才能执行下一条命令的场景有些捉襟见肘,expect是一个不错的解决方案。他具有send发送命令 expect阻塞等待执行结果
expect基础用法
Expect 是一种自动化交互式程序的工具,通常用于自动化和测试与命令行程序、脚本或系统之间的交互。它的工作方式是等待一个特定的字符串或模式出现,然后执行相应的操作,如发送输入、执行命令等。下面是 Expect 的一般语法和一个简单的示例:
一个简单的 Expect 示例,模拟登录到远程服务器并执行一些操作:
#!/usr/bin/expect
# 远程服务器信息
set server "example.com"
set username "your_username"
set password "your_password"
# 打开 SSH 连接
spawn ssh $username@$server
# 匹配密码提示并发送密码
expect "password:"
send "$password\r"
# 匹配成功登录后的命令行提示
expect "$username@$server:"
# 发送一个命令
send "ls -l\r"
# 匹配命令执行后的输出
expect "$username@$server:"
# 发送退出命令
send "exit\r"
# 等待退出完成
expect eof
打开一个 SSH 连接,然后匹配密码提示,发送密码,然后匹配成功登录后的命令行提示,发送一个 ls -l
命令,然后匹配命令执行后的输出,最后发送退出命令并等待退出完成。
expect几个常用命令
通常使用以下几个关键命令来实现自动化交互:
-
spawn
:这个命令用于启动一个新的子进程,通常是一个命令行程序或脚本。它的语法如下:spawn 命令
例如,
spawn ssh user@host
用于启动一个 SSH 会话。 -
send
:send
命令用于向子进程发送文本输入。它的语法如下:send "要发送的文本\r"
注意,
\r
用于模拟回车键的按下。例如,send "ls -l\r"
用于向子进程发送ls -l
命令。 -
expect
:expect
命令用于等待子进程输出中的特定字符串或模式,并执行相应的操作。它的语法如下:expect { "匹配的字符串或模式1" { 操作1 } "匹配的字符串或模式2" { 操作2 } ... }
例如,
expect "Password:" { send "mypassword\r" }
用于等待 “Password:” 出现,然后发送密码。 -
interact
:interact
命令允许用户与子进程交互,将控制权还给用户。它的语法如下:interact
这在需要手动干预子进程时很有用。
-
exp_continue
:exp_continue
命令用于继续等待下一个匹配模式,而不执行任何操作。它通常与expect
一起使用,以处理多个匹配条件。
综述
在一些对服务器命令执行上下文要求比较严格以及多条命令有先后关系的场景使用expect比较实用。常见场景是路由器交换机执行 以及服务器登录确认等。