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 [email protected]

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 ...


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 [email protected]
[email protected]'s password: 

Agora tente fazer login na máquina com ssh '[email protected]'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 [email protected]

[email protected]:~$ 

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


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 [email protected]

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 [email protected]

agora você pode fazer login sem senha :

# ssh [email protected]

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 [email protected]
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 [email protected]$server
match_max 100000
expect "*?assword:*"
send -- "$pass\r"
send -- "\r"
interact

Exemplo:

# ./1.ex password localhost ooshro
spawn ssh [email protected]
[email protected]'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

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! $!";

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 [email protected] -pw mypass  [cmd]

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


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 [email protected]

# 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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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).


8

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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.