Como automatizar o login SSH com senha?

419

Como automatizar o login SSH com senha? Estou configurando minha VM de teste, portanto, segurança pesada não é considerada. SSH escolhido para segurança aceitável com configuração mínima.

ex)

echo password | ssh id@server

Isso não funciona.

Lembro-me de ter feito isso com alguns truques que alguém me guiou, mas não me lembro agora do truque que usei ...

Eonil
fonte
2
O FreeBSD não aceitou chaves sem senha. Não fique tentado. No entanto, alguns servidores Linux o aceitaram. Acredito que o servidor Linux tenha sido configurado incorretamente.
Eonil
16
Essa é uma pergunta válida. Por exemplo, quero permitir que um usuário insira uma senha e faça login em outra máquina usando-a. Não posso assumir que haverá chaves ssh distribuídas em todas as nossas máquinas. As respostas abaixo até agora não ajudam nessa situação.
Dfrankow 12/04/12
Pergunta muito importante. Também preciso de uma resposta, meu provedor de espaço na web bloqueia para colocar arquivos-chave no servidor, então devo passar a senha sem arquivos-chave.
Radon8472

Respostas:

382

Não use uma senha. Gere uma chave SSH sem senha e envie-a para sua VM.

Se você já possui uma chave SSH, pode pular esta etapa ... Basta pressionar Entera chave e as duas senhas:

$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.

Copie suas chaves no servidor de destino:

$ ssh-copy-id id@server
id@server's password: 

Agora tente fazer login na máquina com ssh 'id@server'e faça o check-in:

.ssh/authorized_keys

para garantir que não adicionamos chaves extras que você não esperava.

Por fim, verifique o login ...

$ ssh id@server

id@server:~$ 

Você também pode usar o recurso ssh-agentse quiser tentar manter suas chaves protegidas com uma senha.

Cakemox
fonte
14
Eu finalmente decidi usar pares de chaves. Porque eu percebi que é a maneira mais simples.
Eonil
9
@Eonil: Não fique tentado a usar chaves sem uma frase secreta. Aprenda a usar o ssh-agent ou o pageant.
precisa saber é o seguinte
119
Esta é uma boa resposta, mas não a resposta correta para a pergunta.
John Hunt
74
Esse tipo de resposta realmente me irrita. Essa não era a questão. Ninguém perguntou como usar pares de chaves.
Matt Fletcher
16
Isso não responde à pergunta. É uma boa resposta para uma pergunta completamente diferente, mas é terrível para a pergunta.
srchulo 4/01/17
595
$ sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname
weekens
fonte
51
Sim, às vezes você não pode usar a autenticação baseada em chave por vários motivos. Por exemplo, agora não posso usar o keyauth em um servidor plesk porque, fora da caixa, ele não está ativado e não tenho root.
John Hunt
17
+1! Como uma observação lateral, você precisa executar sshuma operação simples uma vez antes de usar sshpass, para confirmar a impressão digital RSA
user123444555621
21
-1 por ter que usar a senha no comando. Isso registra a senha .bash_historyem texto sem formatação na sua máquina.
15
@MisterDood Você pode executar history -ro comando para apagar seu histórico. Bom ponto embora.
NuclearPeon
20
Dica profissional: se você não deseja que um comando específico apareça em .bash_history, prefixe o comando com um espaço. Isso simplesmente funciona. No entanto, os usuários desse comando devem estar mais preocupados com o fato de que usuários não privilegiados no sistema possam ver a linha de comando completa com ps, que, é claro, inclui a senha. Como as sessões ssh tendem a ter vida longa, esse é um problema de segurança.
CubicleSoft
71

Embora a resposta correta para sua pergunta seja sshkey , existe uma maneira mais segura - as chaves SSH. Você está a apenas três etapas da solução:

Gere um par de chaves rsa :

# ssh-keygen

copie-o no servidor com um comando simples :

# ssh-copy-id userid@hostname

agora você pode fazer login sem senha :

# ssh userid@hostname
lzap
fonte
1
Funciona bem com os valores padrão. Usar ~ / rsa4live.pub não funcionou para mim ao tentar ssh-copy-id.
Cees Timmerman
1
Se você quer este passos para trabalhar para usuário diferente, 1. keygen-ssh 2. ssh-copy-id nazir @ hostname 3. ssh nazir @ hostname
Venfah Nazir
2
Para mim foissh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host
Gabriel Fair
21
Esta não é uma resposta para a pergunta.
Steve Bennett
2
E? A resposta está acima, sshpass ...
lzap
40

Use expect:

#!/usr/bin/expect -f
#  ./ssh.exp password 192.168.1.11 id
set pass [lrange $argv 0 0]
set server [lrange $argv 1 1]
set name [lrange $argv 2 2]

spawn ssh $name@$server
match_max 100000
expect "*?assword:*"
send -- "$pass\r"
send -- "\r"
interact

Exemplo:

# ./1.ex password localhost ooshro
spawn ssh ooshro@localhost
ooshro@localhost's password: 
Linux ubuntu-1010-server-01 2.6.35-25-generic-pae #44-Ubuntu SMP Fri Jan 21 19:01:46 UTC 2011 i686 GNU/Linux
Ubuntu 10.10

Welcome to Ubuntu!
 * Documentation:  https://help.ubuntu.com/
Last login: Tue Mar  1 12:41:12 2011 from localhost
ooshro
fonte
2
Funcionou, mas não pode imprimir stdout da máquina remota.
Eonil
funciona bem para algumas máquinas que não podem colocar a chave com antecedência, pois o endereço IP é alterado sempre.
Larrycai
4
que vai ser bom para adicionar -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/nullpara o comando ssh, assim como para evitar aceitar a máquina em known_hosts
larrycai
B .. B, mas muh chaves SSH ...
Damien Ó Ceallaigh
Exemplo mais detalhado deste script você pode encontrar em: linuxaria.com/howto/... Este exemplos aqui deve trabalhar com comandos remotos demais
Radon8472
16

