# Configure SSH para o Bitbucket, GitLab ou GitHub

## Introdução

<div data-node-type="callout">
<div data-node-type="callout-emoji">ℹ</div>
<div data-node-type="callout-text">Há muitas hospedagens disponíveis para controle de versão como <strong>GitLab</strong>, <strong>GitHub</strong> e <strong>Bitbucket</strong>, todos possuem prós e contras, não abordarei essas diferenças neste artigo, mas focarei na configuração das chaves SSH para eles. Também abordarei como adicionar várias chaves SSH para várias contas diferentes.</div>
</div>

---

## Criar uma Chave SSH

Antes de qualquer coisa, precisamos e queremos criar nossa chave SSH.  
Essa etapa pode ser repetida quantas vezes você preferir.

1- Abra seu terminal e crie uma pasta chamada `.ssh`

```bash
mkdir .ssh
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663001732792/yud7Wc_tF.png align="center")

2- Acesse a pasta `.ssh` que acabamos de criar:

```bash
cd ~/.ssh
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663001761005/q2eeksEXs.png align="center")

3- Gere uma chave SSH com o comando:

> ⚠️ **Substitua no comando abaixo:**  
> **\- "example@simplescloud.io"** para um email de sua preferência  
> **\- bitbucket\_simplescloud\_account\_example** para o nome da chave SSH de sua preferência
> 
> Não preencha nenhuma pergunta solicitada no terminal → apenas pressione **Enter**

```bash
ssh-keygen -t rsa -b 4096 -C "example@simplescloud.io" -f bitbucket_simplescloud_account_example
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1669643144839/wj6uBquVh.png align="center")

4- Em nosso exemplo, podemos ver que nesse momento foram gerados dois arquivos:

* `bitbucket_simplescloud_account_example` → chave privada e que não deve ser compartilhada com ninguém
    
* `bitbucket_simplescloud_account_example.pub` → chave pública que precisaremos para os próximos passos
    

Então é hora de copiarmos o conteúdo de nossa chave pública, você pode fazer isso de várias formas, mas prefiro usar o comando `copyfile` para isso.

<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text"><strong>Dica:</strong> veja como habilitar o plugin <code>copyfile</code> em nosso artigo 👉 <a target="_blank" rel="noopener noreferrer nofollow" href="https://simplescloud.io/vscode" style="pointer-events: none">aqui</a></div>
</div>

Então acesse `~/.ssh` → copie o conteúdo da sua chave pública `bitbucket_simplescloud_account_example.pub` com o comando `copyfile`

```bash
copyfile ~/.ssh/bitbucket_simplescloud_account_example.pub
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1669643743321/wt2fiwNY9.png align="center")

<div data-node-type="callout">
<div data-node-type="callout-emoji">☑</div>
<div data-node-type="callout-text">Pronto! Você já criou sua chave SSH e está com o conteúdo de sua chave pública copiada, agora falta apenas colar ela na conta da hospedagem de controle de versão git de sua preferência, embora o conceito seja o mesmo para todas, pode ser que algumas telas sejam diferentes de uma para outra, então passaremos por alguns exemplos.</div>
</div>

---

## Configurando o SSH no Bitbucket

1- Acesse sua conta do `Bitbucket` → canto superior direito na sua foto ou avatar → `Personal Settings` → `SSH Keys` → `Add Key`

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1669644273554/YvP484UWQ.png align="center")

2- No campo `Label` defina um nome fácil de você identificar e no campo `Key` cole o conteúdo da sua chave pública copiada → `Add Key`

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1669644466205/bnMZ_WVXC.png align="center")

---

## Configurando o SSH no GitLab

1- Acesse sua conta do `GitLab` → `Edit Profile` → `SSH Keys` e cole o conteúdo da sua chave pública → defina um nome de sua preferência → não preencha o campo de data → clique em `Add key`

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663002104338/2sTaJHUyJ.png align="center")

---

## Configurando o SSH no GitHub

