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命令始终无法执行,但以下两种场景都能正常运行:
- 在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
- 在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
相关产品推荐
相关产品推荐

