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

Expect脚本中带Header的wget命令无法执行问题排查

Expect脚本中wget命令执行失败的引号问题

我写了如下Expect脚本,想要调用wget从Artifactory下载文件:

#!/usr/bin/expect -f

set SRCFILE /tmp/cert.zip
set SRC https://na.artifactory.swg-devops.com/artifactory/generic-local//latest/misc/copy_zips//cert.zip
set PASSWD XYZ

set cmd "wget --header \"Authorization: Bearer $PASSWD\" -O $SRCFILE $SRC"
eval spawn $cmd

问题是脚本里的wget命令始终无法执行,但以下两种场景都能正常运行:

  1. 在Linux命令行直接执行:
wget --header Authorization: Bearer XYZ -O /tmp/cert.zip https://na.artifactory.swg-devops.com/artifactory/generic-local//latest/misc/copy_zips//cert.zip
  1. 在Expect交互模式执行:
expect1.1> spawn wget --header "Authorization: Bearer XYZ" -O /tmp/cert.zip https://na.artifactory.swg-devops.com/artifactory/generic-local//latest/misc/copy_zips//cert.zip

spawn wget --header Authorization: Bearer XYZ -O /tmp/cert.zip https://na.artifactory.swg-devops.com/artifactory/generic-local//latest/misc/copy_zips//cert.zip
2815

我尝试过以下几种写法,都没解决问题:

set cmd 'wget --header "Authorization: Bearer $PASSWD" -O $SRCFILE $SRC'

set cmd "wget --header "Authorization: Bearer $PASSWD" -O $SRCFILE $SRC"

问题原因与解决方案

核心问题是Tcl/Expect中字符串拼接+eval执行会破坏带空格的参数边界:

  • 把命令拼成字符串再用eval spawn执行时,eval会按空格拆分整个字符串,导致Authorization: Bearer XYZ被拆成三个独立参数,而wget需要的是一个完整的--header参数值。
  • 用单引号包裹字符串时,Tcl不会展开$PASSWD变量,导致参数值错误;嵌套双引号的写法不符合Tcl语法,转义后仍会被eval错误拆分。

最直接的解决方法是直接给spawn传递命令和参数列表,不要拼成单个字符串:

#!/usr/bin/expect -f

set SRCFILE /tmp/cert.zip
set SRC https://na.artifactory.swg-devops.com/artifactory/generic-local//latest/misc/copy_zips//cert.zip
set PASSWD XYZ

# 直接传递参数列表,spawn会正确处理带空格的参数
spawn wget --header "Authorization: Bearer $PASSWD" -O $SRCFILE $SRC

这种写法和你在Expect交互模式中执行的逻辑完全一致,spawn会自动识别每个参数的边界,不会拆分带空格的--header值,命令就能正常执行了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:55:32