[erledigt] Bash-Script mit Schleife und sshpass bricht ab

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Exxter
Beiträge: 383
Registriert: 10.01.2003 00:15:15
Lizenz eigener Beiträge: GNU General Public License

[erledigt] Bash-Script mit Schleife und sshpass bricht ab

Beitrag von Exxter » 08.05.2019 15:04:09

Hallo,

ich schreibe ein Bash-Script (unter Debian Stretch) welches beim ersten Treffer abbricht. Ich möchte einen Wert auf einem Remote-Rechner (einem Hardware-Router) per ssh auslesen und weiterverarbeiten / speichern. Das Script:

Code: Alles auswählen

#!/bin/bash

cat ips.txt |  while read output

do
    ping -c 1 "$output" > /dev/null
    if [ $? -eq 0 ]; then
        echo "$output ist an"
        modell=`sshpass -p PASSWORT ssh -o StrictHostKeyChecking=no root@$output 'status -v sys'`
        #modell=$(sshpass -p "PASSWORT" ssh -o StrictHostKeyChecking=no root@$output "status -v sys" | grep "Product Name" | sed -e "s/Product Name     : //")
        echo "$modell"
    else
        echo "$output ist aus"
    fi
done
Wenn ich die Zeile mit modell ausklammere, läuft das Script durch, mit bricht es nach dem ersten erfolgreichen Fund und der Ausgabe von "status -v sys " ab. Theoretisch muss es was mit sshpass zu tun haben.

Der Befehl allein funktioniert:

Code: Alles auswählen

root@ycloud:~/$ sshpass -p PASSWORT ssh -o StrictHostKeyChecking=no root@10.0.1.1 'status -v sys'
Product Name     : XR5i-v2
Product Type     : N/A
Firmware Version : 6.1.8 (2018-11-08)
Serial Number    : 5329398
Profile          : Standard
Supply Voltage   : 26.5 V
Temperature      : 39 �C
CPU Usage        : 100%
Memory Usage     : 17104 KB / 59084 KB
Time             : 2019-05-08 14:22:36
Uptime           : 0 days, 12 hours, 22 minutes
root@ycloud:~/$
Gleicher Abbruch passiert aber auch, wenn ich zB. 'cat /etc/version' (Inhalt: "6.1.8 (2018-11-08)") ausführen lasse im Script, es kann also nichts mit dem Output zu tun haben.
Später soll nur noch das Modell, zB. "XR5i-v2" als Ausgabe herauskommen, das grep und sed im Script hat aber auch noch nicht geklappt (allein funktioniert der ausgeklammerte Befehl).

Und jetzt mal das Script ausgeführt:

Code: Alles auswählen

