Shell Script: Befehl nach einem SSH Login absetzen...

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
ManfredG
Beiträge: 112
Registriert: 12.08.2004 17:38:14

Shell Script: Befehl nach einem SSH Login absetzen...

Beitrag von ManfredG » 31.12.2014 14:08:15

Hallo,

es ist vermutlich recht simpel, aber ich bekomme das gerade nicht hin.

Ich möchte in einer Zeile in einem Shell Script einen SSH Login zu einem
anderen Server machen und dann auf dem anderen Server einen Befehl absetzen.

BEISPIEL:

Das funktioniert natürlich nicht:
ssh server-login.de; hostname

Das funktioniert aber auch nicht:
ssh server-login.de hostname

Das klappt, aber logt mich automatisch wieder aus:
ssh server-login.de 'hostname'

Ich möchte nach dem Login eingelogt bleiben.
Wie geht das denn?

Danke für Eure Hilfe
Manfred

ren22

Re: Shell Script: Befehl nach einem SSH Login absetzen...

Beitrag von ren22 » 31.12.2014 16:21:53

Code: Alles auswählen

dd if=$ROOTDIR/stickimage | ssh root@192.168.11.164 'dd of=/dev/sda && sync && reboot'
dieses Code führe ich von einer Maschine aus, auf der andere Maschine wird sich per SSH eingeloggt und mit dem "|" Pipe Symbol das Image rübergeschoben, danach wird "sync" auf der remote Maschine ausgeführt und ein "reboot" der remote Machine, das ist zwar keine Lösung aber vielleicht ein Anreiz wie du dein Befehl umschreiben könntest von dem Code Beispiel, und wenn Du dem Befehl ein "&" ranhängs wird der Befehl in Hintergrund gestartet und Du solltest auf der Remote Maschine bleiben oder versuche eine Lösung mit "screen" als "Background Job" .

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Shell Script: Befehl nach einem SSH Login absetzen...

Beitrag von Cae » 01.01.2015 02:01:49

ManfredG hat geschrieben:Das funktioniert aber auch nicht:
ssh server-login.de hostname

Das klappt, aber logt mich automatisch wieder aus:
ssh server-login.de 'hostname'
Da muss dir ein Fehler unterlaufen sein, dieses Quoting macht naemlich in einer Bourne-Shell keinen Unterschied.

Ein moeglicher Weg waere, dass du deine interaktive Shell explizit startest (-t erzwingt ein Terminal):

Code: Alles auswählen

$ ssh -t user@host 'hostname; $SHELL -i'
-- allerdings gibt es da einen Unterschied zur Fragestellung "nach dem Befehl eingeloggt bleiben". Dies wird sich beispielsweise dann wichtig, wenn der erste Befehl irgendwelche Umgebungsvariablen setzt, die der Shell zur Verfuegung stehen muessen. Hier sind es zwei Prozesse, die unabhaengig voneinander gestartet werden, folglich sind ihre Umgebungsvariablen auch eigenstaendig.

Das muss man wohl Shell-spezifisch loesen, etwa fuer die Bash:

Code: Alles auswählen

$ ssh -t user@host 't="$(mktemp)"; trap "rm -f $t" INT EXIT; echo "source ~/.bashrc || source /etc/bash.bashrc || true; hostname" >"$t"; bash --rcfile "$t" -i'
... und das ist nicht nur wegen dem Quoting ein Alptraum. Die Idee ist, dass man sich temporaer in die bashrc einklinkt und dort seine Programme startet, die wiederum ihre Umgebungsvariablen in der Shell propagieren koennen.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Antworten