내 쉘 스크립트에는 서버에서 오류 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가 서브쉘에 전달되었는지 기억이 나지 않습니다... 한 줄로 시도해 볼 수 있습니다. 아마도 작동할 것입니다.
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]}"