SSH su server, Esegui comando e Mantieni connessione


12

Voglio scrivere uno script che apre un terminale con diverse schede, accedere a un server utilizzando sshin ciascuna scheda ed eseguire un comando in ciascuna scheda. Ad esempio: htop.

Lo script seguente apre un terminale con 4 schede tutte connesse al server. Ma se provo ad aggiungere il htopcomando nella cmd=riga non funziona più ...

#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

Ho provato questo ...

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

... perché ssh --helpdice che la sintassi per sshè:

utilizzo: ssh [user @] nomehost [comando]

Risposte:


14

Nella sua forma più semplice:

ssh -t user@host "command; bash"

-tè la parte critica qui. Forza l'host a allocare un terminale virtuale al processo, che gli consente di rimanere aperto.

Se vuoi solo eseguire htop su un carico di server, puoi ometterlo bashalla fine ma ciò significa che se esci da htop, tornerai a un terminale locale.


Ho provato cmd = "bash -c 'ssh -t user @ host htop'; bash". Funziona ma se esco di nuovo torno al terminale locale e non voglio che ciò accada
Red

1
@Red Controlla i tuoi preventivi - sono ovunque - devi raggruppare htop e bash insieme in modo che entrambi vengano eseguiti sul server remoto. bash -c 'ssh -t user@host "htop;bash"'sarebbe meglio, ma non vedo perché stai cercando di friggere questa cosa in un involucro bash in primo luogo. Non è richiesto: esegui solo un comando localmente.
Oli

Grazie, ora funziona con cmd = "ssh -t user @ host htop; bash"
Rosso

Una buona risposta, ma ci deve essere qualcosa di meglio da usare di bash per non terminare.
MC0e

@ mc0e Dipende da cosa vuoi fare. Questa domanda è più su come ottenere una shell utile dopo aver eseguito il comando. Se si desidera solo per mettere in pausa, si potrebbe sostituire bashper read.
Oli
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.