Como posso criar uma conexão SSH persistente para "transmitir" comandos durante um período de tempo?

9

Digamos que eu tenha um aplicativo em execução em um PC que esteja enviando comandos via SSH para outro PC na rede (ambas as máquinas executando o Linux).

Por exemplo, sempre que algo acontece no número 1, quero executar uma tarefa no número 2. Nesta configuração, eu tenho que criar uma conexão SSH em cada comando.

Existe alguma maneira simples de fazer isso com ferramentas unix básicas sem programar aplicativos cliente / servidor personalizados? Basicamente, tudo o que eu quero é estabelecer uma conexão através do SSH e enviar um comando após o outro.

Jakub Arnold
fonte

Respostas:

12

Não tenho certeza se ele pode ser usado na produção, mas você pode fazer algo assim:

criar arquivo no # 1

1> touch /tmp/commands

Em seguida, execute o comando:

1> tail -f /tmp/commands | ssh [email protected]

Isso abrirá o arquivo / tmp / command e começará a enviar seu conteúdo para o servidor xxxx (# 2) e executá-lo linha por linha

Agora, toda vez que algo acontece no # 1, faça:

1> echo "ls -l" >> /tmp/commands

ou

1> echo "reboot" >> /tmp/commands

o que você adicionar ao arquivo / tmp / command será enviado para o número 2 e executado. Apenas certifique-se de não executar nada interativo ou lidar com isso de alguma forma.

Vitaly Nikolaev
fonte
Este é exatamente o que eu estava procurando, solução muito criativa :)
Jakub Arnold
5
Eu acrescentaria que você deve usar tail -F, o que detectará que o arquivo foi substituído, portanto, quando se tornar gigante, você poderá apagá-lo e começar de novo com um novo arquivo.
DerfK
3
@DerfK, alternativamente, mkfifo /tmp/commandsdeve ser uma solução melhor
solotim
18

Persistência automática usando OpenSSH

Você também pode usar o ControlMasterrecurso OpenSSH, que abre um soquete de domínio unix para a primeira conexão e reutiliza essa conexão em todas as chamadas subseqüentes.

Para ativar o recurso, você pode usar -Mcomo a opção de linha de comando ou ativar a ControlMasteropção no seu ~/.ssh/ssh_config, por exemplo:

ControlMaster auto

Além disso, você deve definir o ControlPathuso das seguintes linhas no seu ~/.ssh/ssh_config:

Host *
   ControlPath ~/.ssh/master-%r@%h:%p

Para manter uma conexão persistente com um host, por exemplo, se você deseja executar um script que precise estabelecer muitas conexões ssh com o host, nenhuma das quais persistente durante toda a vida útil do script, você pode iniciar uma conexão silenciosa antecipadamente usando:

ssh -MNf remotehost

Cheerio, nesono

nesono
fonte
Entrei na falha do servidor apenas para marcar sua resposta com +1. Seu trabalhou!
Karma
ssh -Ninicia uma sessão sem comando remoto, parece não haver opções correspondentes no ssh_config.
Jokester
2

Em /etc/ssh/ssh_configadição

# Send keep alive signal to remote sshd
ServerAliveInterval 60
Sandra
fonte
2

Se você se deparar com esse tipo de coisa, tente o Parallel . É como o dsh (shell distribuído), mas possui alguns recursos interessantes, como contar semáforos e é mantido ativamente.

A partir da documentação:

EXEMPLO: GNU Parallel como sistema de filas / gerenciador de lotes

O GNU Parallel pode funcionar como um sistema simples de fila de tarefas ou gerenciador de lotes. A idéia é colocar os trabalhos em um arquivo e fazer com que o GNU Parallel leia continuamente. Como o GNU Parallel irá parar no final do arquivo, usamos tail para continuar lendo:

echo >jobqueue; tail -f jobqueue | parallel

Para enviar seus trabalhos para a fila:

echo my_command my_arg >> jobqueue

Obviamente, você pode usar -S para distribuir os trabalhos em computadores remotos:

echo >jobqueue; tail -f jobqueue | parallel -S ..

Existem muitos exemplos excelentes que apenas arranham a superfície. Aqui é legal.

EXEMPLO: Distribuindo trabalho para computadores locais e remotos

Converta * .mp3 em * .ogg executando um processo por núcleo de CPU no computador e servidor local2:

  parallel --trc {.}.ogg -j+0 -S server2,: \
  'mpg321 -w - {} | oggenc -q0 - -o {.}.ogg' ::: *.mp3
Allen
fonte
0

sim, é possível com um tubo:

echo 'echo "hi"' | ssh -i my_private_key tester@host2

isso executará o comando echo "hi" no host2

você só precisa escrever um programa, que apenas fornece os comandos (não esqueça o;) e depois canaliza essa saída para ssh

JMW
fonte
0

Você pode querer usar um programa como o dsh (Distributed SHell) feito exatamente para isso :). Após configurá-lo com nomes de host e configurar publickeya auth, você pode usá-lo para executar comandos em várias máquinas, em série ("run na máquina a, em seguida, execute a máquina b ") ou em pararell (" execute todas as máquinas ao mesmo tempo "). Ou apenas faça o script

#!/bin/sh
ssh machine -- $@
exec $@
XANi
fonte
0

AVISO LEGAL: Eu não posso testar isso agora, pois estou em uma máquina Windows com bash, mas sem ssh.

Em um script bash, você pode fazer algo assim:

exec 4> >(ssh --ssh-options-here user@host)

E então para enviar comandos, escreva-os no FD 4.

echo 'echo hi' >&4

Se você fizer dessa maneira, não poderá acessar os resultados dos comandos facilmente, mas com base na sua pergunta, não parece que você precisa.

user253751
fonte