Ssh-keygen automatizado sem senha, como?

86

Eu gostaria de criar um script automatizado que chame ssh-keygene crie alguns pares de chaves pub / particulares que usarei mais tarde. Em princípio, tudo funciona bem com ...
ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q
... exceto que ele me pede a senha que criptografaria as chaves. Isso faz com que a automação seja difícil.

Eu poderia fornecer uma senha através do argumento da linha de comando -N thepassphrase, para impedir que o prompt apareça. Ainda assim, eu nem desejo ter as chaves - adicionalmente protegidas por criptografia - e quero que os pares de chaves sejam texto sem formatação.

Qual é a (a melhor) solução para esse problema?

A -qopção que supostamente significa "silencioso / silencioso" ainda não evita a interação da frase secreta. Também não encontrei algo parecido com isto
ssh-keygen ...... -q --no-passphrase

Por favor, não comece a pregar ou me ensinar os prós e os contras da "frase secreta que falta", estou ciente disso. Na forma interativa (não como um script), o usuário pode simplesmente pressionar [ENTER] duas vezes e a chave será salva como texto sem formatação. Isto é o que eu quero alcançar em um script como este:

#! / bin / bash

command1
command2
var = $ (comando3)

# isso não deve parar o script e pedir senha
ssh-kegen -b 2048 -t rsa -f / tmp / sshkey -q

humanidade e paz
fonte

Respostas:

105

Isso impedirá que o prompt da senha apareça e defina o par de chaves a ser armazenado em texto sem formatação (o que obviamente traz todas as desvantagens e riscos disso):

ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q -N ""
humanidade e paz
fonte
3
Isso funciona. Caso /tmp/sshkeyjá exista, é possível obter um prompt de substituição. Isso pode ser evitado através do redirecionamento / fechamento do stdin - por exemplo, através da adição 0>&-.
Maxschlepzig
34

A maneira mais simples de encontrar o que você deseja é esta (exemplo, usando o nome de arquivo padrão)

    cat /dev/zero | ssh-keygen -q -N ""

Se o ~/.ssh/id_rsaarquivo já existir, o comando será encerrado sem modificar nada.

Caso contrário, você recebe uma nova chave nesse nome de arquivo.

De qualquer forma, você não substituiu nada e sabe que no final tem uma chave.

JoaoCC
fonte
confirmado: no lubuntu 14.04.2
user77115 15/03
Se você realmente quer que ele fique quieto, canalize a saída para / dev / null:cat /dev/zero | ssh-keygen -q -N "" > /dev/null
Chris Gregg
No SLES 11 (reconhecidamente antigo), o comando acima falha ao produzir uma chave. yes "" | ssh-keygen -N "" >&- 2>&-No entanto, funciona bem e não produz nada (se um arquivo de chave já existe ou não) e não substitui um arquivo de chave existente anteriormente.
Zrajm
Verificado no Ubuntu trusty (14.04)
Binita Bharati
2
Por que você cat / dev / zero?
maxschlepzig
9

Isso funcionou para mim:

ssh-keygen -t rsa -f /home/oracle/.ssh/id_rsa -q -P ""

A -Pé a opção de senha e ""é a senha vazia.

medonho
fonte
key_save_private: Nenhum tal lima ou diretório
Dimitri Kopriwa
5
A -P <passphrase>opção é fornecer a senha (antiga). linux.die.net/man/1/ssh-keygen
Gianfranco P.
5

Você pode usar o expect para enviar o "enter" para você

cat test.sh
#!/bin/bash
set -x
XYZ=$(expect -c "
spawn ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q
expect \"Enter passphrase (empty for no passphrase):\"
send \"\r\"
expect \"Enter same passphrase again:\"
send \"\r\"
")

Mas lembre-se de que, se o arquivo / tmp / sshkey já existir, ele falhará porque a saída do comando será diferente.

BitsOfNix
fonte
1
obrigado pela contribuição. a expectativa parece ainda mais versátil para problemas do mesmo tipo ... bem aqueles onde conflitos de script e interação com o usuário. Estarei ciente do conflito potencial que / tmp / sshkey já existe e o verifique antes de usar seu comando.
humanityANDpeace
2

Eu fiz um eco simples antes do ssh-keygen. assimsu - <user> -c "echo |ssh-keygen -t rsa"

Isso foi testado no Redhat 6

koopsj
fonte
Eu não acho que essa seja a melhor resposta, mas acho que não há motivo para votar também, pessoal.
precisa saber é o seguinte
0

Para outro usuário, testado no Ubuntu 18.04:

sudo -u username bash -c "ssh-keygen -f /tmp/sshkey -N ''"
Jeroen Vermeulen - MageHost
fonte