Conecte-se através do SSH e digite a senha automaticamente, sem usar uma chave pública

20

Um servidor permite conexões SSH, mas não usa autenticação de chave pública. Não está ao meu alcance mudar isso no momento (devido a dificuldades técnicas, não organizacionais), mas vou abordar o mais rápido possível!

O que eu preciso agora é executar comandos no servidor usando uma conta antiga simples + autenticação de senha de um script . Ou seja, eu preciso fazer isso de uma maneira não interativa. É possível? E como eu faço isso?

O cliente que executará o script executa o Ubuntu Server 8.04. O servidor executa o Cygwin e o OpenSSH.

Excluído
fonte
2
Quais são as dificuldades técnicas para ativar a autenticação baseada em chave? Talvez você deva fazer essa pergunta, ou em adição a esta.
Zoredache
1
Eu estou perguntando. :-) serverfault.com/questions/125842/… Eu simplesmente preciso de uma rota de fuga por enquanto, já que estou batendo com a cabeça nessa por um tempo. Mas é claro que meu objetivo é fazê-lo funcionar a longo prazo.
Excluído

Respostas:

22

Existe um utilitário linux chamado sshpass. Ele permite que você faça exatamente o que deseja e terá uma senha de servidor como argumento de linha de comando ou de um arquivo (prefiro assim, portanto, não tenho minha senha de servidor exibida no histórico do shell) e você a usa igual a:

sshpass -f file_with_password ssh user@server ls -la

Isso irá ssh em um servidor e será executado ls -la. Uma coisa, no entanto, você deve manualmente ssh em um servidor primeiro (se ainda não o fez), para que o servidor seja adicionado ao seu ~/.ssh/known_hosts. Se você não fizer isso, sshpassnão funcionará.

solefald
fonte
2
Esta não é uma parte normal do OpenSSH, e, literalmente, nenhuma das minhas máquinas (Mac OS X 10.7, Ubuntu 12.04, FreeBSD 8, Debian 3.1) tê-lo ...
voretaq7
@ voretaq7: sshpass é um projeto SourceForge: sourceforge.net/projects/sshpass
kevinarpe
1
@KCArpe Acho que você não entendeu o assunto ("O mundo inteiro não é a sua máquina Linux - tente escolher soluções que funcionem em outros lugares"). O uso da SSH_ASKPASSvariável é uma solução mais genérica que funciona em qualquer sistema com OpenSSH e não requer a instalação de software adicional. Para alguns de nós (em indústrias regulamentadas), a instalação de novos softwares gera muito trabalho administrativo.
voretaq7
@ voretaq7 A utilização SSH_ASKPASSnão funciona em todos os sistemas. Mesmo se o cliente suportar, ele não funcionará se o servidor usar keyboard-interactive. Na verdade, enfrentei esse problema ao escrever um script para distribuir um authorized_keysarquivo para várias máquinas incorporadas.
precisa saber é o seguinte
8

Você pode usar o Expect para fazer isso. Obviamente, isso não é preferível do ponto de vista de segurança, porque exigirá que você use um script que contenha sua senha em texto sem formatação. (Mas não abordarei esse ponto, pois você disse na sua pergunta que planeja usar a autenticação de chave pública o mais rápido possível!)

Mox
fonte
Parece que vai resolver o meu problema! Eu vou dar uma olhada amanhã. Não é a solução final, mas oferece alguma segurança. Quando penso nisso, se o usuário do script é o único autorizado a ler o script. Então será tão seguro quanto minha chave privada, que também é "apenas" protegida pelas permissões do sistema de arquivos. Ou eu perdi alguma coisa?
Excluído
Voltarei com os resultados amanhã. :-) Obrigado por responder!
Excluído
Parece funcionar. Mas sshpass foi mais fácil para este caso específico IMHO.
Excluído
7

Depende um pouco da linguagem de script que você usa. Eu script quase tudo em python agora, onde isso é um problema. Tanto o pyssh quanto o Paramiko permitem que você simplesmente escreva a senha sem problemas.

Se você pretende fazer isso com scripts (ba) sh e usar o OpenSSH, fica mais difícil. O OpenSSH impede explicitamente que você coloque senhas na linha de comando (como todos os usuários podem ver a linha de comando usando algo como ps -fe, o que é um mau mojo). Nesse caso, você terá que interagir diretamente com o programa ssh e ter duas opções:

  • Você pode escrever uma quantidade considerável de código de suporte usando algo como Expect.
  • Você faz um hack usando a variável SSH_ASKPASS, solicitando que ele chame um aplicativo retornando sua senha e execute tudo isso como um trabalho em lotes para impedir que seja lido no terminal.
pehrs
fonte