Como adicionar permanentemente uma chave privada com ssh-add no Ubuntu? [fechadas]

474

Eu tenho uma chave privada protegida com uma senha para acessar um servidor via SSH.

Eu tenho 2 máquinas linux (ubuntu 10.04) e o comportamento do comando ssh-add é diferente em ambos.

Em uma máquina, quando eu uso "ssh-add .ssh / identity" e digito minha senha, a chave é adicionada permanentemente, ou seja, toda vez que eu desligo o computador e faço o login novamente, a chave já está adicionada.

Na outra, tenho que adicionar a chave toda vez que faço login.

Tanto quanto me lembro, fiz o mesmo em ambos. A única diferença é que a chave foi criada na que foi adicionada permanentemente.

Alguém sabe como adicioná-lo permanentemente à outra máquina também?

duduklein
fonte
1
o agente deve ser apenas temporário; mas é possível que você tem a algum lugar comando ssh-add em ~ / .bashrc ou assim em uma das duas máquinas
mirek

Respostas:

632

Uma solução seria forçar a manutenção permanente dos arquivos principais, adicionando-os ao seu ~/.ssh/configarquivo:

IdentityFile ~/.ssh/gitHubKey
IdentityFile ~/.ssh/id_rsa_buhlServer

Se você não possui um arquivo 'config' no diretório ~ / .ssh, deve criar um. Ele não precisa de direitos de root, então simplesmente:

nano ~/.ssh/config

... e insira as linhas acima conforme suas necessidades.

Para que isso funcione as necessidades de arquivo de ter chmod 600. Você pode usar o comando chmod 600 ~/.ssh/config.

Se você quiser que todos os usuários do computador usem a chave, insira essas linhas /etc/ssh/ssh_confige a chave em uma pasta acessível a todos.

Além disso, se você quiser definir a chave específica para um host, faça o seguinte em ~ / .ssh / config:

Host github.com
    User git
    IdentityFile ~/.ssh/githubKey

Isso tem a vantagem quando você tem muitas identidades de que um servidor não o rejeita porque você tentou as identidades erradas primeiro. Somente a identidade específica será tentada.

daminetreg
fonte
82
As permissões no arquivo de configuração devem ser 600.chmod 600 config
generalopinion
6
Eu tenho que colocar minha senha para cada push, busca ou clone com isso, como evito isso?
Asaf
9
Use em vez disso ssh-add ~/.ssh/gitHubKey, ele lembrará sua senha de chave. A solução que propus foi configurá-lo permanentemente durante as reinicializações.
21814 daminetreg
28
Essa resposta é tão boa que o ssh-add não deveria existir. Quem quer ter um comando que "temporariamente" conserte um problema e quebre inesperadamente quando você pode simplesmente editar um arquivo de configuração permanentemente.
precisa saber é o seguinte
2
O problema é com esse tipo de configuração, se você não fizer isso em .ssh / config para um host específico, todas as chaves serão testadas em todos os servidores a cada vez.
precisa saber é o seguinte
118

Isso não respondeu o mesmo problema para mim no Mac OS X Lion. Acabei adicionando:

ssh-add ~/.ssh/id_rsa &>/dev/null

Para o meu .zshrc (mas .profile também ficaria bem), o que parece ter corrigido.

