
Estoy intentando guardar el valor de un comando curl en una variable en un script bash.
El guión se ve así
#!/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
Estoy pasando deliberadamente la contraseña incorrecta para que curl devuelva HTTP/1.1 401 no autorizado. Quiero una función para verificar si se envían credenciales incorrectas a un servidor.
Lo extraño es que cuando guardo el resultado del comando curl, es decir
HTTP_STATUS=$(curl -IL --silent $username:$password@$IP_addr | grep HTTP | tee $curr/test.txt)
En un archivo con tee, obtengo esto impreso en el archivo HTTP/1.1 401 No autorizado. Pero si elimino el comando tee, es decir
HTTP_STATUS=$(curl -IL --silent $username:$password@$IP_addr | grep HTTP)
Y ejecute el script que obtengo después de imprimir en la 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
Intenté con lo siguiente también pero obtuve el mismo resultado.
HTTP_STATUS=`curl -IL --silent $username:$password@$IP_addr | grep HTTP`
La variable HTTP_STATUS parece estar en blanco cuando hago las comprobaciones en las declaraciones if. ¿Cómo es esto posible y por qué la salida del comando se guarda en un archivo con tee y echo? La variable funciona pero no cuando se usa la variable en las declaraciones if.
Atentamente
Respuesta1
El protocolo HTTP requiere que las líneas de encabezado terminen con <CR><LF> (retorno de carro y avance de línea, \r\n
en notación UNIX). Para ver lo que curl
realmente regresa, puedes probar:
curl -IL --silent $username:$password@$IP_addr | grep HTTP | cat -v
En UNIX, <LF> termina la línea de texto y <CR> es simplemente un carácter común y corriente sin significado especial. La aparente falta $isOK
en los mensajes posteriores se debe al <CR> final, que mueve el cursor hacia atrás al principio de la línea. En detalle, la línea
echo "$isOK is not the same as $status"
escribe
HTTP/1.1 401 Unauthorized<CR>
is not the same as HTTP/1.1 401 Unauthorized
ambos en la misma línea.