Variável em branco quando usada em if, mas não em eco

1

Estou tentando salvar o valor de um comando curl em uma variável em um script bash.

O script se parece com isso

#!/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 deliberadamente passando a senha errada para que o curl retorne HTTP / 1.1 401 Unauthorized. Eu quero uma função para verificar se as credenciais erradas são enviadas para um servidor.

O mais 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, recebo isto impresso 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 eu 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 ecoa a variável funciona, mas não quando a variável é usada nas instruções if?

Atenciosamente

    
por S4M1R 17.12.2016 / 18:21

1 resposta

2

O protocolo HTTP exige que as linhas de cabeçalho terminem com < CR > < LF > (retorno de carro e avanço de linha, \r\n na notação do 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 personagem comum sem significado especial. O $isOK aparentemente ausente nas mensagens subsequentes é devido ao < CR & gt ;, que move o cursor de volta no início da linha. Em detalhe, 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.

    
por 17.12.2016 / 18:58

Tags