(Como sugerido aqui: http://geek.michaelgrace.org/2011/09/permanently-add-ssh-key-ssh-add/ )

Aaron
fonte
6
Acho que é melhor do que a solução que propus, porque o ssh-add usa um agente de autenticação que pode lembrar a senha de uma chave privada protegida, para que você não precise digitá-la toda vez que tentar se autenticar. Outra vantagem da solução que você propõe é que, se você tiver muitas chaves, o cliente ssh não proporá chaves irrelevantes para o servidor ao qual você tenta se conectar; na verdade, ele fornecerá apenas as chaves que são para esse servidor e ganhará ' leva o servidor a recusar a conexão devido ao alcance de MaxAuthTries, enquanto tenta todas as chaves listadas em ssh / config.
daminetreg
1
Obrigado @daminetreg. Meu problema específico era a necessidade de acessar gitosis em uma máquina de desenvolvimento sem transferir minha chave privada para ela. Essa solução (junto com a adição ForwardAgent yesà minha .ssh/config) resolveu esse problema de maneira fantástica. Como se vê, pode ser apenas ssh-add &>/dev/nullo comportamento padrão de ssh-addadicionar as chaves encontradas na sua .sshpasta.
Aaron
1
Meu entendimento é que há um interruptor K no Mac OS: stackoverflow.com/questions/1909651/...
Nicu Tofan
3
O @TNick -Kadiciona chaves ao chaveiro do OS X, que as GUIs do OS X usam para se autenticar em servidores estrangeiros. O pôster no Q está se conectando através de um túnel SSH, mas ainda está se conectando a um servidor remoto. A - [SSH Tunnel] -> B O caso em que estou é que estou em um servidor remoto, mas quero que a autenticação seja contra credenciais no meu sistema doméstico. A <- [Auth] - B - [Connect] -> C Então -K, na verdade, não ajuda, mas é uma ótima solução para os outros P.
Aaron
112

Resolvi esse problema no Mac OSX (10.10) usando a opção -K para ssh-add:

ssh-add -K ~/.ssh/your_private_key

Para o macOS 10.12 e versões posteriores, é necessário editar adicionalmente sua configuração ssh, conforme descrito aqui: https://github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain

totas
fonte
3
esta é uma resposta melhor para as pessoas que querem configurá-lo de forma permanente
punkrockpolly
12
Daí este bit: "no Mac OSX (10.10)" ...
Andrew K.
1
Isso é bom e funciona no Mac OSX, mas não funciona no Ubuntu (14.04 nos meus testes).
haxpor
5
Isto não funcionou para mim (no OSX 10.12.4)
guptron
2
De acordo com o man ssh-addmacOS High Sierra, ssh-add -Kele salvará a senha no chaveiro e, após a reinicialização, basta usar ssh-add -A, o que não precisa que você insira sua senha.
DawnSong
36

Basta adicionar o chaveiro, conforme mencionado nas Dicas rápidas do Ubuntu https://help.ubuntu.com/community/QuickTips

o que

Em vez de iniciar constantemente o ssh-agent e o ssh-add, é possível usar o chaveiro para gerenciar suas chaves ssh. Para instalar o chaveiro, basta clicar aqui ou usar o Synaptic para fazer o trabalho ou o apt-get na linha de comando.

Linha de comando

Outra maneira de instalar o arquivo é abrir o terminal (Aplicativo-> Acessórios-> Terminal) e digite:

sudo apt-get install keychain

Editar arquivo

Você deve adicionar as seguintes linhas ao seu $ {HOME} /. Bashrc ou /etc/bash.bashrc:

keychain id_rsa id_dsa
. ~/.keychain/`uname -n`-sh
Christian Saiki
fonte
O que exatamente o segundo comando faz, por curiosidade? isso apenas abre as permissões para o usuário atual?
27618 Vincent Velloello Apr
1
Este .é um pseudônimo parasource
Brad Solomon
18

Tentei a solução do @ Aaron e não funcionou muito para mim, porque adicionava minhas chaves novamente toda vez que eu abria uma nova guia no meu terminal. Então eu o modifiquei um pouco (observe que a maioria das minhas chaves também é protegida por senha, então não posso simplesmente enviar a saída para / dev / null):

added_keys=`ssh-add -l`

if [ ! $(echo $added_keys | grep -o -e my_key) ]; then
    ssh-add "$HOME/.ssh/my_key"
fi

O que isso faz é que ele verifique a saída de ssh-add -l (que lista todas as chaves que foram adicionadas) para uma chave específica e, se não a encontrar, a adicionará ssh-add.

Agora, na primeira vez em que abro meu terminal, as senhas das minhas chaves privadas são solicitadas e não são solicitadas novamente até que eu reinicie (ou saia - não verifiquei) meu computador.

Como tenho um monte de chaves, guardo a saída de ssh-add -l uma variável para melhorar o desempenho (pelo menos acho que melhora o desempenho :))

PS: Estou no Linux e esse código foi para o meu ~/.bashrcarquivo - se você estiver no Mac OS X, presumo que você deve adicioná-lo .zshrcou.profile

EDIT: Como apontado por @Aaron nos comentários, o .zshrcarquivo é usado no zshshell - portanto, se você não estiver usando isso (se não tiver certeza, provavelmente bashusará), esse código deve vá para o seu .bashrcarquivo.

Nikola Ivanov Nikolov
fonte
3
.zshrcé para o zshshell, que eu uso em vez de bash. Se você estiver usando o bashMac OS X (o padrão), ele também estará .bashrclá.
Aaron
1
Após o ssh-add -lcódigo de retorno, você echo $?pode decidir se deseja adicionar a chave ou não. Eu sou minha máquina linux com bash, o ssh-add -lnão irá gerar o nome do arquivo chave. O código de retorno sempre funciona.
Bharat G
12

No meu caso, a solução foi:

As permissões no arquivo de configuração devem ser 600. chmod 600 config

Como mencionado nos comentários acima pelo generalopinion

Não há necessidade de tocar no conteúdo do arquivo de configuração.

