You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

优化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

火山引擎 最新活动