%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89%E5%80%A4%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB%E5%A4%89%E6%95%B0%E3%81%8C%E6%AD%A3%E3%81%97%E3%81%8F%E6%B8%A1%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%81%8B%3F.png)
シェル スクリプト内に 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]}"