1- Acesse sua conta do `GitHub` → canto superior direito na sua foto ou avatar → `Settings` → `SSH and GPG Keys` → `New SSH Key`

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1669654635114/XbrQT2ZYy.png align="center")

2- No campo `Title` defina um nome fácil de você identificar, no campo `Key Type` deixe como `Authentication Key` e no campo `Key` cole o conteúdo da sua chave pública copiada → `Add SSH Key`

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1669654890004/V5uRRMcPc.png align="center")

---

## Múltiplas Chaves SSH para Múltiplas Contas

Agora que já vimos como gerar chaves SSH e adiciona-las nas hospedagens de controle de versões git de sua preferência, é muito provável que em algum momento, você seja adicionado em um projeto, queira criar uma conta, clonar o repositório e esmagar algum código.

Porém não é tão fácil como parece, para a maioria dos repositórios git como GitLab, GitHub e Bitbucket, acontecerá uma mensagem de erro parecida com:

<div data-node-type="callout">
<div data-node-type="callout-emoji">⚠</div>
<div data-node-type="callout-text"><strong>"Someone has already added that SSH key", </strong>ou traduzindo<strong>, "Alguém já adicionou essa chave SSH"</strong></div>
</div>

Essa é uma mensagem um pouco frustrante, pois inicialmente parece fazer sentido querermos usar nossa mesma chave SSH que já temos para uma outra conta recém-criada. Mas não é assim que funciona, explicando melhor essa mensagem diz que sua chave SSH já está adicionada em outra conta, então na prática não podemos "reaproveitar" a mesma chave SSH que você gerou e adicionou na conta Bitbucket pessoal como também em uma segunda conta Bitibucket que você tenha criado por exemplo.

Felizmente há uma solução simples e se aplica da mesma forma para qualquer serviço de hospedagem de controle de versão como `GitLab` e `GitHub`, mas para não ficar repetitivo, usarei um passo a passo com o `Bitbucket`.

---

### Gere várias chaves SSH

Se não podemos usar a mesma chave SSH em várias contas, a solução então é ter várias chaves SSH diferentes. Para esse exemplo, vamos criar:

* **Chave SSH Pessoal**
    
* **Chave SSH para o Projeto do Cliente**
    

<div data-node-type="callout">
<div data-node-type="callout-emoji">☑</div>
<div data-node-type="callout-text">Sem novidades até aqui, basta seguir os passos iniciais deste artigo e gerar chaves SSH com nomes diferentes!</div>
</div>

---

### Adicione as chaves SSH ao Agente

Aqui começam as dicas legais, para fazer uso das chaves SSH recém-criadas, precisamos adicioná-las ao `ssh-agent` que nada mais é do que um programa nativo que contém as chaves privadas usadas para a autenticação pública.

O `ssh-agent` provavelmente já está sendo executado em segundo plano no seu sistema operacional, mas por precaução vamos verificar com o comando:

```bash
eval "$(ssh-agent -s)"
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1669646753539/D41B-t11k.png align="center")

E adicionando novas chaves SSH usando o comando `ssh-add`.

<div data-node-type="callout">
<div data-node-type="callout-emoji">⚠</div>
<div data-node-type="callout-text">Lembre-se de substituir alguns valores do exemplo abaixo para valores reais que você usa.</div>
</div>

```bash
ssh-add ~/.ssh/key_name_personal
ssh-add ~/.ssh/key_name_client
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1669646854304/dE7mU1mYU.png align="center")

---

### Torne as alterações permanentes

Estamos caminhando bem, mas você notará que os passos acima se tornam repetitivos cada vez que abrir o terminal, vamos melhorar isso tornando essas alterações permanentes.

<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text"><strong>Dica:</strong> uso o <code>Zsh Shell</code> e nossos passos serão através dele, veja mais detalhes sobre o <code>Zsh Shell</code> em nosso artigo 👉 <a target="_blank" rel="noopener noreferrer nofollow" href="https://simplescloud.io/windows-terminal#heading-instalando-o-zsh-shell-no-wsl2" style="pointer-events: none">aqui</a></div>
</div>

