
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\n
in UNIX-Notation) enden. Um zu sehen, was curl
tatsä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 $isOK
in 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.