컬 명령의 값을 bash 스크립트의 변수에 저장하려고 합니다.
스크립트는 다음과 같습니다
#!/bin/bash
curr=$(pwd)
IP_addr="192.168.0.102"
username="root"
password="pass"
HTTP_STATUS=$(curl -IL --silent $username:$password@$IP_addr | grep HTTP)
echo
echo "echo the variable works!"
echo $HTTP_STATUS
isOK=$(echo $HTTP_STATUS)
status="HTTP/1.1 401 Unauthorized"
echo
if [[ $HTTP_STATUS == $status ]]; then
echo "The same the same!"
else
echo "$isOK is not the same as $status"
fi
echo
if [ "$status" == "$isOK" ]
then
echo "The same the same!"
else
echo "$isOK is not the same as $status"
fi
컬이 HTTP/1.1 401 Unauthorized를 반환하도록 의도적으로 잘못된 비밀번호를 전달하고 있습니다. 잘못된 자격 증명이 서버로 전송되었는지 확인하는 기능이 필요합니다.
이상한 점은 컬 명령의 출력을 저장할 때 즉,
HTTP_STATUS=$(curl -IL --silent $username:$password@$IP_addr | grep HTTP | tee $curr/test.txt)
tee가 있는 파일의 경우 HTTP/1.1 401 Unauthorized 파일에 인쇄합니다. 하지만 tee 명령을 제거하면 즉
HTTP_STATUS=$(curl -IL --silent $username:$password@$IP_addr | grep HTTP)
터미널에서 인쇄한 후 얻은 스크립트를 실행합니다.
./test.sh
echo the variable works!
HTTP/1.1 401 Unauthorized
is not the same as HTTP/1.1 401 Unauthorized
is not the same as HTTP/1.1 401 Unauthorized
나는 또한 다음을 시도했지만 같은 결과를 얻었습니다
HTTP_STATUS=`curl -IL --silent $username:$password@$IP_addr | grep HTTP`
if 문을 확인해 보니 HTTP_STATUS 변수가 비어 있는 것 같습니다. 어떻게 이럴 수있어? if 문에서 변수를 사용할 때 tee 및 echo 변수를 사용하여 명령 출력을 파일에 저장하는 것이 작동하지 않는 이유는 무엇입니까?
감사합니다
답변1
HTTP 프로토콜에는 \r\n
<CR><LF>(캐리지 리턴 및 줄 바꿈, UNIX 표기법)로 끝나는 헤더 행이 필요합니다. 실제로 반환된 내용을 확인하려면 curl
다음을 시도해 보세요.
curl -IL --silent $username:$password@$IP_addr | grep HTTP | cat -v
UNIX에서 <LF>는 텍스트 줄을 끝내고 <CR>은 특별한 의미가 없는 일반 문자입니다. 후속 메시지에서 명백한 부재는 $isOK
커서를 줄의 시작 부분으로 다시 이동시키는 후행 <CR>입니다. 자세하게는 라인
echo "$isOK is not the same as $status"
써
HTTP/1.1 401 Unauthorized<CR>
is not the same as HTTP/1.1 401 Unauthorized
둘 다 같은 라인에 있습니다.