Várias contas GitHub e configuração SSH


249

Estou com problemas para fazer com que duas chaves SSH / contas GitHub diferentes funcionem bem juntas. Eu tenho a seguinte configuração:

Repositórios acessíveis a partir de uma conta usando git@github.com:accountname

Repositórios acessíveis de outra conta usando git@github.com:anotheraccount

Cada conta tem sua própria chave SSH. As duas chaves SSH foram adicionadas e eu criei um arquivo de configuração. Não acredito que o arquivo de configuração esteja correto. Não sei ao certo como especificar que repositórios acessados ​​usando git@github.com:accountnamedevem id_rsae git@github.com:anotheraccountdevem usar id_rsa_anotheraccount.


Eu encontrei este link útil medium.freecodecamp.org/…
jgreen 18/04/19

Eu tenho 3 identidades SSH separadas em ~ / .ssh / config. O servidor da escola possui uma senha; os 2 para contas de trabalho / pessoais separadas no GitHub não. A execução git pullcontinuava falhando e solicitando a senha da escola, apesar dos arquivos de identidade separados, "IdentitiesOnly = yes", domínios e nomes de host separados, todos presentes em ssh-add -l... A chave uni era 'primeiro' independentemente da configuração. Teve que mover sua seção abaixo das outras em .ssh / config, e agora os git pulldois acessos do GitHub são bem-sucedidos sem solicitar a senha uni ssh.
mc01

Respostas:


309

A resposta de Andy Lester é precisa, mas eu encontrei uma etapa extra importante que eu precisava dar para que isso funcionasse. Ao tentar configurar dois perfis, um para uso pessoal e outro para trabalho, o meu ~/.ssh/configfoi mais ou menos o seguinte:

Host me.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/me_rsa

Host work.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/work_rsa

Meu perfil de trabalho não demorou até que eu fiz a ssh-add ~/.ssh/work_rsa. Depois disso, as conexões com o github usaram o perfil correto. Anteriormente, eles padronizavam a primeira chave pública.

Para Não foi possível abrir uma conexão com seu agente de autenticação ao usar ssh-add,
verifique: https://stackoverflow.com/a/17695338/1760313


39
Obrigado! - ssh-addera o que estava faltando.
sage

Usando o ssh-add, pude ver que não tinha as permissões de arquivo para a chave definida corretamente. Uma vez consertei que tudo funcionava. Então obrigado!
Phatmann

6
Consulte também doblock.com/articles/… . A principal informação nova é que você pode precisar adicionar o nome de usuário ("trabalho", neste exemplo) ao nome do host na URL remota, ou seja, git@work.github.com: work / my_repo.git (como em oposição a "git@github.com ...")
BobS


15
Para corrigir o problema "eles padronizaram a primeira chave pública", adicione IdentitiesOnly yesà Host *seção do seu ~/.ssh/configarquivo. Isso diz ao ssh para realmente usar os IdentityFiles que você especificar, em vez de enviar spam ao servidor com todos eles.
Caracol mecânico

172

Recentemente, tive que fazer isso e analisar todas essas respostas e seus comentários para, eventualmente, reunir as informações. Por isso, colocarei tudo aqui, em um post, para sua conveniência:


Etapa 1: teclas ssh
Crie os pares de chaves necessários. Neste exemplo, me nomeei padrão / original 'id_rsa' (que é o padrão) e meu novo 'id_rsa-work':

ssh-keygen -t rsa -C "stefano@work.com"


Etapa 2: configuração do ssh
Configure vários perfis ssh criando / modificando ~ / .ssh / config . Observe os valores ligeiramente diferentes de 'Host':

# Default GitHub
Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa

# Work GitHub
Host work.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_work


Etapa 3: ssh-add
Você pode ou não precisar fazer isso. Para verificar, liste as impressões digitais de identidade executando:

$ ssh-add -l
2048 1f:1a:b8:69:cd:e3:ee:68:e1:c4:da:d8:96:7c:d0:6f stefano (RSA)
2048 6d:65:b9:3b:ff:9c:5a:54:1c:2f:6a:f7:44:03:84:3f stefano@work.com (RSA)

Se suas entradas não estiverem lá, execute:

ssh-add ~/.ssh/id_rsa_work


Etapa 4: teste
Para testar se você fez tudo isso corretamente, sugiro a seguinte verificação rápida:

$ ssh -T git@github.com
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

$ ssh -T git@work.github.com
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

Observe que você precisará alterar o nome do host (github / work.github) dependendo da chave / identidade que você deseja usar. Mas agora você deve estar pronto! :)


1
Esta é uma ótima resposta. Eu tive que usar ssh-add para adicionar ambas as chaves SSH para utilizar o arquivo de configuração .. Thanks :)
gaurav.singharoy

A única coisa que gosto de acrescentar é que, quando você executa o ssh-keygen -t rsa, ele fornece um nome de arquivo padrão, é onde você insere seu nome de arquivo personalizado.
Donato

