mhard666
Goto Top

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:

# 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... face-wink

Danke.

VG. mhard666

Content-ID: 3092314688

Url: https://administrator.de/contentid/3092314688

Ausgedruckt am: 22.11.2024 um 01:11 Uhr

HanTrio
Lösung HanTrio 16.06.2022 um 17:24:46 Uhr
Goto Top
Wenn ich mir das hier ansehe:
root@client:˜# $hn
-bash: $'debsrv02\r': command not found  
root@client:˜# $h
-bash: debsrv02: command not found
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:
cat -v /path/to/file
-> 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=$(ssh user@server -t hostname | dos2unix)
mhard666
mhard666 16.06.2022 um 20:33:02 Uhr
Goto Top
Hi,

stimmt, hätte ich auch drauf kommen können.
hostname
gibt ja den Hostnamen aus und macht einen Zeilenumbruch...

Die Lösung finde ich aber aus einem einfachen Grund unelegant: dos2unix ist bei mir nicht installiert und ich will auf meinem Produktivsystem nicht übermäßig Kram nachinstallieren.

Geht aber auch mit Boardmitteln:

root@client:˜# hn=$(ssh user@server -t hostname | tr -d "\r") 
root@client:˜# $hn
-bash: debsrv02: command not found

...und steht sogar in dem von Dir genannten Artikel als Lösung face-wink

Danke nochmal.

VG Mirko.
colinardo
Lösung colinardo 17.06.2022 aktualisiert um 11:59:29 Uhr
Goto Top
Servus.
ein
hn=$(ssh user@server echo \$HOSTNAME)
würde bei einer Bash-Shell auch reichen.

Grüße Uwe
mhard666
mhard666 19.06.2022 aktualisiert um 13:26:44 Uhr
Goto Top
Hi colinardo,

ja, das tut's in dem Fall auch. Danke.

Witzigerweise hatte ich im selben Script noch einen weiteren Anwendungsfall, wo über SSH eine Liste von sha256-Hashs geholt wird, die ich über eine while-Schleife iteriere. Am Ende jeder Zeile ist dann auch wieder ein Zeilenumbruch. Ich zerlege dann die Zeile in Hash und Dateipfad und ermittle aus dem Dateipfad den Dateinamen. Mit dem Zeilenumbruch am Ende ging das immer in die Hose.
Das Garstige daran ist, dass man das so ohne Weiteres nicht sieht und wenn man nicht daran denkt, sucht man sich halb blöd, weil das Script nicht so läuft wie es sollte.

VG mhard666.