Como posso criar uma conexão SSH persistente com comandos “stream” durante um período de tempo?

6

Digamos que tenho um aplicativo em execução em um PC que está enviando comandos via SSH para outro PC na rede (ambos os computadores que executam o Linux).

Por exemplo, toda vez que algo acontece em # 1, quero executar uma tarefa em # 2. Nesta configuração, eu tenho que criar conexão SSH em cada comando.

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

    
por Jakub Arnold 25.12.2010 / 23:55

7 respostas

7

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

criar arquivo no # 1

1 > toque / tmp / commands

Em seguida, execute o comando:

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

Isso abrirá o arquivo / tmp / commands e começará a enviar seu conteúdo para o servidor x.x.x.x (# 2) e o executará linha por linha

agora, sempre que algo acontece no # 1,

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

ou

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

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

    
por 26.12.2010 / 04:39
15

Persistência automática usando o OpenSSH

Você também pode usar o recurso ControlMaster do 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 -M como a opção de linha de comando ou ativar a opção ControlMaster no seu ~/.ssh/ssh_config , por exemplo:

ControlMaster auto

Além disso, você deve definir o ControlPath usando as 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 precisa estabelecer muitas conexões ssh com o host, nenhuma das quais persistentes durante toda a vida útil do script, você pode iniciar uma conexão silenciosa antecipadamente usando:

ssh -MNf remotehost

Cheerio, nesono

    
por 27.01.2012 / 14:34
2

Em /etc/ssh/ssh_config add

# Send keep alive signal to remote sshd
ServerAliveInterval 60
    
por 26.12.2010 / 00:05
2

Se você topar com esse tipo de coisa, tente Paralelo . É como o dsh (shell distribuído), mas tem alguns recursos interessantes, como a contagem de semáforos e é mantido ativamente.

Da documentação:

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

O GNU Parallel pode funcionar como um sistema de fila de trabalhos simples ou gerenciador de lotes. A idéia é colocar os trabalhos em um arquivo e ter o GNU Parallel lido 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

Você pode usar o -S para distribuir os trabalhos para computadores remotos:

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

Existem muitos ótimos exemplos que apenas arranham a superfície. Aqui está um legal.

EXEMPLO: Distribuindo o trabalho para computadores locais e remotos

Converta * .mp3 em * .ogg executando um processo por núcleo da CPU no computador local e no servidor2:

  parallel --trc {.}.ogg -j+0 -S server2,: \
  'mpg321 -w - {} | oggenc -q0 - -o {.}.ogg' ::: *.mp3
    
por 26.12.2010 / 13:16
0

sim, é possível com um tubo:

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

isto irá executar o comando echo "hi" no host2

você apenas tem que escrever um programa, que apenas libera os comandos (não esqueça o;) e então canaliza essa saída para o ssh

    
por 26.12.2010 / 00:04
0

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

#!/bin/sh
ssh machine -- $@
exec $@
    
por 26.12.2010 / 10:06
0

AVISO LEGAL: Eu não posso testar isso agora, como eu 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 depois, para enviar comandos, escreva-os para o FD 4.

echo 'echo hi' >&4

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

    
por 26.12.2010 / 13:58

Tags