Post

Estação de Trabalho como Código (Parte 4): Organizando Acessos com SSH Config

Aprenda a organizar seus acessos remotos de forma eficiente e segura com um arquivo de configuração SSH modular. Este tutorial mostra como usar ProxyJump, múltiplos arquivos de configuração e como automatizar a criação de links simbólicos para seus dotfiles com um script Bash robusto.

Estação de Trabalho como Código (Parte 4): Organizando Acessos com SSH Config

Tutorial Anterior: Estação de Trabalho como Código (Parte 3): Configurando Vim e Tmux

Introdução

Nas partes anteriores, construímos uma base sólida para nossa estação de trabalho, personalizando o shell, o editor de texto e o multiplexador de terminal. Agora, vamos abordar um dos aspectos mais críticos para um SysAdmin: o acesso remoto. Gerenciar dezenas de servidores, cada um com seu próprio IP, usuário e chave, pode se tornar um caos. O arquivo de configuração do SSH (~/.ssh/config) é a solução para isso.

Neste tutorial, vamos aprender a criar uma estrutura de configuração SSH modular e poderosa. Vamos explorar como usar ProxyJump (bastion hosts), túneis e como separar configurações pessoais, de trabalho e de laboratório. Além disso, daremos um passo fundamental na automação do nosso ambiente, criando um script Bash inteligente para gerenciar os links simbólicos (symlinks) dos nossos dotfiles.

Objetivos desta Parte

  • Entender o que é SSH Config e por que usá-lo
  • Criar uma estrutura de configuração SSH modular usando a diretiva Include
  • Configurar hosts para acesso direto, ProxyJump e túneis SSH
  • Compreender ProxyJump e bastion hosts
  • Desenvolver um script Bash robusto para automatizar symlinks
  • Implementar boas práticas de Bash scripting
  • Validar que todas as configurações foram aplicadas corretamente

Pré-requisitos

  • Conclusão da Parte 3 desta série
  • Conhecimento básico de SSH e chaves de autenticação
  • Acesso a pelo menos um servidor remoto para testar (opcional)

A quem se destina

Este tutorial é ideal para:

  • SysAdmins: Que gerenciam múltiplos servidores remotos
  • DevOps Engineers: Que usam SSH diariamente para acesso remoto
  • Desenvolvedores: Que trabalham com servidores e infraestrutura
  • Profissionais de TI: Que querem automatizar seu ambiente

Pré-conhecimento: Conhecimento básico de SSH e chaves de autenticação é recomendado. Se você nunca usou SSH, recomendamos ler sobre SSH antes de começar.

Tempo Estimado

50-65 minutos

Isso inclui:

  • Leitura e compreensão: ~10 min
  • Criação de diretórios: ~5 min
  • Criação de arquivos SSH: ~15 min
  • Criação do script: ~10 min
  • Execução e teste: ~10 min

Dica Útil: Se você quiser apenas copiar e colar, pode fazer em 30 minutos. Mas recomendamos ler e entender cada seção.


Verificando Pré-Requisitos

Antes de começar, certifique-se de que completou a Parte 3 corretamente:

Verificando o Repositório

1
2
3
4
5
6
7
8
9
# Verifique se o repositório existe
$ ls -la ~/workspace-as-code/dotfiles/

# Você deve ver:
# -rw-r--r-- .bash_aliases
# -rw-r--r-- .bash_custom
# -rw-r--r-- .vimrc
# drwxr-xr-x .vim
# -rw-r--r-- .tmux.conf

Verificando SSH

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Verifique se SSH está instalado
$ ssh -V

# Você deve ver algo como:
# OpenSSH_8.9p1 Ubuntu-3ubuntu0.1, OpenSSL 3.0.2 15 Feb 2023

# Verifique se tem chaves SSH
$ ls -la ~/.ssh/

# Você deve ver pelo menos:
# -rw------- id_rsa
# -rw-r--r-- id_rsa.pub

# Se não tiver, crie uma chave
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""

Se alguma ferramenta não for encontrada, volte à Parte 1 e instale-a.


O que é SSH Config?

