You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:14:53