SSH zum Server, Befehl ausführen und Verbindung aufrechterhalten

12

Ich möchte ein Skript schreiben, das ein Terminal mit verschiedenen Registerkarten öffnet, mich sshin jeder Registerkarte bei einem Server anmeldet und in jeder Registerkarte einen Befehl ausführt. Zum Beispiel: htop.

Das folgende Skript öffnet ein Terminal mit 4 Registerkarten, die alle auf dem Server angemeldet sind. Aber wenn ich versuche, den htopBefehl in die cmd=Zeile einzufügen, funktioniert er nicht mehr ...

#bin/bash

tab="--tab"
cmd="bash -c 'ssh user@host';bash"
foo=""

for i in 1 2 3 4; do
      foo+=($tab -e "$cmd")         
done

gnome-terminal "${foo[@]}"

exit 0

Ich habe das versucht ...

cmd="bash -c 'ssh user@host htop';bash"

... weil der ssh --helpbesagt, dass die Syntax für sshist:

Verwendung: ssh [user @] Hostname [Befehl]

rot
quelle

Antworten:

14

In seiner einfachsten Form:

ssh -t user@host "command; bash"

-tist der kritische Teil hier. Dadurch wird der Host gezwungen, dem Prozess ein virtuelles Terminal zuzuweisen, damit dieser geöffnet bleibt.

Wenn Sie nur htop auf einer Last von Servern ausführen möchten, können Sie das basham Ende weglassen. Wenn Sie htop jedoch beenden, kehren Sie zu einem lokalen Terminal zurück.

Oli
quelle
Ich habe versucht, cmd = "bash -c 'ssh -t user @ host htop'; bash". Es funktioniert, aber wenn ich aufhöre, gehe ich zurück zum lokalen Terminal und ich möchte nicht, dass dies passiert
Red
1
@Red Überprüfen Sie Ihre Anführungszeichen - überall - Sie müssen htop und bash gruppieren, damit beide auf dem Remote-Server ausgeführt werden. bash -c 'ssh -t user@host "htop;bash"'wäre besser, aber ich verstehe nicht, warum Sie versuchen, dieses Ding in einem Bash-Wrapper zu braten. Es ist nicht erforderlich - Sie führen nur einen Befehl lokal aus.
Oli
Vielen Dank, jetzt funktioniert es mit cmd = "ssh-t Benutzer @ Host htop; Bash"
Red
Eine gute Antwort, aber es muss etwas Besseres geben als bash, um nicht zu kündigen.
mc0e
@ mc0e Hängt davon ab, was Sie tun möchten. Bei dieser Frage geht es eher darum, eine nützliche Shell zu erhalten, nachdem Sie Ihren Befehl ausgeführt haben. Wenn Sie nur anhalten möchten, könnten Sie ersetzen bashfür read.
Oli