Uma das melhores respostas. Também este vídeo me ajudou. youtube.com/watch?v=fnSRBRiQIU8&feature=youtu.be
TestingWithArif

Boa postagem, seria bom se essa postagem incluísse a configuração do seu email de configuração do git: help.github.com/articles/…
Dave Engineer

43

Digamos que aliceseja um usuário do github.com, com 2 ou mais repositórios particulares repoN. Neste exemplo, trabalharemos com apenas dois repositórios nomeados repo1erepo2

https://github.com/alice/repo1

https://github.com/alice/repo2

Você precisa extrair esses repositórios sem inserir uma senha provavelmente em um servidor ou em vários servidores. Você deseja executar, git pull origin masterpor exemplo, e deseja que isso aconteça sem solicitar uma senha.

Você não gosta de lidar com o ssh-agent, descobriu (ou está descobrindo agora) sobre ~/.ssh/configum arquivo que informa ao seu cliente ssh qual chave privada usar, dependendo do nome do host e do nome de usuário, com uma entrada de configuração simples que se parece com isto:

Host github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/alice_github.id_rsa
  IdentitiesOnly yes

Então você foi em frente e criou seu (alice_github.id_rsa, alice_github.id_rsa.pub)par de chaves, depois também foi para o .git/configarquivo do seu repositório e modificou o URL do seu controle remoto originpara algo como:

[remote "origin"]
        url = "ssh://git@github.com/alice/repo1.git"

E, finalmente, você foi à Settings > Deploy keysseção de repositório e adicionou o conteúdo dealice_github.id_rsa.pub

Neste ponto, você pode fazer o seu git pull origin mastersem inserir uma senha sem problemas.

mas e o segundo repositório?

Portanto, seu instinto será pegar a chave e adicioná-la às repo2chaves Deploy, mas o github.com cometerá um erro e informará que a chave já está sendo usada.

Agora você gera outra chave (usando ssh-keygen -t rsa -C "alice@alice.com"sem senhas, é claro) e, para que isso não se torne uma bagunça, você irá nomear suas chaves assim:

  • repo1 par de chaves: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2 par de chaves: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

Agora você colocará a nova chave pública na repo2configuração do Deploy keys no github.com, mas agora você tem um problema com o ssh.

Como o ssh pode dizer qual chave usar se os repositórios estiverem hospedados no mesmo github.comdomínio?

Seu .ssh/configarquivo aponta github.come ele não sabe qual chave usar na hora de fazer o pull.

Então, encontrei um truque no github.com. Você pode dizer ao seu cliente ssh que cada repositório vive em um subdomínio diferente do github.com; nesses casos, eles serão repo1.github.comerepo2.github.com

Então, a primeira coisa é editar os .git/configarquivos nos seus clones de repositório, para que eles fiquem assim:

Para repo1

[remote "origin"]
        url = "ssh://git@repo1.github.com/alice/repo1.git"

Para repo2

[remote "origin"]
        url = "ssh://git@repo2.github.com/alice/repo2.git"

E então, no seu .ssh/configarquivo, agora você poderá inserir uma configuração para cada subdomínio :)

Host repo1.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa
  IdentitiesOnly yes

Host repo2.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa
  IdentitiesOnly yes

Agora você pode, git pull origin mastersem inserir nenhuma senha dos dois repositórios.

Se você tiver várias máquinas, poderá copiar as chaves de cada uma delas e reutilizá-las, mas recomendo que trabalhe com as pernas para gerar 1 chave por máquina e repo. Você terá muito mais chaves para lidar, mas ficará menos vulnerável se uma delas for comprometida.


1
Especificar o subdomínio que corresponde ao host .ssh/configé a etapa crucial - muito obrigado por isso #
Mike Miller

22

Eu tenho duas contas no github, e aqui está o que eu fiz (para linux) para fazê-lo funcionar.

Chaves

  • Crie 2 pares de chaves rsa, via ssh-keygen, nomeie-as corretamente, para facilitar a vida.
  • Adicione chaves privadas ao agente local via ssh-add path_to_private_key
  • Para cada conta do github, faça upload de uma chave pública (distinta).

Configuração

~ / .ssh / config

Host github-kc
    Hostname        github.com
    User git
    IdentityFile    ~/.ssh/github_rsa_kc.pub
    # LogLevel DEBUG3

Host github-abc
    Hostname        github.com
    User git
    IdentityFile    ~/.ssh/github_rsa_abc.pub
    # LogLevel DEBUG3

Defina o URL remoto para repo:

  • Para repo no Host github-kc:

    git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
    
  • Para repo no Host github-abc:

    git remote set-url origin git@github-abc:abcdefg/yyy.git
    

Explicação

