내 쉘 스크립트 안에 서버에서 오류 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]}"