Melhor maneira de usar chaves privadas múltipla SSH em um cliente
Pergunta
Eu quero usar várias chaves privadas para conectar a diferentes servidores ou partes do mesmo servidor (meus usos são a administração do sistema de servidores, administração de Git, e uso normal Git dentro do mesmo servidor). Tentei simplesmente empilhar as chaves nos arquivos id_rsa
sem sucesso.
Aparentemente, uma maneira simples de fazer isso é usar o comando
ssh -i <key location> login@server.example.com
Isso é bastante complicado.
Todas as sugestões de como proceder para fazer isso um pouco mais fácil?
Solução
De minha .ssh/config
:
Host myshortname realname.example.com
HostName realname.example.com
IdentityFile ~/.ssh/realname_rsa # private key for realname
User remoteusername
Host myother realname2.example.org
HostName realname2.example.org
IdentityFile ~/.ssh/realname2_rsa # different private key for realname2
User remoteusername
E assim por diante.
Outras dicas
Você pode instruir ssh tentar várias chaves em sucessão ao conectar. Veja como:
$ cat ~/.ssh/config
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/id_rsa_old
IdentityFile ~/.ssh/id_ed25519
# ... and so on
$ ssh server.example.com -v
....
debug1: Next authentication method: publickey
debug1: Trying private key: /home/example/.ssh/id_rsa
debug1: read PEM private key done: type RSA
debug1: Authentications that can continue: publickey
debug1: Trying private key: /home/example/.ssh/id_rsa_old
debug1: read PEM private key done: type RSA
....
[server ~]$
Desta forma, você não tem que especificar o que funciona chave com a qual servidor. Só vai usar a primeira chave de trabalho.
Além disso, você só iria introduzir uma senha, se um determinado servidor está disposto a aceitar a chave. Como visto acima ssh não tente pedir uma senha para .ssh/id_rsa
mesmo que tivesse um.
Com certeza ele não outbeat uma configuração por servidor como em outras respostas, mas pelo menos você não terá que adicionar uma configuração para todos e cada servidor que você conectar-se!
A resposta de Randal Schwartz quase me ajudou o tempo todo. Eu tenho um nome de usuário diferente no servidor, então eu tive que adicionar o usuário palavra-chave para o meu arquivo:
Host friendly-name
HostName long.and.cumbersome.server.name
IdentityFile ~/.ssh/private_ssh_file
User username-on-remote-machine
Agora você pode conectar usando o nome amigável:
ssh friendly-name
Mais palavras-chave pode ser encontrado na página homem OpenSSH . NOTA: Algumas das palavras-chave listadas já deve estar presente em seu / etc / ssh / ssh_config arquivo
.foo:~$ssh-add ~/.ssh/xxx_id_rsa
Certifique-se de testá-lo antes de acrescentar com:
ssh -i ~/.ssh/xxx_id_rsa username@example.com
Se você tiver qualquer problema com erros, por vezes, mudando a segurança do arquivo de ajuda:
chmod 0600 ~/.ssh/xxx_id_rsa
As respostas anteriores explicou adequadamente a maneira de criar um arquivo de configuração para gerenciar várias chaves SSH. Eu acho que, o importante, que também precisa ser explicado é o substituição de um nome de host com um nome de alias, enquanto clonar o repositório .
Suponha, username sua da empresa de conta GitHub é abc1234 . E suponha que seu nome de usuário pessoal de conta GitHub é jack1234
E, suponha que você tenha criado duas chaves RSA, ou seja, id_rsa_company e id_rsa_personal . Assim, sua Configuração arquivo será semelhante a seguir:
# Company account
Host company
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_company
# Personal account
Host personal
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_personal
Agora, quando você está clonando o repositório (chamado demo) da conta GitHub da empresa, a URL do repositório será algo como:
Repo URL: git@github.com:abc1234/demo.git
Agora, ao fazer git clone
, você deve modificar o URL acima repositório como:
git@company:abc1234/demo.git
Observe como github.com é agora substituído com o pseudônimo de "empresa" como já definido no arquivo de configuração.
De forma similar, você tem que modificar a URL clone do repositório na conta pessoal dependendo o alias fornecido no arquivo de configuração.
-
Gerar chave SSH:
$ ssh-keygen -t rsa -C <email1@example.com>
-
Gerar
another SSH key
:$ ssh-keygen -t rsa -f ~/.ssh/accountB -C <email2@example.com>
Agora, duas chaves públicas ( id_rsa.pub , accountB.pub ) deve ser existir no diretório
~/.ssh/
.$ ls -l ~/.ssh # see the files of '~/.ssh/' directory
-
Criar
~/.ssh/config
arquivo de configuração com o seguinte conteúdo:$ nano ~/.ssh/config Host bitbucket.org User git Hostname bitbucket.org PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa Host bitbucket-accountB User git Hostname bitbucket.org PreferredAuthentications publickey IdentitiesOnly yes IdentityFile ~/.ssh/accountB
-
Clone da conta
default
.$ git clone git@bitbucket.org:username/project.git
-
Clone da conta
accountB
.$ git clone git@bitbucket-accountB:username/project.git
Eu concordo com Tuomas sobre o uso do ssh-agent. Eu também queria acrescentar uma segunda chave privada para o trabalho e neste tutorial funcionou como um encanto para mim.
As etapas são as seguintes:
-
$ ssh-agent bash
-
$ ssh-add /path.to/private/key
por exemplossh-add ~/.ssh/id_rsa
- Verifique por
$ ssh-add -l
- testá-lo com
$ssh -v <host url>
por exemplossh -v git@assembla.com
Eu tinha executar para esse problema um tempo atrás, quando eu tinha dois Bitbucket contas e queria tinha para armazenar chaves SSH separados para ambos. Isto é o que funcionou para mim.
Eu criei duas configurações ssh separadas da seguinte forma.
Host personal.bitbucket.org
HostName bitbucket.org
User git
IdentityFile /Users/username/.ssh/personal
Host work.bitbucket.org
HostName bitbucket.org
User git
IdentityFile /Users/username/.ssh/work
Agora, quando eu tinha para clonar um repositório de minha conta de trabalho -. O comando foi a seguinte
git clone git@bitbucket.org:teamname/project.git
Eu tive que modificar este comando para:
git clone git@**work**.bitbucket.org:teamname/project.git
Da mesma forma o comando clone de minha conta pessoal teve que ser modificado para
git clone git @ pessoal .bitbucket.org: nome / personalproject.git
Consulte este ligação para obter mais informações.
Use ssh-agente para suas chaves.
Agora, com a versão recente do git, podemos especificar sshCommand no arquivo de configuração específico git repositório.
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
sshCommand = ssh -i ~/.ssh/id_rsa_user
[remote "origin"]
url = git@bitbucket.org:user/repo.git
fetch = +refs/heads/*:refs/remotes/origin/*
IMPORTANTE: É necessário iniciar ssh-agent
Você deve começar ssh-agent (se ele não estiver em execução) antes de usar o ssh-add a seguinte:
eval `ssh-agent -s` # start the agent
ssh-add id_rsa_2 # where id_rsa_2 is your new private key file
Note que o comando eval inicia o agente no GIT bash em janelas. Outros ambientes podem usar uma variante para iniciar o agente de SSH.
Você pode criar um arquivo de configuração chamado config
na sua pasta ~/.ssh
. Ele pode conter:
Host aws
HostName *yourip*
User *youruser*
IdentityFile *idFile*
Isso permitirá que você se conectar a máquinas como esta ??p>
ssh aws
No Ubuntu 18.04 não há nada a fazer.
Depois de ter criado uma segunda chave ssh com sucesso o sistema irá tentar encontrar uma chave ssh correspondência para cada conexão.
Só para ficar claro, você pode criar uma nova chave com estes comandos
# generate key make sure you give it a new name (id_rsa_server2)
ssh-keygen
# make sure ssh agent is running
eval `ssh-agent`
# add the new key
ssh-add ~/.ssh/id_rsa_server2
# get the public key to add it to a remote system for authentication
cat ~/.ssh/id_rsa_server2.pub
no CentOS 6.5 rodando OpenSSH_5.3p1, OpenSSL 1.0.1e-fips, eu resolvi o problema renomeando os meus arquivos importantes para que nenhum deles tinha o nome padrão. Meu diretório .ssh contém id_rsa_foo e id_rsa_bar mas nenhum id_rsa, etc.
Como mentionend em atlassian página do blog gerar um configuração em ssh , incluindo o seguinte texto:
#user1 account
Host bitbucket.org-user1
HostName bitbucket.org
User git
IdentityFile ~/.ssh/user1
IdentitiesOnly yes
#user2 account
Host bitbucket.org-user2
HostName bitbucket.org
User git
IdentityFile ~/.ssh/user2
IdentitiesOnly yes
Em seguida, você pode simplesmente check-out com o domínio sufixo e dentro dos projetos que você pode configurar os nomes Autor etc. localmente.