Isso pode não lhe ser útil, mas você pode fazê-lo com o Perl:

\#!/usr/bin/perl  
use warnings;  
use strict;  

use Net::SSH::Perl;  
my $host = 'remote.serv.er';  
my $user = 'root';  
my $pass = 'hunter2';  
my $ssh = Net::SSH::Perl->new('$host');  
$ssh->login('$user', '$pass') or die "Oh noes! $!";
James L
fonte
2
Da mesma forma, você pode fazer isso com Ruby github.com/net-ssh/net-ssh
EnabrenTane
15

Estou surpreso que ninguém mencionado plinkno putty-toolspacote no Ubuntu:

plink user@domain -pw mypass  [cmd]

Também está disponível no Windows e a sintaxe é compatível principalmente com o cliente openssh.

eadmaster
fonte
Para Windows sua resposta for boa, unfurtunally / user unix linux geralmente não têm Plink
Radon8472
2
ele está no putty-toolspacote
eadmaster
10

O logon único SSH geralmente é obtido com autenticação de chave pública e um agente de autenticação. Você pode adicionar facilmente sua chave de VM de teste a um agente de autenticação existente (veja o exemplo abaixo). Existem outros métodos, como gssapi / kerberos, mas são mais complexos.

sshpass

Nas situações em que passwordé o único método de autenticação disponível, o sshpass pode ser usado para inserir automaticamente a senha. Por favor, preste atenção especial à seção CONSIDERAÇÕES DE SEGURANÇA da página de manual . Nas três opções, a senha é visível ou armazenada em texto sem formatação em algum momento :

Canal anônimo (recomendado pelo sshpass)

# Create a pipe
PIPE=$(mktemp -u)
mkfifo -m 600 $PIPE
# Attach it to file descriptior 3
exec 3<>$PIPE
# Delete the directory entry
rm $PIPE
# Write your password in the pipe
 echo 'my_secret_password' >&3
# Connect with sshpass -d
sshpass -d3 ssh user@host

# Close the pipe when done
exec 3>&-

É bastante complicado no bash, sem dúvida mais fácil com linguagens de programação. Outro processo pode ser anexado ao seu pipe / fd antes que a senha seja gravada. A janela de oportunidade é bastante curta e limitada aos seus processos ou raiz.

Variável de ambiente

# Set your password in an environment variable
 export SSHPASS='my_secret_password'
# Connect with sshpass -e
sshpass -e ssh user@host

Você e o root podem ler as variáveis ​​de ambiente do seu processo (por exemplo, sua senha) enquanto o sshpass está em execução ( cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=). A janela de oportunidade é muito mais longa, mas ainda limitada aos seus próprios processos ou raiz, e não a outros usuários.

Argumento da linha de comando (menos seguro)

 sshpass -p my_secret_password ssh user@host

Isso é conveniente, mas menos seguro, conforme descrito na página de manual. Os argumentos da linha de comando são visíveis para todos os usuários (por exemplo ps -ef | grep sshpass). O sshpass tenta ocultar o argumento, mas ainda existe uma janela durante a qual todos os usuários podem ver sua senha passada pelo argumento.

Nota

Defina sua variável bash HISTCONTROL como ignorespaceou ignorebothprefixe seus comandos sensíveis com um espaço. Eles não serão salvos na história.


Autenticação de chave pública SSH

# Generate a key pair
# Do NOT leave the passphrase empty
ssh-keygen
# Copy it to the remote host (added to .ssh/authorized_keys)
ssh-copy-id user@host

A senha é muito importante. Qualquer pessoa que, de alguma forma, obtenha o arquivo de chave privada não poderá usá-lo sem a senha.

Configurar o agente de autenticação SSH

# Start the agent
eval `ssh-agent`
# Add the identity (private key) to the agent
ssh-add /path/to/private-key
# Enter key passphrase (one time only, while the agent is running)

Conecte-se como de costume

ssh user@host

A vantagem é que sua chave privada é criptografada e você só precisa digitar sua senha uma vez (também através de um método de entrada mais seguro).

nrolans
fonte
8

Claro que você não deseja usar chaves SSH em vez de senhas? Dessa forma, é seguro e automático.

Cooperativas
fonte
3
Usar chaves SSH sem senha é apenas um pouco mais seguro do que usar senhas em um arquivo.
yunzen
10
@yunzen Incorreto. A autenticação de chave protege você contra ataques mitm, mesmo que você não conheça a chave do host. Um invasor pode se passar por um servidor, mas nunca se conectar ao servidor real. Com a autenticação de senha, qualquer servidor ao qual você se conectar (legítimo ou não) verá a senha. Por esses motivos, uma chave ssh sem senha é muito mais segura do que apenas armazenar a senha em um arquivo.
Kasperd
14
Esta não é uma resposta.
Steve Bennett
@SteveBennett É a mesma resposta que foi aceita e foi postada antes, embora tenha menos detalhes.
Michael Hampton
3
Bem, eu diria que a resposta aceita é uma resposta decente a uma pergunta que não foi feita. Isso não é nada.
9788 Steve Bennett #
4

Dependendo das suas necessidades de automação, talvez o Ansible seja um bom ajuste para você. Ele pode gerenciar bem coisas como solicitar senha, solicitar senha sudo, várias maneiras de alterar o uso, usar com segurança segredos criptografados (cofre).

Se isso não for adequado, sugiro o Expect, conforme sugerido em outra resposta.

Cameron Kerr
fonte