Comando SSH remoto via programa Java

1

Antes de tudo, meu conhecimento sobre Linux é limitado! Eu sou mais um desenvolvedor, que gerencia alguns servidores casualmente: -)

Então, estou operando em um farm de servidores RHEL5 / 6 (misto) e aqui está o que eu quero fazer: Eu tenho um programa Java em um servidor mestre, que executa comandos em algumas máquinas remotas. O programa Java envia meus comandos para o SO corretamente - os comandos locais podem ser executados sem problemas. Meu problema é a execução de comandos nos servidores remotos:

  • Eu tenho as chaves SSH, que permitem ao meu mestre simplesmente obter privilégios de root nos escravos
  • Meu comando funciona, se eu acioná-lo diretamente por meio de um terminal (por exemplo, ssh [email protected] "cd /opt/bla" )
  • Eu tentei abordagens diferentes, com resultados diferentes - nenhum deles correto:)

Tentativa nº 1

$ ssh [email protected]
Pseudo-terminal will not be allocated because stdin is not a terminal.
Host key verification failed.

Então, estando familiarizado com o Google, li sobre o tty, que supostamente resolveria o problema, mas só levaria a:

Tentativa nº 2

$ ssh -t -t [email protected]
tcgetattr: Invalid argument
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
RSA key fingerprint is <somehex>.

Então, meu aplicativo ficou preso neste ponto, estranhamente depois do Ctrl + C'ing, vi o seguinte texto:

Are you sure you want to continue connecting (yes/no)? Killed by signal 2.

Então, estou assumindo que algo estava funcionando, mas ficou preso na entrada. No entanto, não consegui encontrar nada de conclusivo sobre esse erro. Uma dica em algum lugar foi editar /etc/sudoers e comentar (eu sei que não é recomendável)

# Defaults    requiretty

que não fez nada, embora eu não tenha idéia se eu deveria mudar essa configuração no master e / ou no slave e se uma reinicialização ou algum reinício de um daemon é necessário.

Minha pergunta agora é: isso leva a algum lugar ou minhas tentativas são inúteis? Ou existe alguma maneira melhor de executar comandos remotos em escravos disparados por um programa na máquina mestre? Por favor, tenha em mente que não vou recompilar meu kernel ou fazer qualquer shenanigan complicado, já que eu simplesmente não tenho experiência com o Linux ..

A ajuda é muito apreciada!

    
por Peter Ilfrich 20.11.2012 / 18:14

2 respostas

0

Resolvi meu problema usando a biblioteca Java Jsch , que é uma implementação Java pura de SSH2. Eu percebi que minhas configurações de SSH no meu ambiente também estão confusas, então isso me pareceu uma alternativa mais eficaz.

Demorei de 1 a 2 horas para que funcionasse - muito fácil de implementar.

Obrigado de qualquer forma pelas sugestões. Eu especialmente tive que usar a opção StrictHostKeyChecking=no (que também está disponível na biblioteca Java) para poder conectar.

Prós e contras:

  • (-) A documentação do Jsch é muito ruim
  • (-) Há algumas suposições sendo feitas, as quais você precisa descobrir ao usá-las pela primeira vez.
  • (+) No entanto, existem muitas perguntas e respostas na interweb, porque a biblioteca é usada por muitas pessoas.
  • (+) Existem alguns exemplos muito bem ilustrados, que demonstram como diferentes funções estão funcionando - isso não substitui completamente uma boa documentação.
por 21.11.2012 / 19:25
2

I've got the SSH keys

Estas chaves estão configuradas sob a conta root?

Host key verification failed.

The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established. RSA key fingerprint is .

Seu programa não está gravando no arquivo known_hosts. O host ao qual você está tentando se conectar não foi usado na conta que o processo java está usando. Você precisará gerar um arquivo known_hosts válido antes de usá-lo. Ou talvez, se você for uma pessoa um pouco confiante, você poderia definir a opção StrictHostKeyChecking no .

Se ele tiver sido usado nessa conta, algo está errado no ambiente. Você pode querer considerar strongmente a configuração de um arquivo de configuração para o cliente ssh e definir o caminho para as chaves e o arquivo known_host. Peça ao seu programa java para referenciar o arquivo de configuração usando ssh -f configfile .

    
por 20.11.2012 / 18:40