使用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
错误原因
- 超时设置缺失:Composer更新/安装依赖耗时较长,默认超时会导致进程提前结束,Expect无法找到匹配的spawn进程。
- 匹配字符串不灵活:Composer的提示文本可能存在细微差异(如大小写、空格),精确匹配容易失败。
- 未处理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
相关产品推荐
相关产品推荐

