SSH config: simplificando conexões

1. O que é o arquivo ~/.ssh/config

O arquivo ~/.ssh/config é o coração da personalização do cliente SSH no Linux e macOS. Localizado no diretório home do usuário, dentro da pasta oculta .ssh, ele permite definir regras permanentes para conexões SSH, eliminando a necessidade de digitar parâmetros repetitivos toda vez que você precisa acessar um servidor remoto.

# Localização padrão
~/.ssh/config

Sem esse arquivo, uma conexão típica exige comandos longos como:

ssh -p 2222 -i ~/.ssh/chave_privada usuario@192.168.1.100

Com o SSH config, o mesmo acesso se resume a:

ssh meu-servidor

Permissões obrigatórias: O arquivo config e a pasta .ssh devem ter permissões restritas para segurança:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/config

Isso impede que outros usuários do sistema leiam suas configurações e, principalmente, suas chaves privadas.

2. Sintaxe fundamental: Host, HostName, User, Port

A estrutura básica de uma entrada no SSH config segue este padrão:

Host apelido
    HostName endereco-real.com
    User usuario
    Port 2222
  • Host: Define o apelido (alias) que você usará no comando ssh
  • HostName: O endereço real do servidor (IP ou domínio)
  • User: Nome do usuário remoto
  • Port: Porta SSH (padrão é 22)

Exemplo prático:

# ~/.ssh/config
Host prod
    HostName 192.168.1.100
    User deploy
    Port 2222

Host dev
    HostName dev.internal.company.com
    User devuser
    Port 22

Agora, conectar-se ao servidor de produção é tão simples quanto:

ssh prod

3. Otimizando com chaves SSH e IdentityFile

Para evitar digitar senhas ou especificar chaves manualmente, use IdentityFile:

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/github-key
    IdentitiesOnly yes

Múltiplas chaves para diferentes servidores:

Host servidor-a
    HostName 10.0.0.1
    User admin
    IdentityFile ~/.ssh/chave-servidor-a

Host servidor-b
    HostName 10.0.0.2
    User admin
    IdentityFile ~/.ssh/chave-servidor-b

O parâmetro IdentitiesOnly yes é crucial quando você tem várias chaves SSH carregadas no agente. Ele força o SSH a usar apenas a chave especificada no IdentityFile, evitando o erro "Too many authentication failures" que ocorre quando o cliente tenta todas as chaves disponíveis antes de acertar.

4. Configurações de conexão e tempo

Conexões SSH que ficam inativas por muito tempo podem ser encerradas. Para evitar isso:

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
  • ServerAliveInterval: Envia um pacote "keep alive" a cada 60 segundos
  • ServerAliveCountMax: Número máximo de tentativas sem resposta antes de desconectar (3 × 60s = 3 minutos de tolerância)

Controlando timeouts:

Host servidor-lento
    HostName 203.0.113.50
    User user
    ConnectTimeout 30

ConnectTimeout define o tempo máximo (em segundos) para estabelecer a conexão inicial. Útil em redes instáveis.

Compressão para conexões lentas:

Host servidor-remoto
    HostName slow-server.com
    User user
    Compression yes

A compressão (Compression yes) reduz o tráfego em links lentos, mas aumenta o uso de CPU em ambos os lados.

5. Encaminhamento de portas e agentes

Túnel local (LocalForward): Acesse serviços remotos como se estivessem na sua máquina.

Host banco-remoto
    HostName db.example.com
    User dba
    LocalForward 3306 localhost:3306

Com isso, ssh banco-remoto cria um túnel onde localhost:3306 na sua máquina aponta para localhost:3306 no servidor remoto (geralmente um MySQL).

Túnel remoto (RemoteForward): Exponha um serviço local para o servidor remoto.

Host servidor-publico
    HostName public-server.com
    User user
    RemoteForward 8080 localhost:3000

Isso faz com que public-server.com:8080 redirecione para localhost:3000 na sua máquina local — útil para compartilhar um servidor de desenvolvimento.

Encaminhamento do agente SSH (ForwardAgent):

Host servidor-intermediario
    HostName jump.example.com
    User user
    ForwardAgent yes

Permite usar suas chaves SSH locais em conexões feitas a partir do servidor intermediário. Cuidado: Isso dá ao servidor intermediário acesso às suas chaves. Use apenas em servidores confiáveis. Prefira ProxyJump quando possível.

6. Usando curingas e padrões (Wildcards)

O curinga * configura opções globais que se aplicam a todas as conexões:

Host *
    ServerAliveInterval 60
    ForwardAgent no
    Compression no

O curinga ? corresponde a um caractere qualquer, útil para grupos de hosts com nomes padronizados:

Host web-?
    HostName 10.0.1.%h
    User webadmin
    IdentityFile ~/.ssh/web-key

Isso corresponderia a web-1, web-2, web-a, etc. O %h é substituído pelo valor do Host (ex: web-1 vira 10.0.1.web-1 — cuidado com esse uso específico).

Ordem de precedência: O SSH lê o arquivo de cima para baixo e a regra mais específica vence. Regras com Host * são as últimas na precedência. Por exemplo:

Host prod-*
    User deploy

Host prod-web
    HostName 10.0.1.10
    User admin   # Esta linha sobrescreve "deploy" para prod-web

7. Exemplos completos e cenários do dia a dia

Servidor de produção com chave e túnel:

# ~/.ssh/config
Host producao
    HostName 200.150.100.50
    User sysadmin
    Port 2222
    IdentityFile ~/.ssh/producao-key
    IdentitiesOnly yes
    LocalForward 3306 db.internal:3306
    ServerAliveInterval 30

Acesso: ssh producao — já conecta com a chave certa, cria túnel MySQL e mantém a conexão viva.

Múltiplos servidores em uma VPC com nomes padronizados:

Host vpc-web-*
    HostName 10.0.1.%h
    User ubuntu
    IdentityFile ~/.ssh/vpc-key
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

Para conectar a vpc-web-001, vpc-web-002, etc., use ssh vpc-web-001. O %h é expandido para o nome completo do host.

Dica: combinando SSH config com scripts Bash:

#!/bin/bash
# script: deploy.sh
# Conecta ao servidor de produção e executa comandos

SERVERS=("prod-web-1" "prod-web-2" "prod-db")

for server in "${SERVERS[@]}"; do
    echo "=== Conectando a $server ==="
    ssh "$server" "uptime && df -h /data"
done

Com o SSH config bem configurado, esse script funciona sem precisar de senhas ou parâmetros extras.


O arquivo ~/.ssh/config é uma ferramenta poderosa que transforma o SSH de um utilitário básico em um gerenciador de conexões eficiente. Invista tempo configurando-o corretamente e economize horas de digitação repetitiva no dia a dia.

Referências