
Estou tentando salvar o valor de um comando curl em uma variável em um script bash.
O roteiro fica assim
#!/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
Estou passando deliberadamente a senha errada para que o curl retorne HTTP/1.1 401 Unauthorized. Quero uma função para verificar se credenciais erradas são enviadas para um servidor.
O estranho é que quando eu salvo a saída do comando curl, ou seja
HTTP_STATUS=$(curl -IL --silent $username:$password@$IP_addr | grep HTTP | tee $curr/test.txt)
Para um arquivo com tee, imprimo isso no arquivo HTTP/1.1 401 Unauthorized. Mas se eu remover o comando tee, ou seja
HTTP_STATUS=$(curl -IL --silent $username:$password@$IP_addr | grep HTTP)
E execute o script que recebo após imprimir no terminal
./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
Eu tentei seguir também, mas o mesmo resultado
HTTP_STATUS=`curl -IL --silent $username:$password@$IP_addr | grep HTTP`
A variável HTTP_STATUS parece estar em branco quando faço as verificações nas instruções if. Como isso é possível e por que a saída do comando é salva em um arquivo com tee e echo a variável funciona, mas não ao usar a variável nas instruções if?
Atenciosamente
Responder1
O protocolo HTTP exige que as linhas do cabeçalho terminem com <CR><LF> (retorno de carro e avanço de linha, \r\n
em notação UNIX). Para ver o que curl
realmente retorna, você pode tentar:
curl -IL --silent $username:$password@$IP_addr | grep HTTP | cat -v
No UNIX, <LF> termina a linha de texto e <CR> é apenas um caractere comum sem significado especial. A aparentemente falta $isOK
nas mensagens subsequentes é devido ao <CR> final, que move o cursor de volta ao início da linha. Em detalhes, a linha
echo "$isOK is not the same as $status"
escreve
HTTP/1.1 401 Unauthorized<CR>
is not the same as HTTP/1.1 401 Unauthorized
ambos na mesma linha.