SSH do serwera, wykonaj polecenie i utrzymaj połączenie

12

Chcę napisać skrypt otwierający terminal z różnymi kartami, zalogować się do serwera za pomocą sshkażdej karty i wykonać polecenie na każdej karcie. Na przykład: htop.

Poniższy skrypt otwiera terminal z 4 zakładkami zalogowanymi na serwerze. Ale jeśli spróbuję dodać htoppolecenie w cmd=wierszu, to już nie działa ...

#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

Próbowałem tego ...

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

... ponieważ ssh --helpmówi, że składnia dla ssh:

użycie: ssh [użytkownik @] nazwa hosta [polecenie]

Czerwony
źródło

Odpowiedzi:

14

W najprostszej formie:

ssh -t user@host "command; bash"

-tjest tutaj kluczową częścią. Zmusza hosta do przydzielenia wirtualnego terminala do procesu, co pozwala mu pozostać otwartym.

Jeśli chcesz uruchomić htop na obciążeniu serwerów, możesz pominąć opcję na bashkońcu, ale to oznacza, że ​​jeśli opuścisz htop, wrócisz do lokalnego terminalu.

Oli
źródło
Próbowałem cmd = "bash -c 'ssh -t user @ host htop'; bash". Działa, ale jeśli opuszczę htop, wrócę do lokalnego terminalu i nie chcę, żeby tak się stało
Red
1
@ Red Sprawdź swoje cytaty - są wszędzie - musisz zgrupować htop i bash razem, aby oba działały na zdalnym serwerze. bash -c 'ssh -t user@host "htop;bash"'byłoby lepiej, ale nie rozumiem, dlaczego próbujesz usmażyć tę rzecz w opakowaniu typu bash. Nie jest to wymagane - uruchamiasz tylko jedno polecenie lokalnie.
Oli
Dziękuję, teraz działa z cmd = "ssh -t user @ host htop; bash"
Red
Dobra odpowiedź, ale musi być coś lepszego niż bash, aby się nie kończyć.
mc0e
@ mc0e Zależy, co chcesz zrobić. To pytanie dotyczy bardziej uzyskania użytecznej powłoki po uruchomieniu polecenia. Jeśli tylko chcesz, aby wstrzymać, można podstawić bashza read.
Oli