Rundeck中Expect脚本无法正常运行的问题求助
问题
管理虚拟机全新安装Rundeck,通过GitHub推送脚本执行,此前已实现脚本嵌套、Rundeck+Expect+PowerShell的SSH操作。现有PowerShell脚本调用Expect执行远程rkhunter扫描,rundeck用户在终端运行完全正常,但Rundeck执行时报错,尝试修改Expect退出方式、调整SSH命令逻辑均无效。
排查方向
- 环境变量差异:Rundeck执行时用的是非交互式shell,环境变量(比如
PATH、HOME)和终端登录的rundeck用户不一样。对比终端printenv和Rundeck脚本里输出的环境变量,重点检查Expect、SSH、rkhunter的路径是否在PATH里,HOME目录下的SSH配置/密钥是否能被访问。 - Rundeck执行上下文限制:非交互式shell的提示符可能和终端不一样,Expect脚本里的匹配规则可能失效。比如终端提示符是
user@host $,非交互式可能只有$,要调整Expect的匹配正则,比如改成set prompt {\$ #>}覆盖常见情况。 - 权限与文件访问:确认Rundeck进程能读取Expect/PowerShell脚本,SSH密钥权限必须是
600(不能给其他用户读写),~/.ssh/config里是否加了StrictHostKeyChecking no避免首次登录的确认提示(这个会卡住Expect交互)。 - 日志调试:给Expect脚本加
exp_internal 1开启调试,把输出重定向到日志文件(比如expect script.exp > /tmp/expect_debug.log 2>&1),看交互卡在哪个步骤;同时看Rundeck执行历史里的完整错误输出,有没有隐藏的命令找不到、权限不足提示。 - SSH TTY问题:远程执行需要交互的命令(比如rkhunter可能有确认步骤),SSH默认不分配tty,Expect会因为没有交互环境失败。给SSH命令加
-t -t参数强制分配tty,比如ssh -t -t user@host 'rkhunter --check'。
常见修复方案
- 补全环境变量:在PowerShell脚本开头手动设置环境变量,确保路径正确:
$env:PATH += ":/usr/local/bin:/usr/bin" # 按需添加Expect、SSH所在路径 $env:HOME = "/var/lib/rundeck" # 指定rundeck用户的HOME目录,确保能读取SSH配置 - 调整Expect匹配规则:修改脚本里的提示符匹配,兼容非交互式环境:
set prompt {\$ #>} spawn ssh user@host expect -re $prompt send "rkhunter --check\r" expect -re $prompt send "exit\r" expect eof - 强制分配TTY:在Expect的SSH命令里加入
-t -t:spawn ssh -t -t user@host "rkhunter --check" # 后续交互逻辑根据rkhunter的提示调整send内容 - 日志定位问题:在PowerShell里添加日志输出,记录执行细节:
# 记录当前环境变量和执行命令 "Current PATH: $env:PATH" | Out-File /tmp/rundeck_ps.log -Append "Executing expect command: expect /path/to/your_script.exp" | Out-File /tmp/rundeck_ps.log -Append # 执行Expect并记录输出 expect /path/to/your_script.exp > /tmp/expect_exec.log 2>&1
内容的提问来源于stack exchange,提问作者Martin Machl
相关产品推荐
相关产品推荐