Opções em ~/.ssh/config:

  • Hostgithub- <identify_specific_user>
    Host pode ser qualquer valor que possa identificar um host mais uma conta, não precisa ser um host real, por exemplo, github-kcidentificar uma de minha conta no github do meu laptop local,

    Ao definir um URL remoto para um repositório git, é esse o valor a ser colocado depois git@, é assim que um repositório é mapeado para um host, por exemplogit remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git


  • [A seguir estão subopções de Host]
  • Hostname
    especifique o nome do host real, use apenas github.compara o github,
  • Usergit,
    o usuário é sempre gitpara o github,
  • IdentityFile
    especificar chave a ser usada, basta colocar o caminho de uma chave pública,
  • LogLevel
    especifique o nível de log para depuração, se houver algum problema, DEBUG3fornece as informações mais detalhadas.


adorável - não precisava ssh-add path_to_private_key- provavelmente porque o agente não é necessário neste caso. O arquivo de configuração está definindo explicitamente o caminho para as chaves.
Mark Chackerian

2
@ MarkChackerian Eu acho que você não precisa ssh-addporque suas chaves não são protegidas por senha ou (se você estiver em um Mac) o chaveiro OSX está lidando com isso para você. ssh-addimpede que você precise digitar a senha sempre que acessar suas chaves.
Ashhar Hasan 10/10

18

Use o IdentityFileparâmetro em seu ~/.ssh/config:

Host github.com
    HostName github.com
    IdentityFile ~/.ssh/github.rsa
    User petdance

Obrigado, mas isso não é muito preciso. Encontrei a resposta e compartilhei abaixo.
Radesix

Tenho certeza de que minha abordagem funcionará no seu caso. Você pode identificar usuários diferentes e arquivos de identidade diferentes. Basta dar a cada um parâmetro Host diferente na estrofe da configuração.
Andy Lester

1
Andy, de acordo com o link que encontrei abaixo, eu precisava retirar o .com do host. Uma vez que eu fiz isso funcionou bem.
Radesix

5

Uma alternativa possivelmente mais simples para editar o arquivo de configuração ssh (como sugerido em todas as outras respostas) é configurar um repositório individual para usar uma chave ssh diferente (por exemplo, não padrão).

Dentro do repositório para o qual você deseja usar uma chave diferente, execute:

git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_anotheraccount'

E verifique se sua chave foi adicionada ao ssh-agent executando:

ssh-add ~/.ssh/id_rsa_anotheraccount

Lembre-se de que o comando acima adicionará apenas chave ao ssh-agent para sua sessão atual. Se você quer que isso funcione para sempre, você deve adicioná-lo "permanentemente" ao seu ssh-agent. Por exemplo, veja como fazer isso no ubuntu e aqui no OSX .

Também deve ser possível escalar essa abordagem para vários repositórios usando a configuração global do git e as inclusões condicionais ( veja o exemplo ).


4

No meu caso, nenhuma das soluções acima resolveu meu problema, mas o ssh-agent resolve. Basicamente, fiz o seguinte:

  1. Gere um par de chaves usando o ssh-keygen mostrado abaixo. Irá gerar um par de chaves (neste exemplo .\keyfilee .\keyfile.pub)

    ssh-keygen -t rsa -b 4096 -C "yourname@yourdomain" -f keyfile

  2. Carregar keyfile.pubpara o provedor git

  3. Inicie o ssh-agent na sua máquina (você pode verificar ps -ef | grep ssh-agentse já está em execução)
  4. Executar ssh-add .\keyfilepara adicionar credenciais
  5. Agora você pode correr git clone git@provider:username/project.git

4

Passei muito tempo para entender todas as etapas. Então, vamos descrever passo a passo:

  1. Crie um novo arquivo de identidade usando ssh-keygen -t rsa. Dê a ele uma alternativa como proj1.id_rsae acerte sem dúvida, porque você não precisa de uma senha.
  2. Adicionar nova seção em .ssh/config:

    Host proj1.github.com
        HostName github.com
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/proj1.id_rsa
    

Leve em conta a primeira seção e observe que proj1.github.comvoltaremos à seção mais tarde.

  1. Adicione a identidade ao agente ssh ssh-add ~/.ssh/proj1.id_rsa
  2. Isso foi o que eu errei na primeira vez - agora, quando você deseja clonar um repositório proj1, você o usa proj1.github.com(exatamente o host do arquivo de configuração). git clone git@proj1.github.com.

Um bom tutorial.

Não mexa com os hosts


Obrigado pelo link para o turorial! Você tem um erro de digitação: os nomes das chaves id_rsa_proj1e proj1_id_rsana verdade devem ser os mesmos. Você também pode adicionar a parte sobre .git/configconfigurações do tutorial à sua resposta.
cezar

Você ainda tem um erro de digitação: proj1.id_rsavs.proj1_id_rsa
cezar 02/02

2

Eu usei,

Host github.com
   HostName github.com
   IdentityFile ~/.ssh/github_rsa
   User abc@gmail.com

Wokred bem.

Use a configuração acima em seu arquivo .ssh / config para diferentes chaves rsa para diferentes nomes de usuário.


2

Como complemento da resposta de @stefano, é melhor usar o comando -fao gerar uma nova chave SSH para outra conta,

ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "your@mail.com"

Como o id_rsa_workarquivo não existe no caminho ~/.ssh/, eu crio esse arquivo manualmente e não funciona :(


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.