Chef新手求助:如何通过CLI为Ubuntu下Dropbox安装脚本提供交互响应
解决Chef中Dropbox交互式安装的问题
你遇到的问题核心在于:bash脚本本身不支持expect的语法,你直接把expect的expect和send命令混在bash代码里,bash根本识别不了这些指令,所以交互逻辑完全没生效。
别担心,我们可以通过正确调用expect工具来处理Dropbox的交互式安装,下面是具体的解决方案:
步骤1:先安装expect工具
首先要确保目标系统上安装了expect,因为它是处理交互式命令的必备工具,在Chef里可以用package资源来安装:
package 'expect' do action :install end
步骤2:修改bash资源,用expect包裹交互逻辑
我们需要用expect -c来执行内嵌的expect脚本,把处理Dropbox交互的逻辑放在单引号里,这样bash就能正确调用expect来处理交互了:
bash 'DropboxInstall' do user 'root' cwd '/opt/dropbox' code <<-EOH # 用expect处理Dropbox的交互式安装 expect -c ' spawn dropbox start -i # 精准匹配关键提示字符串(避免过长导致匹配失败) expect "In order to use Dropbox, you must download the proprietary daemon. [y/n]" send "y\\r" # 等待命令执行完成再退出 expect eof ' # 开启开机自启 dropbox autostart y EOH end
额外优化建议
如果你的交互逻辑比较复杂,也可以把expect脚本单独写成文件,这样代码更清晰易维护:
- 在你的Chef cookbook里创建一个模板文件
templates/default/dropbox_install.exp.erb,内容如下:
#!/usr/bin/expect -f spawn dropbox start -i expect "In order to use Dropbox, you must download the proprietary daemon. [y/n]" send "y\r" expect eof
- 然后在Chef recipe里部署这个脚本并执行:
# 部署expect脚本 template '/opt/dropbox/dropbox_install.exp' do source 'dropbox_install.exp.erb' mode '0755' owner 'root' end # 执行安装脚本并设置自启 bash 'Run Dropbox Install' do user 'root' cwd '/opt/dropbox' code './dropbox_install.exp && dropbox autostart y' end
注意事项
- 确保
/opt/dropbox目录已经存在,如果没有,需要先添加directory资源创建它 - 如果匹配提示失败,可以尝试缩短匹配的字符串(比如只匹配
[y/n]),或者用expect -d参数调试,查看expect是否正确捕获到了输出 - 确认目标系统已经提前解压了Dropbox的基础包到
/opt/dropbox目录(如果还没处理,也可以在Chef里用remote_file和execute资源来完成下载解压)
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

