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.
Respostas:
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.
fonte
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.mkfifo /tmp/commands
deve ser uma solução melhorPersistência automática usando OpenSSH
Você também pode usar o
ControlMaster
recurso 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 aControlMaster
opção no seu~/.ssh/ssh_config
, por exemplo:Além disso, você deve definir o
ControlPath
uso das seguintes linhas no seu~/.ssh/ssh_config
: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:
Cheerio, nesono
fonte
ssh -N
inicia uma sessão sem comando remoto, parece não haver opções correspondentes no ssh_config.Em
/etc/ssh/ssh_config
adiçãofonte
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:
Para enviar seus trabalhos para a fila:
Obviamente, você pode usar -S para distribuir os trabalhos em computadores remotos:
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:
fonte
sim, é possível com um tubo:
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
fonte
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
fonte
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:
E então para enviar comandos, escreva-os no FD 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.
fonte