在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