Digamos que eu tenha um aplicativo rodando em um PC que envia comandos via SSH para outro PC na rede (ambas as máquinas rodando Linux).
Por exemplo, toda vez que algo acontece no nº 1, quero executar uma tarefa no nº 2. Nesta configuração, tenho que criar uma conexão SSH em cada comando.
Existe alguma maneira simples de fazer isso com ferramentas básicas do Unix sem programar aplicativos cliente/servidor personalizados? Basicamente, tudo que quero é estabelecer uma conexão via SSH e enviar um comando após o outro.
Responder1
Não tenho certeza se pode ser usado em produção, mas você pode fazer algo assim:
criar arquivo em #1
1>touch /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 xxxx (#2) e executá-lo linha por linha
agora, toda vez que algo acontecer no nº 1, faça:
1>echo "ls -l" >> /tmp/commands
ou
1>echo "reboot" >> /tmp/commands
tudo 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.
Responder2
Persistê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 subsequentes.
Para ativar o recurso, você pode usar -M
como opção de linha de comando ou ativar a ControlMaster
opção em seu arquivo ~/.ssh/ssh_config
, por exemplo:
ControlMaster auto
Além disso, você deve definir ControlPath
usando as seguintes linhas em seu arquivo ~/.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 persistente durante toda a vida útil do script, você pode iniciar uma conexão silenciosa antecipadamente usando:
ssh -MNf remotehost
Feliz, nesono
Responder3
Em /etc/ssh/ssh_config
adição
# Send keep alive signal to remote sshd
ServerAliveInterval 60
Responder4
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 forneça os comandos (não se esqueça do ;) e depois canalize essa saída para o ssh