DEV Community

Tulio Calil
Tulio Calil

Posted on

Usando múltiplas chaves SSH para diferentes contas Git (pessoal e trabalho) sem dor de cabeça

https://unsplash.com/pt-br/fotografias/lote-chave-8fs1X0JFgFE

Se você tem conta pessoal e de trabalho no Git (ou até freelas), já deve ter sofrido com o SSH misturando as chaves.
A boa notícia é que dá pra resolver de dois jeitos: automático por diretório ou via alias de host.


Automático por diretório (requer OpenSSH 7.3+)

Essa é a forma que eu mais gosto. Só de estar dentro da pasta do projeto, o SSH já sabe qual chave usar.
Mas atenção: funciona apenas no OpenSSH 7.3 ou superior e você precisa separar os projetos por pastas (pessoais em uma e profissionais em outra, por exemplo). Verifique sua versão do SSH com:

ssh -V
Enter fullscreen mode Exit fullscreen mode

Agora vamos a estrutura de pastas, essa parte é fundamental, precisamos de uma pasta para cada chave, atualmente eu uso algo como:

projects/ #vai usar a chave pessoal
 - blog
 - estudos
 - urubu_do_pix
 - work/ # daqui pra frente vai usar a chave do trabalho 
   - projectA
   - projectB
Enter fullscreen mode Exit fullscreen mode

Ou seja, tudo do trabalho fica na pasta ‘work’. Vamos fazer com que o SSH use uma chave pra todos os lugares e troque apenas quando estiver na ‘work’.

Edite o arquivo de configuração no do SSH que fica em ~/.ssh/config:

# Configuração padrão, usa a chave pessoal
Host github.com
  AddKeysToAgent yes
  User git
  # UseKeychain yes   # (se estiver no macOS)
  IdentitiesOnly yes

# Chave para projetos do trabalho
Match exec "[[ $PWD == /home/tulio/projects/work* ]]"
    IdentityFile ~/.ssh/work_key

Match all
  IdentityFile ~/.ssh/my_key
Enter fullscreen mode Exit fullscreen mode

Lembre de trocar os caminhos, tanto das chaves quanto da pasta work.

Com isso, se você fizer um clone, push ou pull em qualquer lugar diferente da pasta ‘work’, ele vai usar a chave pessoal. Na pasta ‘work’, usa a chave do trabalho. Simples assim.


Alternativa: usando aliases de host

Se a sua versão do SSH não suporta Match exec, dá pra resolver usando aliases.
Nesse caso você cria “atalhos” e aponta o git remote para eles.

Edite o ~/.ssh/config:

# Conta pessoal
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/my_key

# Conta do trabalho
Host work.github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/work_key
Enter fullscreen mode Exit fullscreen mode

Aqui você pode ser criativo com o alias, pode usar até algo mais curto, como "w" apenas, sem o github.com, basta lembrar que na hora de clonar você terá que colonar com "w" no lugar do "github.com" (git@w:org/project.git)

E na hora do clone basta você adicionar work antes do github, exemplo:

git clone git@work.github.com:...
Enter fullscreen mode Exit fullscreen mode

Caso ja tenha o projeto clonado basta trocar a URL da origin, você pode fazer assim:
Veja a URL atual do repositorio:

git remote -v
Enter fullscreen mode Exit fullscreen mode

Copie a URL e adicione o work na frente e troque com:

git remote set-url origin git@work.github.com:...
Enter fullscreen mode Exit fullscreen mode

Fechando

Hoje eu uso o esquema automático por diretório porque me poupa tempo e evita erro, mas a versão com alias funciona em qualquer lugar e é à prova de falhas.
De qualquer jeito, o resultado é o mesmo: nunca mais push falhando por causa da chave errada.

Você pode repetir a configuração para usar várias chaves, eu utilizei apenas duas para simplificar.

Top comments (0)