Artigos > Múltiplas contas Git no mesmo computador com SSH Config File

Recebendo erro de permissão no Git ao usar várias contas GitHub ou GitLab? Descubra como configurar múltiplas credenciais do Git no mesmo sistema para diferentes repositórios usando múltiplas chaves RSA/ECC.

Já precisou utilizar duas ou mais contas no Git CLI e recebeu de autenticação devido a conflito de credencial? Isso ocorre, geralmente, quando usamos a mesma chave de autenticação em duas contas diferentes no Github/Gitlab. A seguir veremos como configurar duas ou mais contas diferentes no mesmo computador para utilizar no Git via command line.

Requisito

Os métodos que descrevo só funcionam para repositórios clonados por SSH, pois consiste em separar as diferentes credenciais por meio de chaves de autenticação distintas. Repositórios clonados por HTTPS utilizam Tokens, e não chaves.

Cenário

Ao rodar git pull, você recebe uma mensagem similar a esta:

ERROR: Permission to usuario/repo.git denied to usuario-errado.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Como dito anteriormente, isso acontece quando uma mesma chave (RSA ou ECC) está configurada em duas contas distintas no Github ou Gitlab.

Como criar as chaves RSA ou ECC

Se você já possui as chaves necessárias e queira ver somente os métodos de resolver o problema, pule para Método 1 – Config direto em cada repo local

Caso esteja configurando tudo do zero e tenha dúvidas sobre como criar os pares de chaves, podemos criá-las com os comandos a seguir. Lembrando que precisamos de 1 par de chaves por repo. Como, nesses exemplos, temos 2 repositórios Git, então vamos criar dois pares de chaves.

Você deve criar chaves ECC ou RSA. Não deve criar ambas.

Criando chaves ECC

Criando o primeiro par de chaves para uma das contas:

Antes de executar os comandos a seguir, lembre-se de fazer as devidas substituições alterando “conta1” e “conta2”, além de id_git_conta1 e id_git_conta2.

ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/id_git_conta1

Agora, criando o segundo par de chaves para a outra conta:

ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/id_git_conta2
Criando chaves RSA

Se preferir criar RSA, o comando é esse:

ssh-keygen -t rsa -b 4096 -C "[email protected]" -f ~/.ssh/id_git_conta1
ssh-keygen -t rsa -b 4096 -C "[email protected]" -f ~/.ssh/id_git_conta2

Dois pares de chaves foram criadas no diretório ~/.ssh. Os arquivos com extensão “.pub” são as chaves públicas e devem ser configuradas na sua conta do Github/Gitlab.

Agora que temos as chaves, podemos seguir com os métodos. São 3 formas diferentes de resolver o problema. Escolha o que melhor te atender.

Método 1 – Config direto em cada repo local

Esse é o método mais simples, mas, dependendo do cenário, a longo prazo, pode ser o mais difícil de gerenciar. Consiste em editar a configuração do repositório local já clonado.

Basta entrar no diretório de cada git repo e executar:

git config core.sshCommand "ssh -i ~/.ssh/chave_privada_da_conta"

Ponto positivo: É persistente, ou seja, não vai dar problemas assim, do nada. O ponto negativo é que o comando é difícil de memorizar, e você vai precisar dele no futuro caso comece a utilizar uma nova conta Github/Gitlab.

Método 2 – Em tempo de execução

Outra forma de contornar o problema é declarando a variável GIT_SSH_COMMAND sempre que for rodar o git push.

GIT_SSH_COMMAND="ssh -i ~/.ssh/chave_privada_da_conta" git clone [email protected]:usuario/repo.git

O problema disso é que essa chave só será utilizada enquanto a sessão do terminal for válida. Quando fechar o terminal, o valor definido na variável GIT_SSH_COMMAND será perdido.

Método 3 – SSH Config File.

Podemos mapear, de forma persistente, as chaves dos repos via SSH Config File local do usuário do sistema.

Para isso é preciso criar ou editar o arquivo ~/.ssh/config adicionando o seguinte conteúdo:

# Conta principal
Host github.com.conta1
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_git_conta1

# Segunda conta
Host github.com.conta2
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_git_conta2

A diretiva “Host” cria um domain alias para o domínio declarado na diretiva “HostName“. Vamos configurar esses aliases em cada git repo e, quando chamarmos esse Host via comando git, serão utilizadas as credenciais definidas nas diretivas “User” e “IdentityFile“.

Uma vez configurado, para testar, execute o comando abaixo:

ssh -T [email protected]
ssh -T [email protected]

O que faremos a seguir é, basicamente, alterar o Host do repositório Git para os alises que criamos. Com isso, a autenticação será feita com o “User” e “IdentityFile” vinculados ao Host do ~/.ssh/config.

Configurando domain alias em repositório já clonado:

Caso o clone do repositório já esteja na sua máquina, basta editar o domínio do repositório com o comando a seguir:

git remote set-url origin [email protected]:usuario-conta1/repo.git
git remote set-url origin [email protected]:usuario-conta2/repo.git
Clonando repositório do zero com domain alias:

Caso o clone ainda não tenha sido feito, pode-se fazer já utilizando o domain alias como no exemplo abaixo:

git clone [email protected]:usuario-conta1/repo.git
git clone [email protected]:usuario-conta2/repo.git

Para confirmar:

git remote -v

Agora basta testar a vontade.

Resumo

São muitos os casos em que precisamos utilizar diferentes credenciais em repositórios git diferentes. Seja porque temos vários clientes, seja porque os ambientes estão separados em repos diferentes. Fato é que isso é fácil de resolver. A forma mais adequada é a que melhor lhe atende a longo prazo.

Abraços e até a próxima.

0 - 0

Thank You For Your Vote!

Sorry You have Already Voted!

Rolar para cima