在Expect脚本中执行命令的核心是通过spawn启动进程,结合send发送指令、expect匹配响应实现自动化交互,以下是详细操作指南:
基础执行流程
-
启动进程
使用spawn创建子进程(如SSH、FTP、Shell):spawn ssh user@host # 启动SSH连接
-
匹配预期输出
用expect等待特定提示符(如密码输入提示):expect "password:" # 等待系统返回"password:"字符串
-
发送执行指令
通过send传递命令(结尾\r模拟回车):send "your_password\r" # 发送密码 send "ls -l /home\r" # 执行Linux命令 send "exit\r" # 退出会话
完整示例:自动化SSH执行命令
# 启动SSH连接
spawn ssh user@192.168.1.100
# 处理交互提示
expect {
"yes/no" {
send "yes\r" # 接受首次连接的HostKey确认
exp_continue # 继续等待后续提示
}
"password:" {
send "your_password\r"
}
}
# 登录成功后执行命令
expect "$ " # 等待Shell提示符(如$或#)
send "mkdir test_dir\r" # 创建目录
send "echo 'Hello' > test_dir/file.txt\r" # 写入文件
send "exit\r" # 退出SSH
# 结束处理
expect eof # 等待进程关闭
关键技巧
-
超时控制
设置全局超时防止卡死:set timeout 30 # 30秒后超时
-
错误处理
使用expect_before预设错误响应:expect_before { "Connection refused" { puts "地址错误"; exit 1 } "Permission denied" { puts "密码错误"; exit 2 } } -
变量传递
动态传入命令参数:set cmd "df -h" send "$cmd\r"
-
多进程管理
保存进程ID进行并行控制:spawn bash set shell_id $spawn_id send "sleep 10\r"
注意事项
- 安全风险:避免在脚本中硬编码密码,改用SSH密钥认证
- 编码问题:非ASCII字符需声明
encoding utf-8 - 日志调试:启动时加
-d参数显示交互细节 - 平台适配:Windows需安装Tcl/Tk并关联
.exp文件类型
应用场景:自动化部署、批量服务器管理、嵌入式设备交互测试(如交换机配置)
官方资源
- Expect手册:
man expect - 权威指南:《Exploring Expect》Don Libes (O’Reilly)
- 源码仓库:GitHub – expect/expect
- Tcl/Tk文档:https://www.tcl-lang.org/
基于Expect 5.45.4验证,适用于Linux/Unix及Windows(通过Cygwin),实际部署时建议结合Ansible或Python pexpect模块增强可维护性。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/8032.html