我的 shell 脚本中有这部分curl 命令,它导致服务器出现错误 500 响应。但是,当我手动运行命令时,此代码可以工作。
curl -qgsSkH "Content-Type: multipart/form-data" --no-progress-bar --header "Token: $authKey" -F "filename=@$compressedFileName" -F "options={\"application\":\"2\",\"timeout\":\"5000\"}" https://www.domain.com > results.txt
有人知道为什么吗?
编辑: 我进行了一些手动调试,发现问题是由变量 $authKey 引起的。该变量是由我的脚本中的以下代码获取的。
# Get authentication key from FireEye AX response
while read line
do
if [[ $line =~ ^SOME-PATTERN:[[:space:]](.*) ]]
then
authKey="${BASH_REMATCH[1]}"
fi
done <auth.txt
如果我使用类似以下内容重新定义此变量,则脚本将起作用。
authKey="TheAuthenticationKey"
但为什么会出现这种情况呢?当我逐行读取文件时,我从文件中传递字符串的前面部分已经传递了正确的值(我通过将输出回显到 txt 文件来进行双重检查)。
编辑 我设法进一步深入。当我尝试将令牌的值回显到文件并将“添加到字符串的开头和结尾时,我得到了这个结果。
"X-FeApi-Token: IDR+jxU1kB5ZpXsRNAgqfjTxkjZ0L2atH+l0H/NeatWDAJs=
"
我不知道如何删除那个新线。有人可以建议吗?
答案1
该问题似乎是由 $authKey 中的换行符或回车符和换行符引起的,由“FireEye AX”提供
您可以通过管道将回车符和换行符去掉tr -d '\r\n'
例如
# Get authentication key from FireEye AX response
while read line
do
if [[ $line =~ ^SOME-PATTERN:[[:space:]](.*) ]]
then
authKey="${BASH_REMATCH[1]}"
authKey=$(printf "%s" "$authKey" | tr -d '\r\n')
fi
done <auth.txt
我不记得 $BASH_REMATCH 是否会传递到子 shell...您可以在一行中尝试它,也许它会起作用:
authKey=$(printf "%s" "${BASH_REMATCH[1]}" | tr -d '\r\n')
答案2
我猜测您提供的数据文件具有 Windows 样式的行结尾 (CR/LF),而不是 Unix/Linux 的行结尾 (LF)。
此替代模式匹配将排除任何可能的尾随 CR:
[[ $line =~ ^SOME-PATTERN:[[:space:]](([^\015]*) ]]
authKey="${BASH_REMATCH[1]}"