Bash: SSH output in Variable weiterverarbeiten
Hallo allerseits,
folgendes Problem:
In einem Shell-Script (bash) ermittle ich via SSH den Hostnamen des entfernten Rechners. Diesen möchte ich mit der Vorgabe vergleichen. Der Vergleich schlägt immer fehl und innerhalb der if-Schleife ist die Variable die den ermittelten Hostnamen enthalten sollte leer. Beispiel anbei:
Irgendwie ist die Variable, die ich aus dem SSH-Befehl zurückbekomme in einem anderen Format, als die $h-Variable. Ich denke, dass das irgendwie damit zusammenhängt. Ist mir nur unverständlich, warum innerhalb der if-Anweisung die Variable $hn mit echo nicht so ausgegeben wird wie außerhalb der if-Anweisung. Wie kann ich beide vergleichen, bzw. beide in das gleiche Format bekommen, damit ich sie vergleichen kann?
Ist bestimmt simpel, aber ich steh gerade auf dem Schlauch...
Danke.
VG. mhard666
folgendes Problem:
In einem Shell-Script (bash) ermittle ich via SSH den Hostnamen des entfernten Rechners. Diesen möchte ich mit der Vorgabe vergleichen. Der Vergleich schlägt immer fehl und innerhalb der if-Schleife ist die Variable die den ermittelten Hostnamen enthalten sollte leer. Beispiel anbei:
# Hostname zum Vergleich in Variable festlegen
#
root@client:˜# h="debsrv02"
root@client:˜#
# Hostname per SSH ermitteln und anzeigen
#
root@client:˜# ssh user@server -t hostname 2>&1
debsrv02
Connection to server closed.
root@client:˜#
# Hostname per SSH ermitteln und in Variable schreiben
#
root@client:˜# hn=$(ssh user@server -t hostname)
Connection to server closed.
root@client:˜#
# Variablen ausgeben
#
root@client:˜# echo ermittelter Hostname: $hn
ermittelter Hostname: debsrv02
root@client:˜# echo Hostname Vorgabe: $h
Hostname Vorgabe: debsrv02
root@client:˜#
# Variablen falsch ausgeben
#
root@client:˜# $hn
-bash: $'debsrv02\r': command not found
root@client:˜# $h
-bash: debsrv02: command not found
root@client:˜#
# Vergleich
#
root@client:˜# if [[ "$hn" == "$h" ]]; then echo $hn equal $h; else echo $hn not equal $h; fi
not equal debsrv02
root@client:˜#
Irgendwie ist die Variable, die ich aus dem SSH-Befehl zurückbekomme in einem anderen Format, als die $h-Variable. Ich denke, dass das irgendwie damit zusammenhängt. Ist mir nur unverständlich, warum innerhalb der if-Anweisung die Variable $hn mit echo nicht so ausgegeben wird wie außerhalb der if-Anweisung. Wie kann ich beide vergleichen, bzw. beide in das gleiche Format bekommen, damit ich sie vergleichen kann?
Ist bestimmt simpel, aber ich steh gerade auf dem Schlauch...
Danke.
VG. mhard666
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3092314688
Url: https://administrator.de/contentid/3092314688
Ausgedruckt am: 22.11.2024 um 01:11 Uhr
4 Kommentare
Neuester Kommentar
Wenn ich mir das hier ansehe:
gibt es da tatsächlich einen Unterschied zwischen den beiden Outputs, nämlich das "\r"
Das ist ein sog. "carriage return"-Zeichen, und es wird von der bash tatsächlich als zusätzliches Zeichen interpretiert, was in diesem Fall eben den Unterschied der beiden Outputs ausmacht.
Also, du liest remote den Hostnamen aus, und bekomst dabei einen Text zurück, bei dem so ein carriage return-Zeichen hinten dran hängt.
Du könntest es überprüfen, indem du die Werte der beiden Variablen einfach mal in ein Textfile reinschreibst, und dieses anschließend ausliest mit einem:
-> Da sollte der Unterschied offensichtlich werden, denn dabei werden mit dem "-v" auch "non-printing characters" dargestellt, also die, die normalerweise "unsichtbar" sind.
Hier ganz gut erklärt:
https://superuser.com/questions/489180/remove-r-from-echoing-out-in-bash ...
Man könnte mal ausprobieren, ob der dort vorgeschlagene Weg mit dos2unix funktioniert, dann könnte man z.B. dies hier versuchen, um die Variable einzulesen:
root@client:˜# $hn
-bash: $'debsrv02\r': command not found
root@client:˜# $h
-bash: debsrv02: command not found
Das ist ein sog. "carriage return"-Zeichen, und es wird von der bash tatsächlich als zusätzliches Zeichen interpretiert, was in diesem Fall eben den Unterschied der beiden Outputs ausmacht.
Also, du liest remote den Hostnamen aus, und bekomst dabei einen Text zurück, bei dem so ein carriage return-Zeichen hinten dran hängt.
Du könntest es überprüfen, indem du die Werte der beiden Variablen einfach mal in ein Textfile reinschreibst, und dieses anschließend ausliest mit einem:
cat -v /path/to/file
Hier ganz gut erklärt:
https://superuser.com/questions/489180/remove-r-from-echoing-out-in-bash ...
Man könnte mal ausprobieren, ob der dort vorgeschlagene Weg mit dos2unix funktioniert, dann könnte man z.B. dies hier versuchen, um die Variable einzulesen:
root@client:˜# hn=$(ssh user@server -t hostname | dos2unix)