1- Em seu terminal digite o comando:

```bash
sudo nano ~/.zshrc
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1669647499883/I6TKRFfuU.png align="center")

2- Vá para o final do arquivo de configuração do `Zsh Shell` e adicione os comandos que estávamos fazendo manualmente a cada vez que abríamos o terminal + `&> /dev/null` ao final para evitar algum output e "travar" a exibição inicial do terminal, ou seja:

```bash
eval "$(ssh-agent -s)" &> /dev/null
ssh-add ~/.ssh/bitbucket_personal_account_wsl2 &> /dev/null
ssh-add ~/.ssh/bitbucket_simplescloud_account_wsl2 &> /dev/null
```

Pressione `Ctrl + X` → `Y` → `Enter` para salvar as alterações

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1669647694514/MiSZTZkYB.png align="center")

---

### Configure o SSH

Estamos quase lá, como etapa final, aqui no arquivo de configuração do SSH é que está toda a mágica! Precisamos criar um arquivo de configuração (se você ainda não o tiver) e criar os `aliases` ou "apelidos" personalizados que irão impor o uso ou uma chave SSH específica para um determinado host. Então vamos fazer isso!

1- Digite o comando:

```bash
sudo nano ~/.ssh/config
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1669648062151/QT9KlLGxK.png align="center")

2- Edite o arquivo conforme o exemplo. Lembre-se de pressionar `Ctrl + X` → `Y` → `Enter` para salvar as alterações

```bash
Host bitbucket-personal.org
  HostName bitbucket.org
  User git
  IdentityFile ~/.ssh/bitbucket_personal_account_wsl2
  IdentitiesOnly yes

Host bitbucket-simplescloud.org
  HostName bitbucket.org
  User git
  IdentityFile ~/.ssh/bitbucket_simplescloud_account_wsl2
  IdentitiesOnly yes
```

De agora em diante, toda vez que você clonar um repositório de conta do cliente, simplesmente substitua `bitbucket.com` por `bitbucket-client`, por exemplo:

```bash
❌ git clone git@bitbucket.org:client/project.git
✅ git clone git@bitbucket-simplescloud.org:client/project.git
```

Ao fazer isso, você está ignorando uma resolução de chave pública padrão e apontando explicitamente `ssh-agent` para sempre resolver a conexão `bitbucket-client.org` usando a `~/.ssh/bitbucket_simplescloud_account_wsl2` em nosso exemplo.

<div data-node-type="callout">
<div data-node-type="callout-emoji">☑</div>
<div data-node-type="callout-text">Sua chave padrão funcionará como antes. Truque legal, não é? 🥳</div>
</div>

---

### Altere a URL upstream do repositório já existente

Você pode estar se perguntando o que fazer com os repositórios já existentes. Clonar todos eles um por um não parece divertido. Não é e tem solução!

Para alterar uma URL do repositório atualmente existente, use o comando `git remote set-url`, por exemplo:

```bash
git remote set-url origin git@bitbucket-simplescloud.org:client/project.git
```

---

### Testando a Conexão

Além do comando:

```bash
eval "$(ssh-agent -s)"
```

Já citado para verificar se o `ssh-agent` está em execução, outro comando que pode ser muito útil é o:

```bash
ssh -T git@bitbucket-simplescloud.org
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1669648853576/I7C2NFKf8.png align="center")

Observe que no comando já estamos usando o `bitbucket-simplescloud.org` que é o `alias` ou "apelido" configurado no arquivo `~/.ssh/config`. Desta forma conseguimos testar que a conexão foi realizada com sucesso.

---

## Conclusão

Esta solução resolveu o meu problema e atendeu bem.

<div data-node-type="callout">
<div data-node-type="callout-emoji">✅</div>
<div data-node-type="callout-text">Espero que essas informações tenham sido úteis para você!</div>
</div>