O arquivo ~/.ssh/config é um arquivo de configuração que permite:

  • Definir atalhos para hosts remotos
  • Especificar chaves SSH por host
  • Usar ProxyJump para acessar redes internas
  • Configurar portas customizadas
  • Definir opções de conexão por host

Exemplo Simples

Sem SSH Config, você faria:

1
$ ssh -i ~/.ssh/my_key -p 2222 user@example.com

Com SSH Config, você faz:

1
$ ssh my-server

Estrutura Básica

1
2
3
4
5
Host my-server
    HostName example.com
    User user
    IdentityFile ~/.ssh/my_key
    Port 2222

Muito mais simples! Vamos criar uma estrutura modular para gerenciar múltiplos hosts.


Preparando a Estrutura SSH

Criando os Diretórios

1
2
3
4
5
6
7
8
9
10
11
# Navegue até o diretório de dotfiles
$ cd ~/workspace-as-code/dotfiles

# Crie o diretório .ssh e config.d
$ mkdir -p .ssh/config.d

# Verifique a estrutura
$ ls -la .ssh/

# Você deve ver:
# drwxr-xr-x config.d

Entendendo a Estrutura

1
2
3
4
5
6
7
8
9
10
11
12
dotfiles/
├── .ssh/
│   ├── config              (arquivo principal)
│   └── config.d/           (configurações específicas)
│       ├── pessoal.conf
│       ├── trabalho.conf
│       └── lab.conf
├── .bash_aliases
├── .bash_custom
├── .vimrc
├── .vim/
└── .tmux.conf

Essa estrutura modular permite gerenciar configurações SSH de forma organizada e profissional.


Criando os Arquivos de Configuração SSH

Método 1: Usando cat com redirecionamento (recomendado)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Crie o arquivo config principal
$ cat > ~/workspace-as-code/dotfiles/.ssh/config << 'EOF'
# ~/.ssh/config
# Configuracao principal do SSH

# Configuracoes globais
Host *
    IdentitiesOnly yes  # Evita que o SSH tente todas as chaves disponíveis
    ServerAliveInterval 60
    ServerAliveCountMax 5

# Inclui arquivos de configuracao específicos
Include ~/.ssh/config.d/pessoal.conf
Include ~/.ssh/config.d/trabalho.conf
Include ~/.ssh/config.d/lab.conf
EOF

Método 2: Usando um editor

1
2
3
4
$ vim ~/workspace-as-code/dotfiles/.ssh/config
# Pressione 'i' para inserir
# Cole o conteúdo
# Pressione Esc e digite ':wq' para salvar

Para este tutorial, usaremos a Método 1 (cat com redirecionamento).

Criando os Arquivos Específicos

Agora, crie os arquivos dentro de ~/workspace-as-code/dotfiles/.ssh/config.d/:

Arquivo 1: pessoal.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ cat > ~/workspace-as-code/dotfiles/.ssh/config.d/pessoal.conf << 'EOF'
# pessoal.conf
# Configuracoes para servidores pessoais e VPS

Host vps-pessoal
    HostName 198.51.100.10
    User gean
    IdentityFile ~/.ssh/vps_key
    Port 22022

Host gitlab.com
    HostName gitlab.com
    User git
    IdentityFile ~/.ssh/gitlab_key

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/github_key
EOF

Arquivo 2: trabalho.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ cat > ~/workspace-as-code/dotfiles/.ssh/config.d/trabalho.conf << 'EOF'
# trabalho.conf
# Configuracoes para infraestrutura de trabalho

# Jump Host / Bastion
Host jump.trabalho
    HostName 203.0.113.5
    User seu_usuario
    IdentityFile ~/.ssh/trabalho_key
    Port 22

# Servidor interno acessado via Jump Host
Host servidor-interno
    HostName 10.10.1.50
    User admin
    ProxyJump jump.trabalho
    IdentityFile ~/.ssh/trabalho_key

# Outro servidor interno
Host db-server
    HostName 10.10.1.100
    User postgres
    ProxyJump jump.trabalho
    IdentityFile ~/.ssh/trabalho_key
EOF