erezmta
fonte
Não foi o suficiente para mim no Linux Mint 17.1.
Benares
Eu não acho que 600 faz sentido. O man ssh nos diz que o ~/.ssh/configarquivo é de leitura / gravação para o usuário, e não é gravável por outros.
precisa saber é o seguinte
600 é ler e escrever apenas para o utilizador
Enthusiasmus
6

Eu tive o mesmo problema no Ubuntu 16.04: algumas chaves foram adicionadas permanentemente, para outras eu tive que executar ssh-addem todas as sessões. Eu descobri que as chaves que foram adicionadas permanentemente tinham tanto a chave pública quanto a privada, ~/.sshe as chaves que foram esquecidas em todas as sessões tinham apenas chaves privadas no ~/.sshdiretório Então solução é simples: você deve copiar tanto chave privada e pública para ~/.sshantes de executar ssh-add.

PS: Pelo que entendi no wiki do Gnome, meu método funciona graças à ferramenta gnome-keyring, que faz parte do ambiente de área de trabalho do Gnome. Portanto, meu método provavelmente só funcionará se você usar o Gnome ou o DE baseado em Gnome.

NShiny
fonte
1
Resposta subestimada. Isso resolveu meu problema sem precisar de scripts ou pacotes adicionais depois de pesquisar por duas horas.
etagenklo
Flarkin fabuloso! Ótimo trabalho de detetive. Eu não acho que eu teria descoberto isso.
nicorellius
4

Adicionar as seguintes linhas em "~ / .bashrc" resolveu o problema para mim. Estou usando o Ubuntu 14.04 desktop.

eval `gnome-keyring-daemon --start`
USERNAME="reynold"
export SSH_AUTH_SOCK="$(ls /run/user/$(id -u $USERNAME)/keyring*/ssh|head -1)"
export SSH_AGENT_PID="$(pgrep gnome-keyring)"
reynoldpj
fonte
3

No Ubuntu 14.04 (talvez mais cedo, talvez ainda), você nem precisa do console:

  • começar seahorse ou inicie o que encontrar pesquisando "chave"
  • crie uma chave SSH lá (ou importe uma)
    • não é necessário deixar a senha vazia
    • é oferecido a você até mesmo empurrar a chave pública para um servidor (ou mais)
  • você terminará com um ssh-agent em execução e essa chave carregada, mas bloqueada
  • usando ssh irá capturar a identidade (ou seja, chave) através do agente
  • no primeiro uso durante a sessão, a senha será verificada
    • e você tem a opção de desbloquear automaticamente a chave no login
    • isso significa que a autenticação de login será usada para quebrar a senha da chave
  • nota: se você deseja encaminhar sua identidade (ou seja, encaminhamento de agente), invoque seu sshcom -Aou faça dele o padrão
    • caso contrário, você não poderá se autenticar com essa chave em uma máquina na qual efetuará login posteriormente em uma terceira máquina
Robert Siemer
fonte
3

Eu corro o Ubuntu usando duas chaves id_rsa. (um pessoal para o trabalho). O ssh-add lembraria uma chave (pessoal) e esqueceria a empresa uma vez.

Ao verificar a diferença entre os dois, vi que minha chave pessoal tinha 400 direitos, enquanto a empresa tinha 600 direitos. (tinha u + w). A remoção da gravação do usuário diretamente da chave da empresa (uw ou definida como 400) corrigiu meu problema. O ssh-add agora lembra as duas chaves.

Fholst
fonte
2

Isso funcionou para mim.

ssh-agent /bin/sh
ssh-add /path/to/your/key
Jaseem Abbas
fonte
1

muito simples ^ _ ^ dois passos

1.yum instalar chaveiro

2. adicione o código abaixo a .bash_profile

/usr/bin/keychain $HOME/.ssh/id_dsa
source $HOME/.keychain/$HOSTNAME-sh
LawrenceLi
fonte
12
Ubuntu Não tem yum bobo;)
Adam F
1

Para aqueles que usam Fish shell, você pode usar a seguinte função e chamá-la em ~/.config/fish/config.fishou em um arquivo de configuração separado em ~/.config/fish/conf.d/loadsshkeys.fish. Ele carregará todas as chaves que começam com id_rsa no diretóriossh-agent .

# Load all ssh keys that start with "id_rsa"
function loadsshkeys
  set added_keys (ssh-add -l)
   for key in (find ~/.ssh/ -not -name "*.pub" -a -iname "id_rsa*")
    if test ! (echo $added_keys | grep -o -e $key)
      ssh-add "$key"
    end
  end
end

# Call the function to run it.
loadsshkeys

Se você deseja ssh-agentiniciar automaticamente quando abrir um terminal, use o tuvistavie / fish-ssh-agent para fazer isso.

frederickjh
fonte