シェル スクリプト内に 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
この問題は、「FireEye AX」によって提供される$authKey内の改行または復帰改行によって発生するようです。
パイプ処理によって復帰改行文字を取り除くことができる。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 がサブシェルに渡されるかどうかは覚えていません...代わりに 1 行で試してみると、うまくいくかもしれません:
authKey=$(printf "%s" "${BASH_REMATCH[1]}" | tr -d '\r\n')
答え2
提供されたデータ ファイルには、Unix/Linux の行末 (LF) ではなく、Windows スタイルの行末 (CR/LF) が含まれていると思われます。
この代替パターン マッチでは、末尾の CR が除外されます。
[[ $line =~ ^SOME-PATTERN:[[:space:]](([^\015]*) ]]
authKey="${BASH_REMATCH[1]}"