Como executar um comando através do SSH e manter a conexão aberta?

5

Quando eu corro

FOO=$(ssh -L 40000:localhost:40000 [email protected] cat /foo)

Eu recebo o conteúdo de /foo , mas depois ele é desconectado.

O que eu gostaria de fazer é de alguma forma obter o conteúdo de /foo e manter a conexão aberta para que a porta 40000 ainda seja encaminhada para o mesmo servidor. Isso é possível?

Você pode perguntar por que não apenas emitir duas conexões ssh como esta

FOO=$(ssh [email protected] cat /foo)
ssh -L 40000:localhost:40000 [email protected] -f -N

Na minha situação, o motivo pelo qual não posso fazer isso é porque o ip ( 1.2.3.4 ) é um balanceador de carga que encaminha a conexão a vários backends aleatórios. Cada vez que eu ssh para 1.2.3.4 eu recebo uma máquina diferente, e o conteúdo de /foo é diferente para cada máquina. Além disso, os dados que eu envio pela porta encaminhada (40000) dependem do conteúdo de /foo . Se eu pegar o conteúdo de /foo na máquina A e, em seguida, enviar dados pela porta 40000 para a máquina B, as coisas não funcionam.

    
por Jesse Shieh 04.09.2018 / 19:54

3 respostas

8

O que você está descrevendo é conhecido como multiplexação SSH.

Eu uso essa configuração em uma configuração devops para armazenar em cache minhas conexões com qualquer VM.

Dessa forma, reutilizo a mesma conexão por até 30 minutos / cache a conexão sem renegociar toda a conexão SSH (e autenticar o usuário) em cada novo comando.

Isso me dá um enorme impulso na velocidade ao enviar (vários) comandos em sequência para uma VM / servidor.

A configuração é feita no lado do cliente e, para um cache de 30 minutos, a configuração pode ser feita em /etc/ssh/ssh_config como:

ControlPath ~/.ssh/cm-%r@%h:%p
  ControlMaster auto
  ControlPersist 30m

O parâmetro MaxSessions , também em ssh_config , também define quantas conexões simultâneas são permitidas; o valor padrão é 10. Se você precisar de mais conexões em cache simultâneas, convém alterá-lo.

Por exemplo, para um máximo de 20 conexões em cache:

MaxSessions 20

Para mais informações, consulte OpenSSH / Cookbook / Multiplexing

An advantage of SSH multiplexing is that the overhead of creating new TCP connections is eliminated.
...
The second and later connections will reuse the established TCP connection >over and over and not need to create a new TCP connection for each new SSH connection.

Veja também Usando a multiplexação de SSH

SSH multiplexing is the ability to carry multiple SSH sessions over a single TCP connection

Without multiplexing, every time that command is executed your SSH client must establish a new TCP connection and a new SSH session with the remote host. With multiplexing, you can configure SSH to establish a single TCP connection that is kept alive for a specific period of time, and SSH sessions are established over that connection. This can result in speed increases that can add up when repeatedly running commands against remote SSH hosts.

Por último, como a multiplexação mantém a conexão TCP aberta entre o cliente e o servidor, você terá a garantia de estar falando com a mesma máquina no balanceador de carga, desde que o cache esteja aberto / ativo.

    
por 04.09.2018 / 20:07
1

Existem várias maneiras de fazer isso, uma que você pode tentar é

 ssh -fT -L 40000:localhost:40000 [email protected] 'sleep 60'
 FOO=$(ssh root@localhost -p 40000 cat /foo)

descanse você pode continuar ...

Aqui -f é colocar em segundo plano e -T é desativar a alocação tty. Usando o comando sleep para manter a sessão ativa por 60s e permitir a saída em si, você pode modificá-la ou prepará-la de outras maneiras.

Um simples, por exemplo, mantém a sessão ativa até que veja um arquivo /tmp/a.txt, pois assim que terminar seu trabalho, crie um arquivo, enquanto o loop o verá e executará a limpeza rm / tmp / a.txt e sai da sessão.

ssh -fT -L 40000:localhost:40000 [email protected] 'while [[ ! -f /tmp/a.txt ]] ; do sleep 2 ; done ; rm /tmp/a.txt'
FOO=$(ssh root@localhost -p 40000 cat /foo)
do you work..
ssh root@localhost -p 40000 touch /tmp/a.txt

Você pode usar outras condições que melhor lhe convierem para mantê-lo vivo.

    
por 05.09.2018 / 05:24
-4

Eu uso sshpass

instale-o com o gerenciador de pacotes em sua máquina local

execute

sshpass -p 'YOUR_SSH_PASSWORD' [email protected] 'YOUR-COMMAND' 
    
por 04.09.2018 / 19:58