SSH para servidor, executar comando e manter conexão

12

Quero escrever um script que abra um terminal com guias diferentes, faça logon em um servidor usando sshem cada guia e execute um comando em cada guia. Por exemplo: htop.

O script abaixo abre um terminal com 4 guias, todas conectadas no servidor. Mas se eu tentar adicionar o htopcomando na cmd=linha, ele não funcionará mais ...

#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

Eu tentei isso ...

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

... porque ssh --helpdiz que a sintaxe para sshé:

uso: ssh [usuário @] hostname [comando]

Vermelho
fonte

Respostas:

14

Na sua forma mais simples:

ssh -t user@host "command; bash"

-té a parte crítica aqui. Força o host a alocar um terminal virtual ao processo, o que permite que ele permaneça aberto.

Se você quiser apenas executar o htop em uma carga de servidores, poderá omitir o bashno final, mas isso significa que, se você sair do htop, retornará a um terminal local.

Oli
fonte
Eu tentei cmd = "bash -c 'ssh -t usuário @ host htop'; bash". Ele funciona, mas se eu sair htop eu cair de volta para o terminal local e eu não quero que isso acontece
Red
1
@Red Verifique suas cotações - elas estão em todo lugar - você precisa agrupar htop e bash para que ambos sejam executados no servidor remoto. bash -c 'ssh -t user@host "htop;bash"'seria melhor, mas não vejo por que você está tentando fritar essa coisa em um invólucro de festança em primeiro lugar. Não é necessário - você está executando apenas um comando localmente.
Oli
Obrigado, agora ele funciona com cmd = "user -t ssh @ htop acolhimento; bash"
Vermelho
Uma boa resposta, mas deve haver algo melhor para usar do que o bash para não terminar.
Mc0e 31/10
@ mc0e Depende do que você quer fazer. Esta pergunta é mais sobre como obter um shell útil depois de executar seu comando. Se você quiser apenas fazer uma pausa, poderá substituí bash-lo read.
Oli