Variable leer, wenn sie in einer if-Anweisung verwendet wird, aber nicht in einem Echo

Variable leer, wenn sie in einer if-Anweisung verwendet wird, aber nicht in einem Echo

Ich versuche, den Wert eines Curl-Befehls in einer Variablen in einem Bash-Skript zu speichern.

Das Skript sieht so aus

#!/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

Ich gebe absichtlich das falsche Passwort weiter, damit curl HTTP/1.1 401 Unauthorized zurückgibt. Ich möchte eine Funktion, die überprüft, ob falsche Anmeldeinformationen an einen Server gesendet werden.

Das Seltsame ist, dass wenn ich die Ausgabe des Curl-Befehls speichere, d. h.

HTTP_STATUS=$(curl -IL --silent $username:$password@$IP_addr | grep HTTP | tee $curr/test.txt)

In einer Datei mit tee bekomme ich dies in der Datei HTTP/1.1 401 Unauthorized ausgegeben. Aber wenn ich den tee-Befehl entferne, d. h.

HTTP_STATUS=$(curl -IL --silent $username:$password@$IP_addr | grep HTTP)

Und führen Sie das Skript aus, das ich erhalte, indem Sie im Terminal drucken

./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

Ich habe es auch mit Folgendem versucht, aber das Ergebnis war dasselbe

HTTP_STATUS=`curl -IL --silent $username:$password@$IP_addr | grep HTTP`

Die Variable HTTP_STATUS scheint leer zu sein, wenn ich die Prüfungen in den if-Anweisungen durchführe. Wie ist das möglich und warum wird die Ausgabe des Befehls in einer Datei gespeichert, wenn tee und echo der Variable funktionieren, aber nicht, wenn die Variable in den if-Anweisungen verwendet wird?

Beste grüße

Antwort1

Das HTTP-Protokoll erfordert, dass Headerzeilen mit <CR><LF> (Wagenrücklauf und Zeilenvorschub, \r\nin UNIX-Notation) enden. Um zu sehen, was curltatsächlich zurückgegeben wird, können Sie Folgendes versuchen:

curl -IL --silent $username:$password@$IP_addr | grep HTTP | cat -v

Unter UNIX beendet <LF> die Textzeile, und <CR> ist nur ein gewöhnliches Zeichen ohne besondere Bedeutung. Das scheinbare Fehlen $isOKin den nachfolgenden Nachrichten ist auf das abschließende <CR> zurückzuführen, das den Cursor an den Zeilenanfang zurückbewegt. Im Detail ist die Zeile

echo "$isOK is not the same as $status"

schreibt aus

HTTP/1.1 401 Unauthorized<CR>
 is not the same as HTTP/1.1 401 Unauthorized

beide auf derselben Leitung.

verwandte Informationen