Arquivo 3: lab.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ cat > ~/workspace-as-code/dotfiles/.ssh/config.d/lab.conf << 'EOF'
# lab.conf
# Configuracoes para ambiente de laboratorio

Host lab-vm1
    HostName 192.168.1.100
    User ubuntu
    IdentityFile ~/.ssh/lab_key

Host lab-vm2
    HostName 192.168.1.101
    User ubuntu
    IdentityFile ~/.ssh/lab_key
EOF

Entendendo ProxyJump

ProxyJump (também chamado de bastion host ou jump host) é um servidor intermediário que você usa para acessar outros servidores em uma rede interna.

Cenário Típico

1
2
3
4
5
6
7
8
9
Seu Computador
    |
    | SSH
    v
Jump Host (203.0.113.5)
    |
    | SSH (rede interna)
    v
Servidor Interno (10.10.1.50)

Sem ProxyJump (forma antiga)

1
2
3
4
5
# Passo 1: Conectar ao jump host
$ ssh jump.trabalho

# Passo 2: Do jump host, conectar ao servidor interno
$ ssh servidor-interno

Com ProxyJump (forma moderna)

1
2
3
4
5
6
7
# Tudo em um comando
$ ssh servidor-interno

# O SSH automaticamente:
# 1. Conecta ao jump.trabalho
# 2. Cria um túnel para 10.10.1.50
# 3. Conecta ao servidor-interno

Configuração

1
2
3
4
5
6
7
8
9
Host jump.trabalho
    HostName 203.0.113.5
    User seu_usuario
    IdentityFile ~/.ssh/trabalho_key

Host servidor-interno
    HostName 10.10.1.50
    User admin
    ProxyJump jump.trabalho

Muito mais simples e seguro!


Exemplos de Configuração SSH

Exemplo 1: Servidor com Porta Customizada

1
2
3
4
5
Host meu-vps
    HostName 203.0.113.42
    User ubuntu
    IdentityFile ~/.ssh/vps_key
    Port 2222

Exemplo 2: Múltiplas Chaves para o Mesmo Host

1
2
3
4
5
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/github_personal
    IdentityFile ~/.ssh/github_work

Exemplo 3: Servidor com Opções Customizadas

1
2
3
4
5
6
7
8
9
Host servidor-producao
    HostName prod.example.com
    User admin
    IdentityFile ~/.ssh/prod_key
    Port 22
    ServerAliveInterval 60
    ServerAliveCountMax 5
    Compression yes
    CompressionLevel 6

Exemplo 4: Rede Interna com Jump Host

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Host jump.interno
    HostName 203.0.113.10
    User admin
    IdentityFile ~/.ssh/interno_key

Host db-server
    HostName 10.0.1.50
    User postgres
    ProxyJump jump.interno

Host web-server
    HostName 10.0.1.100
    User www-data
    ProxyJump jump.interno

Escolha os exemplos que mais se aplicam ao seu caso!


Permissões Corretas de Arquivos SSH

SSH é muito rigoroso com permissões. Arquivos com permissões erradas serão ignorados.

Permissões Esperadas

Arquivo/DiretórioPermissãoComando
~/.ssh/700 (drwx——)chmod 700 ~/.ssh
~/.ssh/config600 (-rw——-)chmod 600 ~/.ssh/config
~/.ssh/id_rsa600 (-rw——-)chmod 600 ~/.ssh/id_rsa
~/.ssh/id_rsa.pub644 (-rw-r–r–)chmod 644 ~/.ssh/id_rsa.pub
~/.ssh/authorized_keys600 (-rw——-)chmod 600 ~/.ssh/authorized_keys

Corrigindo Permissões

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Corrija todas as permissões de uma vez
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/config
$ chmod 600 ~/.ssh/id_rsa
$ chmod 644 ~/.ssh/id_rsa.pub

# Verifique
$ ls -la ~/.ssh/

# Você deve ver algo como:
# drwx------ .ssh
# -rw------- config
# -rw------- id_rsa
# -rw-r--r-- id_rsa.pub

Se as permissões estiverem erradas, SSH recusará usar as chaves!


Testando a Configuração SSH

