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

使用Expect自动化composer update时遇send: spawn id not open错误求助

解决Expect执行Composer命令时的spawn id错误问题

问题描述

执行spawn sudo composer update --no-plugins --no-scripts命令时,出现错误:

send: spawn id exp4 not open while executing "send "yes\r""

导致进程未完成就终止。

说明:Composer是Snipe-IT的核心依赖管理工具,负责安装和维护运行应用所需的PHP组件,保障Snipe-IT依托必要组件正常运行。

原脚本问题片段

涉及错误的核心代码块:

COMPOSER_1=$(expect -c "
spawn sudo composer update --no-plugins --no-scripts
expect \"Continue as root/super user?\"
send \"yes\r\"
expect eof
")
echo "$COMPOSER_1"
sleep 10

COMPOSER_2=$(expect -c "
spawn sudo composer install --no-dev --prefer-source --no-plugins --no-scripts
expect \"Continue as root/super user?\"
send \"yes\r\"
expect eof
")
echo "$COMPOSER_2"
sleep 10

错误原因

  1. 超时设置缺失:Composer更新/安装依赖耗时较长,默认超时会导致进程提前结束,Expect无法找到匹配的spawn进程。
  2. 匹配字符串不灵活:Composer的提示文本可能存在细微差异(如大小写、空格),精确匹配容易失败。
  3. 未处理sudo密码交互:如果当前用户执行sudo需要输入密码,会导致Expect无法匹配预期的Composer提示,进程异常终止。

修复方案

方案1:使用Composer非交互模式(推荐)

Composer支持--no-interaction(简写-n)参数,直接跳过所有交互确认提示,无需依赖Expect处理发送操作,从根源避免问题。

修改相关代码块为:

# 执行Composer更新,跳过交互
sudo composer update --no-plugins --no-scripts --no-interaction
sleep 10

# 执行Composer安装,跳过交互
sudo composer install --no-dev --prefer-source --no-plugins --no-scripts --no-interaction
sleep 10

方案2:修复Expect脚本逻辑

如果必须使用Expect处理交互,调整脚本如下:

COMPOSER_1=$(expect -c "
# 设置足够长的超时时间(300秒)
set timeout 300
spawn sudo composer update --no-plugins --no-scripts

# 处理两种可能的交互:sudo密码提示、Composer确认提示
expect {
    \"[sudo] password for *:\" {send \"你的sudo密码\r\"; exp_continue}
    \"*Continue as root/super user?*\" {send \"yes\r\"; exp_continue}
    eof
}
")
echo "$COMPOSER_1"
sleep 10

COMPOSER_2=$(expect -c "
set timeout 300
spawn sudo composer install --no-dev --prefer-source --no-plugins --no-scripts

expect {
    \"[sudo] password for *:\" {send \"你的sudo密码\r\"; exp_continue}
    \"*Continue as root/super user?*\" {send \"yes\r\"; exp_continue}
    eof
}
")
echo "$COMPOSER_2"
sleep 10

修复要点:

  • 增加超时时间:避免因依赖下载耗时过长导致进程提前终止。
  • 灵活匹配提示:用通配符*包裹预期字符串,兼容提示文本的细微差异。
  • 处理sudo密码:提前加入sudo密码的匹配逻辑,确保进程能正常进入Composer操作环节。

内容的提问来源于stack exchange,提问作者Parthasarathi Pradhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:25:32