Marketing TechARTIGO

Como Gerenciar suas Chaves SSH Automaticamente no Linux / Mac: Um Guia Prático

Como Gerenciar suas Chaves SSH Automaticamente no Linux / Mac: Um Guia Prático | Quando você trabalha com múltiplos repositórios Git privados, servidores…

Como Gerenciar suas Chaves SSH Automaticamente no Linux / Mac: Um Guia Prático
Imagem: Paulemberg Silva

Como Gerenciar suas Chaves SSH Automaticamente no Linux / Mac: Um Guia Prático | Quando você trabalha com múltiplos repositórios Git privados, servidores ou ambientes que requerem autenticação via SSH, talvez já tenha se deparado com o incômodo de precisar digitar a senha da chave várias vezes ou de não saber exatamente quais chaves estão carregadas. Neste post, vou te mostrar uma forma elegante de resolver isso automaticamente ao iniciar o terminal, personalizando para os nomes de arquivos de chave SSH que você usa.

O Problema

Por padrão, o agente SSH (ssh-agent) só carrega uma chave (geralmente ~/.ssh/id_rsa ou ~/.ssh/id_ed25519). Se você usa várias chaves, precisa rodar ssh-add <nome-do-arquivo-da-chave> cada vez que reinicia o computador ou uma nova sessão de terminal. Isso é manual, suscetível a erros e fácil de esquecer.

A Solução

Vamos criar um trecho de código no seu .bashrc, .zshrc (ou similar) que:

  1. Inicia o SSH agent automaticamente (caso ele ainda não esteja rodando).
  1. Carrega automaticamente todas as suas chaves SSH personalizadas, mas só se elas ainda não estiverem carregadas (evitando duplicidade).

Vamos lá!


1. O Código Base

O código abaixo pode ser adicionado ao seu arquivo de configuração de shell (~/.bashrc ou ~/.zshrc). O truque é trocar <NomeSeuArquivoAqui> pelos nomes que você mesmo escolheu para suas chaves SSH.

shell
# SSH Agent Configuration

# Start SSH agent automatically and add keys
if [ -z "$SSH_AUTH_SOCK" ] || [ ! -S "$SSH_AUTH_SOCK" ]; then
    eval "$(ssh-agent)" > /dev/null
fi

# Function to add SSH keys if they're not already loaded
add_ssh_keys() {
    # Get the fingerprints of currently loaded keys
    local loaded_keys=$(ssh-add -l | awk '{print $2}')

    # Defina aqui suas chaves SSH personalizadas
    local keys=(
        "$HOME/.ssh/<NomeSeuArquivoAqui1>"
        "$HOME/.ssh/<NomeSeuArquivoAqui2>"
        "$HOME/.ssh/<NomeSeuArquivoAqui3>"
    )

    # Verifique cada chave
    for key in "${keys[@]}"; do
        if [ -f "$key" ]; then
            # Obtém o fingerprint da chave
            local key_fingerprint=$(ssh-keygen -lf "$key" | awk '{print $2}')

            # Carrega a chave apenas se não estiver ainda carregada
            if ! echo "$loaded_keys" | grep -q "$key_fingerprint"; then
                echo "Adicionando chave SSH: $key"
                ssh-add "$key"
            fi
        fi
    done
}

2. Personalizando para suas chaves

Basta trocar os nomes <NomeSeuArquivoAqui1>, <NomeSeuArquivoAqui2>, etc., pelos reais das suas chaves. Exemplo:

shell
local keys=(
    "$HOME/.ssh/id_trabalho"
    "$HOME/.ssh/id_pessoal"
    "$HOME/.ssh/chave_gitlab"
)

3. Chamando a função automaticamente

Adicione no final do mesmo arquivo a chamada da função, assim ela será executada sempre ao abrir um novo terminal:

shell
add_ssh_keys

4. Pronto para usar!

Agora, toda vez que você abrir um terminal, seu agente SSH será iniciado (caso não esteja rodando) e suas chaves serão carregadas — de forma inteligente e sem redundância. Isso facilita o uso do Git, deploys, SSH para servidores remotos, etc.


Dicas Adicionais

  • Adicione permissão restrita às suas chaves privadas:chmod 600 ~/.ssh/<NomeSeuArquivoAqui>
  • Se quiser adicionar novas chaves no futuro, só incluir mais linhas no array keys.
  • Funciona tanto para Bash quanto Zsh.

Conclusão

Esse snippet economiza seu tempo, evita esquecimentos e torna o uso do SSH bem mais prático e seguro no seu dia a dia de desenvolvedor. Basta personalizar os nomes dos arquivos das suas chaves SSH, colar o código no seu Bash/Zsh e dizer adeus ao ssh-add manual!

Paulemberg SilvaAutor

Sou um profissional com vasta experiência em Engenharia de Software e Desenvolvimento de Aplicações, com sólida formação acadêmica e expertise em diversas tecnologias. Possuo Bacharelado em Sistemas de Informação. Ao longo da minha carreira, atuei em diversas funções de liderança e desenvolvimento, com destaque para minha experiência como Coordenador de Engenharia de Software desde 2023. Tenho ampla vivência em ambientes ágeis (SCRUM), liderança de equipes, com forte habilidade em negociação de prazos e soluções arquiteturais. Minhas competências técnicas incluem, mas não se limitam a, .NET Core, Azure, Docker, Kubernetes, SQL Server, Postgres, C#, Angular, PL/SQL, e desenvolvimento em nuvem, com um foco contínuo na entrega de soluções eficientes e de alta qualidade. Com um perfil voltado para a inovação e melhoria contínua, sou responsável pela coordenação de equipes, treinamento de profissionais juniores e por garantir que os projetos atendam às necessidades dos clientes. Ao longo da minha carreira, sempre busquei alinhar as tecnologias e processos de desenvolvimento às necessidades de negócios, com foco na excelência e na entrega de valor.

Ver perfil