Após criar os arquivos de configuração, teste-os:

Teste 1: Verificar Sintaxe

1
2
3
4
5
# Verifique se a sintaxe está correta
$ ssh -G seu-host

# Você deve ver as configurações do host
# Se houver erro de sintaxe, será mostrado aqui

Teste 2: Conectar com Verbose

1
2
3
4
5
6
7
8
# Conecte com modo verbose para ver o que está acontecendo
$ ssh -v seu-host

# Você verá logs detalhados da conexão:
# debug1: Reading configuration data /home/user/.ssh/config
# debug1: Applying options for seu-host
# debug1: Authentications that can continue: publickey
# ...

Teste 3: Testar ProxyJump

1
2
3
4
5
6
# Se estiver usando ProxyJump, teste
$ ssh -v servidor-interno

# Você verá que primeiro conecta ao jump host:
# debug1: Executing proxy command: ssh -v jump.trabalho
# ...

Teste 4: Listar Hosts Configurados

1
2
3
4
5
6
7
8
9
# Veja todos os hosts disponíveis
$ grep "^Host " ~/.ssh/config ~/.ssh/config.d/*

# Você verá uma lista de todos os hosts:
# /home/user/.ssh/config:Host *
# /home/user/.ssh/config.d/pessoal.conf:Host vps-pessoal
# /home/user/.ssh/config.d/pessoal.conf:Host gitlab.com
# /home/user/.ssh/config.d/trabalho.conf:Host jump.trabalho
# /home/user/.ssh/config.d/trabalho.conf:Host servidor-interno

Até agora, criamos todos os nossos dotfiles dentro de ~/workspace-as-code/dotfiles. Para que o sistema os utilize, precisamos criar links simbólicos (symlinks) deles para nosso diretório home (~). Fazer isso manualmente é tedioso e propenso a erros. Vamos automatizar!

Entendendo o Script setup_symlinks.sh

O script é robusto e segue boas práticas. Vamos entender cada seção:

Seção 1: Cabeçalho e Configurações

1
2
#!/bin/bash
set -euo pipefail
LinhaSignificado
#!/bin/bashShebang - diz ao sistema para usar bash
set -eExit se qualquer comando falhar
set -uExit se usar variável não definida
set -o pipefailExit se qualquer comando em um pipe falhar

Seção 2: Funções de Log

1
2
3
info() { echo -e "${BLUE}[INFO]${NC} $*"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
error() { echo -e "${RED}[ERRO]${NC} $*" >&2; exit 1; }

Essas funções coloridas tornam a saída mais legível e profissional.

Seção 3: Configurações

1
2
DOTFILES_DIR="${DOTFILES_DIR:-$HOME/workspace-as-code/dotfiles}"
BACKUP_DIR="$HOME/dotfiles_backup_$(date +%Y%m%d_%H%M%S)"

Define diretórios e cria backup com timestamp.

Seção 4: Loop Principal

1
2
3
4
5
for item in "${items_to_link[@]}"; do
    # Verifica se existe
    # Faz backup se necessário
    # Cria link simbólico
done

Itera sobre cada item e cria links simbólicos.

Seção 5: Atualizar .bashrc

1
2
3
4
5
for file in "${BASH_FILES_TO_SOURCE[@]}"; do
    if ! grep -q "$file" "$BASHRC_FILE"; then
        # Adiciona source ao .bashrc
    fi
done

Garante que os arquivos Bash sejam carregados automaticamente.

Criando o Script com Modo Dry-Run

Crie o script ~/workspace-as-code/scripts/setup_symlinks.sh com o conteúdo abaixo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
$ cat > ~/workspace-as-code/scripts/setup_symlinks.sh << 'EOF'
#!/bin/bash
# setup_symlinks.sh - Cria e gerencia symlinks para os dotfiles

set -euo pipefail

# --- Processamento de Argumentos ---
DRY_RUN=false

while [[ $# -gt 0 ]]; do
    case $1 in
        --dry-run)
            DRY_RUN=true
            shift
            ;;
        *)
            echo "Opcao desconhecida: $1"
            exit 1
            ;;
    esac
done

# --- Funcoes de Log Coloridas ---
if [ -t 1 ]; then
    BLUE='\e[34m'; YELLOW='\e[33m'; RED='\e[31m'; GREEN='\e[32m'; NC='\e[0m'
else
    BLUE=''; YELLOW=''; RED=''; GREEN=''; NC=''
fi

info() { echo -e "${BLUE}[INFO]${NC} $*"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
error() { echo -e "${RED}[ERRO]${NC} $*" >&2; exit 1; }
success() { echo -e "${GREEN}[OK]${NC} $*"; }

# --- Configuracoes ---
DOTFILES_DIR="${DOTFILES_DIR:-$HOME/workspace-as-code/dotfiles}"
BACKUP_DIR="$HOME/dotfiles_backup_$(date +%Y%m%d_%H%M%S)"

# Lista de arquivos/diretorios para criar links
items_to_link=(
    ".bash_aliases" \
    ".bash_custom" \
    ".vimrc" \
    ".vim" \
    ".tmux.conf" \
    ".ssh/config" \
    ".ssh/config.d"
)

# --- Inicio do Script ---
if [ "$DRY_RUN" = true ]; then
    info "Modo DRY-RUN ativado. Nenhuma mudanca sera feita."
fi

info "Iniciando a configuracao de symlinks..."

if [ "$DRY_RUN" = false ]; then
    mkdir -p "$BACKUP_DIR"
    info "Backups serao salvos em: $BACKUP_DIR"
fi

for item in "${items_to_link[@]}"; do
    source_item="$DOTFILES_DIR/$item"
    target_item="$HOME/$item"

    # Verifica se o arquivo de origem existe
    if [ ! -e "$source_item" ]; then
        warn "Arquivo de origem nao encontrado: $source_item. Pulando."
        continue
    fi

    if [ "$DRY_RUN" = true ]; then
        info "[DRY-RUN] Seria criado link: $source_item -> $target_item"
        continue
    fi

    # Se o alvo ja existe e nao e um link, faz backup
    if [ -e "$target_item" ] && [ ! -L "$target_item" ]; then
        info "Fazendo backup de $target_item..."
        mv "$target_item" "$BACKUP_DIR/"
    fi

    # Remove link antigo, se existir
    if [ -L "$target_item" ]; then
        rm -f "$target_item"
    fi

    # Cria o diretorio pai do alvo, se nao existir
    mkdir -p "$(dirname "$target_item")"

    # Cria o novo link simbolico
    ln -s "$source_item" "$target_item"
    success "Link criado para $item"
done

# --- Atualizar .bashrc ---
BASHRC_FILE="$HOME/.bashrc"
BASH_FILES_TO_SOURCE=(".bash_aliases" ".bash_custom")

info "Verificando e atualizando .bashrc..."
for file in "${BASH_FILES_TO_SOURCE[@]}"; do
    if ! grep -q "$file" "$BASHRC_FILE"; then
        if [ "$DRY_RUN" = false ]; then
            info "Adicionando source para '$file' no .bashrc"
            echo -e "\n# Carregar $file se existir\nif [ -f \"\$HOME/$file\" ]; then\n    . \"\$HOME/$file\"\nfi" >> "$BASHRC_FILE"
        else
            info "[DRY-RUN] Seria adicionado source para '$file' no .bashrc"
        fi
    else
        info "Arquivo '$file' ja esta configurado no .bashrc"
    fi
done

if [ "$DRY_RUN" = false ]; then
    success "Configuracao concluida com sucesso!"
    echo "Execute 'source ~/.bashrc' ou reinicie seu terminal para aplicar as mudancas."
else
    info "Modo DRY-RUN concluido. Nenhuma mudanca foi feita."
fi
EOF

# Dê permissão de execução
$ chmod +x ~/workspace-as-code/scripts/setup_symlinks.sh

Executando o Script

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Teste em modo dry-run (sem fazer mudanças)
$ ~/workspace-as-code/scripts/setup_symlinks.sh --dry-run

# Você verá algo como:
# [INFO] Modo DRY-RUN ativado. Nenhuma mudanca sera feita.
# [INFO] Iniciando a configuracao de symlinks...
# [INFO] [DRY-RUN] Seria criado link: /home/user/workspace-as-code/dotfiles/.bash_aliases -> /home/user/.bash_aliases
# ...

# Execute o script para real
$ ~/workspace-as-code/scripts/setup_symlinks.sh

# Você verá algo como:
# [INFO] Iniciando a configuracao de symlinks...
# [INFO] Backups serao salvos em: /home/user/dotfiles_backup_20260219_143022
# [OK] Link criado para .bash_aliases
# [OK] Link criado para .bash_custom
# ...

Atenção: Este script modificará seu diretório home, criando backups de arquivos existentes. Use –dry-run primeiro para revisar o que será feito.


Troubleshooting

Se você encontrar problemas, aqui estão as soluções para os erros mais comuns:

Erro: “Permission denied (publickey)”

Problema: Você recebe esse erro ao tentar conectar via SSH.

Solução:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Verifique se sua chave está sendo usada
$ ssh -v seu-host 2>&1 | grep "Trying private key"

# Verifique permissões da chave
$ ls -la ~/.ssh/id_rsa

# Deve ser 600 (rw-------)
$ chmod 600 ~/.ssh/id_rsa

# Verifique se o ssh-agent está rodando
$ ssh-add -l

# Se não estiver, adicione sua chave
$ ssh-add ~/.ssh/id_rsa

Erro: “Include not supported”

Problema: SSH antigo não suporta a diretiva Include.

Solução:

1
2
3
4
5
6
# Verifique sua versão do SSH
$ ssh -V

# Você precisa de OpenSSH 7.3 ou mais novo
# Se for mais antigo, combine os arquivos manualmente:
$ cat ~/.ssh/config.d/* >> ~/.ssh/config

Erro: “Host key verification failed”

Problema: SSH não consegue verificar a chave do host.

Solução:

1
2
3
4
5
# Adicione a chave do host manualmente
$ ssh-keyscan seu-host >> ~/.ssh/known_hosts

# Ou confie automaticamente (menos seguro)
$ ssh -o StrictHostKeyChecking=no seu-host

Problema: O script roda, mas os links não são criados.

Solução:

1
2
3
4
5
6
7
8
# Execute em modo dry-run para ver o que seria feito
$ ~/workspace-as-code/scripts/setup_symlinks.sh --dry-run

# Verifique se os arquivos de origem existem
$ ls -la ~/workspace-as-code/dotfiles/

# Verifique se tem permissão
$ ls -la ~/

Permissões SSH incorretas

Problema: SSH recusa usar as chaves ou configurações.

Solução:

1
2
3
4
5
6
7
8
# Corrija todas as permissões
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/config
$ chmod 600 ~/.ssh/id_rsa
$ chmod 644 ~/.ssh/id_rsa.pub

# Verifique
$ ls -la ~/.ssh/

Validando Sua Configuração

Crie um script para validar que tudo está funcionando corretamente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
$ cat > ~/workspace-as-code/scripts/validate-ssh.sh << 'EOF'
#!/bin/bash
# Script para validar configuracao SSH

echo "=========================================="
echo "  Validando Configuracao SSH"
echo "=========================================="
echo ""

GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m'

PASSED=0
FAILED=0

check() {
    if eval "$1" &> /dev/null; then
        echo -e "${GREEN}[OK]${NC} $2"
        ((PASSED++))
    else
        echo -e "${RED}[FAIL]${NC} $2"
        ((FAILED++))
    fi
}

# Verificar SSH
check "command -v ssh" "SSH instalado"
check "[ -d ~/.ssh ]" "Diretorio .ssh existe"
check "[ -f ~/.ssh/config ]" "Arquivo config existe"
check "[ -d ~/.ssh/config.d ]" "Diretorio config.d existe"

# Verificar chaves
check "[ -f ~/.ssh/id_rsa ]" "Chave privada existe"
check "[ -f ~/.ssh/id_rsa.pub ]" "Chave publica existe"

# Verificar permissoes
check "[ $(stat -c %a ~/.ssh 2>/dev/null || echo 000) = 700 ]" "Permissoes .ssh corretas (700)"
check "[ $(stat -c %a ~/.ssh/id_rsa 2>/dev/null || echo 000) = 600 ]" "Permissoes id_rsa corretas (600)"

# Verificar symlinks
check "[ -L ~/.vimrc ]" "Link .vimrc criado"
check "[ -L ~/.tmux.conf ]" "Link .tmux.conf criado"
check "[ -L ~/.bash_aliases ]" "Link .bash_aliases criado"

# Verificar sintaxe SSH
check "ssh -G localhost > /dev/null 2>&1" "Sintaxe SSH valida"

echo ""
echo "=========================================="
echo -e "Resultado: ${GREEN}$PASSED passou${NC}, ${RED}$FAILED falhou${NC}"
echo "=========================================="

if [ $FAILED -eq 0 ]; then
    echo "Tudo esta configurado corretamente!"
    exit 0
else
    echo "Alguns itens falharam. Revise os passos acima."
    exit 1
fi
EOF

$ chmod +x ~/workspace-as-code/scripts/validate-ssh.sh
$ ~/workspace-as-code/scripts/validate-ssh.sh

# Você deve ver algo como:
# ==========================================
#   Validando Configuracao SSH
# ==========================================
#
# [OK] SSH instalado
# [OK] Diretorio .ssh existe
# [OK] Arquivo config existe
# [OK] Diretorio config.d existe
# [OK] Chave privada existe
# [OK] Chave publica existe
# [OK] Permissoes .ssh corretas (700)
# [OK] Permissoes id_rsa corretas (600)
# [OK] Link .vimrc criado
# [OK] Link .tmux.conf criado
# [OK] Link .bash_aliases criado
# [OK] Sintaxe SSH valida
#
# ==========================================
# Resultado: 12 passou, 0 falhou
# ==========================================
# Tudo esta configurado corretamente!

Conclusão

Nesta parte, você não apenas aprendeu a organizar seus acessos SSH de maneira profissional, mas também deu um salto gigantesco na automação do seu ambiente. O script setup_symlinks.sh é uma peça central do nosso “Workspace as Code”, permitindo recriar nosso ambiente em qualquer máquina com um único comando.

O Que Você Alcançou

✓ Estrutura modular de SSH Config com Include ✓ Configuração de ProxyJump para acesso remoto seguro ✓ Exemplos práticos de múltiplas configurações SSH ✓ Script robusto de automação de symlinks ✓ Boas práticas de Bash scripting ✓ Tratamento de erros e backups automáticos ✓ Modo dry-run para testes seguros ✓ Script de validação para verificar configurações

Próximos Passos Imediatos

  1. Crie seus arquivos de configuração SSH:
    1
    2
    
    $ vim ~/workspace-as-code/dotfiles/.ssh/config.d/pessoal.conf
    # Adicione seus hosts
    
  2. Execute o script de setup em modo dry-run:
    1
    2
    
    # Teste sem fazer mudanças
    $ ~/workspace-as-code/scripts/setup_symlinks.sh --dry-run
    
  3. Execute o script para real:
    1
    
    $ ~/workspace-as-code/scripts/setup_symlinks.sh
    
  4. Teste a configuração SSH:
    1
    2
    3
    4
    5
    
    # Teste conexão com um host
    $ ssh seu-host
       
    # Valide a configuração
    $ ~/workspace-as-code/scripts/validate-ssh.sh
    
  5. Commit suas mudanças:
    1
    2
    3
    4
    
    $ cd ~/workspace-as-code
    $ git add dotfiles/.ssh/ scripts/setup_symlinks.sh scripts/validate-ssh.sh
    $ git commit -m "feat: add modular ssh config and automation scripts"
    $ git push origin main
    

Próximo Tutorial

Com a automação estabelecida, o próximo passo é explorar a customização da interface gráfica, tornando nosso ambiente de trabalho visualmente coeso e agradável.


Recursos Adicionais


Fim da Parte 4

Próxima: Customizando o GNOME Terminal e a Interface do Ubuntu

This post is licensed under CC BY 4.0 by the author.