root@ycloud:~/$ ./neu.sh
10.0.0.1 ist aus
10.0.1.1 ist an
Product Name     : XR5i-v2
Product Type     : N/A
Firmware Version : 6.1.8 (2018-11-08)
Serial Number    : 5329398
Profile          : Standard
Supply Voltage   : 26.5 V
Temperature      : 39 �C
CPU Usage        : 100%
Memory Usage     : 17116 KB / 59084 KB
Time             : 2019-05-08 14:52:54
Uptime           : 0 days, 12 hours, 52 minutes
root@ycloud:~/$
Jemand eine Idee woran es hängen könnte? Habe auch schon versucht, da "status -v sys" ja ein extra Command und auf dem anderen Gerät ausgeführt werden soll, es in \` zu setzen, da kracht es aber auch.

Und wenn ich statt dem sshpass-Befehl zB. "ls /etc/samba/" nehme, wird auch alles korrekt ausgeführt:

Code: Alles auswählen

root@ycloud:~/$ ./neu.sh
10.0.53.1 ist aus
10.0.0.1 ist aus
10.0.1.1 ist an
gdbcommands
smb.conf
smb.conf-old
tls
10.0.10.1 ist an
gdbcommands
smb.conf
smb.conf-old
tls
10.0.11.1 ist an
gdbcommands
smb.conf
smb.conf-old
tls
10.0.12.1 ist an
gdbcommands
smb.conf
[...]
Habe auch schon mit set +e und || true rumprobiert - nichts hilft, es bricht immer nach dem ersten Fund ab.

Ah, vielleicht etwas weitergekommen. Wenn ich set -vx setze kommt:

Code: Alles auswählen

[...]
10.0.53.1 ist aus
+ read ip
+ ping -c 1 10.0.0.1
+ '[' 1 -eq 0 ']'
+ echo '10.0.0.1 ist aus'
10.0.0.1 ist aus
+ read ip
+ ping -c 1 10.0.1.1
+ '[' 0 -eq 0 ']'
+ echo '10.0.1.1 ist an'
10.0.1.1 ist an
+ sshpass -p PASSWORT ssh -o StrictHostKeyChecking=no root@10.0.1.1 'status -v sys'
Product Name     : XR5i-v2
Product Type     : N/A
Firmware Version : 6.1.8 (2018-11-08)
Serial Number    : 5329398
Profile          : Standard
Supply Voltage   : 26.5 V
Temperature      : 41 �C
CPU Usage        : 100%
Memory Usage     : 17100 KB / 59084 KB
Time             : 2019-05-09 14:10:04
Uptime           : 0 days, 12 hours, 10 minutes
+ read ip

exit 0
+ exit 0
root@ycloud:~/$
Da kommt 2x exit 0, aber wieso?
Zuletzt geändert von Exxter am 16.07.2019 09:38:19, insgesamt 1-mal geändert.

Exxter
Beiträge: 383
Registriert: 10.01.2003 00:15:15
Lizenz eigener Beiträge: GNU General Public License

Re: Bash-Script mit Schleife und sshpass bricht ab

Beitrag von Exxter » 14.05.2019 07:51:19

Keiner eine Idee? :cry:

uname
Beiträge: 12075
Registriert: 03.06.2008 09:33:02

Re: Bash-Script mit Schleife und sshpass bricht ab

Beitrag von uname » 14.05.2019 08:28:43

Leider habe ich gar keine Ahnung. Aber es gibt Quellen im Internet, wo "ssh -T" verwendet wird. Der Aufwand das ausprobieren sollte nicht zu groß sein. Ob es hilft, weiß ich nicht.
man ssh hat geschrieben: -T Disable pseudo-terminal allocation.
https://serverfault.com/questions/59339 ... nal-in-ssh

Sollte auch das nicht funktionieren, so minimiere dein Script.
Lass die if-Abfrage (if [ $? -eq 0 ]; then ...) weg und unterstelle erst mal, dass alle getesteten Systeme online sind.

Etwa so (ungetestet, -T eingefügt, Backticks habe ich durch $() ersetzt ... gefällt mir optisch besser ;-) ):

Code: Alles auswählen

#!/bin/bash
cat ips.txt |  while read output
do
         modell=$(sshpass -p PASSWORT ssh -T -o StrictHostKeyChecking=no root@$output 'status -v sys')
         echo "$modell"
done
Führe die funktionierende und die nicht funktionierende Lösung im Detail auf inkl. Meldungen. Lese evtl. noch Rückgabeparameter aus usw.

Benutzeravatar
heisenberg
Beiträge: 3556
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Bash/Schleife: ssh frisst Argumente von stdin auf

Beitrag von heisenberg » 14.05.2019 09:21:55

Typischer Fall von SSH eats arguments from stdin...

Anderer workaround(ungetestet):

Code: Alles auswählen

#!/bin/bash
while IFS='' read -u5 -r host; do
    echo "verarbeite host: $host"
    ssh $host ...
done 5< eingabe.txt
D. h. da ssh stdin für sich beansprucht, dann nimmt man halt nicht stdin(=handle 0) sondern ein anderes(hier 5) oder weist ssh an stdin zu schliessen(wie im verlinkten Post).
Jede Rohheit hat ihren Ursprung in einer Schwäche.

uname
Beiträge: 12075
Registriert: 03.06.2008 09:33:02

Re: Bash-Script mit Schleife und sshpass bricht ab

Beitrag von uname » 14.05.2019 10:07:26

Und warum schlägt es angeblich bei "status -v sys" bzw. "cat /etc/version" fehl und funktioniert bei "ls /etc/samba/" ?

Exxter
Beiträge: 383
Registriert: 10.01.2003 00:15:15
Lizenz eigener Beiträge: GNU General Public License

Re: Bash-Script mit Schleife und sshpass bricht ab

Beitrag von Exxter » 16.07.2019 09:38:06

Hallo,

entschuldigt die späte Antwort, ich hatte die Nase etwas voll und habe das Script erstmal zur Seite gelegt. Heute habe ich es nochmal probiert, und tatsächlich, mit -n als ssh-Option funktioniert es.

Vielen herzlichen Dank euch!

Antworten