优化Bash脚本中的Expect逻辑:设置超时时间并实现退出码判断
优化Bash脚本中的Expect逻辑:设置超时时间并实现退出码判断
嗨,我来帮你搞定这个脚本的问题!你提到的超时不稳定和退出码需求,咱们可以通过调整Expect的配置和增加状态判断来解决,下面是具体的修改方案:
1. 调整超时时间并处理超时场景
Expect默认的10秒超时确实容易在命令执行较慢时出问题,咱们可以在spawn命令之前加上set timeout 60,把超时时间改成60秒。同时还要增加超时后的处理逻辑,避免脚本默默失败。
2. 增加退出码判断逻辑
咱们可以让Expect脚本根据执行结果返回不同的退出码,这样Bash脚本就能捕获这个状态,明确知道操作是否成功:
- 成功匹配到
profiles: Bootstrap Token escrowed时,返回0(代表操作成功) - 超时或者匹配到错误提示(比如密码错误、权限不足等)时,返回1(代表操作失败)
修改后的完整脚本
# Get Jamf Pro Parameters base64username=$4 base64password=$5 # Decode Base64 Parameters username="$(echo "$base64username" | base64 -d)" password="$(echo "$base64password" | base64 -d)" # Escrow Bootstrap Token expect -c " # 设置全局超时时间为60秒 set timeout 60 spawn profiles install -type bootstraptoken # 等待用户名输入提示 expect \"Enter the admin user name:\" send \"$username\r\" # 等待密码输入提示 expect \"Enter the password for user '$username':\" send \"$password\r\" # 同时监听成功提示、超时事件和错误输出 expect { \"profiles: Bootstrap Token escrowed\" { send_user \"Bootstrap Token托管成功!\n\" exit 0 } timeout { send_user \"错误:操作超时,未能完成Bootstrap Token托管\n\" exit 1 } \"profiles: *\" { send_user \"错误:托管失败,返回信息:$expect_out(buffer)\n\" exit 1 } } " # 捕获Expect脚本的退出码,做后续处理 expect_exit_code=$? if [ $expect_exit_code -ne 0 ]; then echo "脚本执行失败,退出码:$expect_exit_code" exit $expect_exit_code fi
关键修改说明
set timeout 60:覆盖Expect默认的10秒超时,给命令足够的执行时间- 多分支
expect语句:同时监听成功提示、超时事件,以及所有以profiles:开头的错误输出,确保各种异常情况都能被捕获 - 明确的
exit指令:每个分支都返回对应的退出码,Bash脚本通过$?捕获这个值,方便后续的错误处理或流程判断 send_user:在终端输出状态信息,方便你排查执行过程中的问题
这样修改后,脚本不仅能适配更长的命令执行时间,还能明确返回操作结果的状态,整个流程会更可靠。
备注:内容来源于stack exchange,提问作者Melvin-P-NL




