Post

Estação de Trabalho como Código (Parte 3.5): Gerenciando Múltiplas Conexões SSH com Tmux

Aprenda a usar multi-ssh-tmux, um script poderoso para gerenciar múltiplas conexões SSH simultâneas em uma única sessão tmux. Este tutorial complementar mostra como instalar, configurar e usar a ferramenta para automatizar tarefas em múltiplos servidores com sincronização de comandos.

Estação de Trabalho como Código (Parte 3.5): Gerenciando Múltiplas Conexões SSH com Tmux

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

Introdução

Na Parte 3, aprendemos a configurar o Tmux como um multiplexador de terminal poderoso. Agora vamos explorar um caso de uso avançado: gerenciar múltiplas conexões SSH simultâneas em uma única sessão tmux.

multi-ssh-tmux é um script Bash que automatiza a criação de sessões tmux com múltiplos hosts SSH, oferecendo sincronização de comandos, diferentes layouts e gerenciamento flexível. É perfeito para SysAdmins que precisam executar comandos em múltiplos servidores simultaneamente.

Observação: Esta é uma parte complementar e opcional. Se você preferir gerenciar SSH manualmente, pode pular para a Parte 4. No entanto, recomendamos usar multi-ssh-tmux para melhorar sua produtividade ao trabalhar com infraestrutura.

Objetivos desta Parte

  • Entender o que é multi-ssh-tmux e seus benefícios
  • Instalar o script multi-ssh-tmux no seu ambiente
  • Usar multi-ssh-tmux para criar sessões com múltiplos hosts
  • Ativar modo sincronizado para executar comandos em todos os painéis
  • Explorar diferentes layouts de tmux
  • Ler hosts de um arquivo de configuração
  • Executar comandos iniciais em múltiplos hosts
  • Resolver problemas comuns com troubleshooting

Pré-requisitos

  • Conclusão da Parte 3 desta série
  • Tmux configurado (foi configurado na Parte 3)
  • SSH configurado (será configurado na Parte 4, mas você pode usar agora)
  • Acesso a múltiplos servidores para testar (opcional)

A quem se destina

Este tutorial é ideal para:

  • SysAdmins: Que gerenciam múltiplos servidores
  • DevOps Engineers: Que precisam executar tarefas em múltiplos hosts
  • Desenvolvedores: Que trabalham com múltiplas máquinas
  • Profissionais de TI: Que querem automatizar tarefas repetitivas

Pré-conhecimento: Conhecimento básico de Tmux (coberto na Parte 3) é recomendado.

Tempo Estimado

25-35 minutos

Isso inclui:

  • Leitura e compreensão: ~8 min
  • Instalação: ~5 min
  • Testes e exploração: ~10-15 min
  • Troubleshooting (se necessário): ~5 min

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


O que é multi-ssh-tmux?

multi-ssh-tmux é um script Bash que oferece:

  • Criar sessões tmux com múltiplas conexões SSH
  • Sincronizar comandos em todos os painéis simultaneamente
  • Diferentes layouts de tmux (tiled, even-vertical, etc)
  • Ler hosts de um arquivo de configuração
  • Executar comandos iniciais em todos os hosts
  • Suporte a opções SSH customizadas
  • Validação completa de entrada
  • Feedback claro e profissional

Por que usar multi-ssh-tmux?

AspectoBenefício
AutomaçãoCrie sessões com múltiplos hosts em um comando
SincronizaçãoExecute comandos em todos os hosts simultaneamente
OrganizaçãoDiferentes layouts para diferentes necessidades
FlexibilidadeSuporte a arquivos de hosts e opções SSH
ProdutividadeReduza tempo em tarefas repetitivas
ProfissionalCores, formatação e feedback claro
ModularIntegrado com workspace-as-code

Casos de Uso

  • Monitorar múltiplos servidores em tempo real
  • Executar atualizações em múltiplos hosts
  • Coletar informações de múltiplos servidores
  • Gerenciar clusters de máquinas
  • Automatizar tarefas de infraestrutura

Instalando o multi-ssh-tmux

Passo 1: Criar o Diretório

1
2
3
4
5
6
7
8
# Crie o diretório para o script
$ mkdir -p ~/workspace-as-code/scripts/multi-ssh-tmux

# Verifique se foi criado
$ ls -la ~/workspace-as-code/scripts/

# Você deve ver:
# drwxr-xr-x multi-ssh-tmux

Passo 2: Copiar o Script

Copie o script multi-ssh-tmux para o diretório:

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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
$ cat > ~/workspace-as-code/scripts/multi-ssh-tmux/multi-ssh-tmux << 'EOF'
#!/bin/bash

################################################################################
# multi-ssh-tmux - Gerenciador de Conexões SSH Múltiplas com tmux
################################################################################
#
# Descrição:
#   Script para criar sessões tmux com múltiplas conexões SSH simultâneas.
#   Oferece sincronização de comandos, diferentes layouts e gerenciamento
#   flexível de hosts através de linha de comando ou arquivo.
#
# Dependências:
#   - bash (versão 4.0+)
#   - tmux (versão 2.0+)
#   - ssh (OpenSSH)
#
# Uso:
#   multi-ssh-tmux [OPÇÕES] [USUARIO@]HOST1 [[USUARIO@]HOST2 ...]
#
# Exemplos:
#   multi-ssh-tmux --sync user@host1 host2 host3
#   multi-ssh-tmux -s my-session -u admin host1 host2
#   multi-ssh-tmux -l even-vertical -f hosts.txt
#   multi-ssh-tmux -c "uptime" host1 host2 host3
#
# Autor: Gean Martins (adaptado para workspace-as-code)
# Versão: 2.0.0
# Data: 2026-02-19
#
################################################################################

set -euo pipefail

# ============================================================================
# Definições de Cores
# ============================================================================

readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly BLUE='\033[0;34m'
readonly CYAN='\033[0;36m'
readonly NC='\033[0m' # No Color

# ============================================================================
# Constantes Globais
# ============================================================================

readonly MAX_HOSTS=32
readonly VALID_LAYOUTS=("tiled" "even-horizontal" "even-vertical" "main-horizontal" "main-vertical")

# ============================================================================
# Funções de Log
# ============================================================================

_info() {
    echo -e "${BLUE}[INFO]${NC} $*"
}

_warn() {
    echo -e "${YELLOW}[WARN]${NC} $*" >&2
}

_error() {
    echo -e "${RED}[ERRO]${NC} $*" >&2
}

_success() {
    echo -e "${GREEN}[SUCESSO]${NC} $*"
}

# ============================================================================
# Funções de Validação
# ============================================================================

_validar_host() {
    local host="$1"
    local hostname="${host##*@}"
    
    if [[ ! "$hostname" =~ ^[a-zA-Z0-9][a-zA-Z0-9._-]*$ ]]; then
        return 1
    fi
    
    if [ ${#hostname} -gt 253 ]; then
        return 1
    fi
    
    return 0
}

_validar_opcao_ssh() {
    local option="$1"
    
    if [[ ! "$option" =~ ^-[a-zA-Z][a-zA-Z0-9]*= ]]; then
        return 1
    fi
    
    return 0
}

_validar_layout() {
    local layout="$1"
    
    for valid_layout in "${VALID_LAYOUTS[@]}"; do
        if [ "$layout" = "$valid_layout" ]; then
            return 0
        fi
    done
    
    return 1
}

# ============================================================================
# Funções Auxiliares
# ============================================================================

_escapar_para_tmux() {
    local string="$1"
    string="${string//\'/\'\\\'\'}"
    echo "'$string'"
}

command_exists() {
    command -v "$1" &>/dev/null
}

# ============================================================================
# Função de Ajuda
# ============================================================================

mostrar_ajuda() {
    cat << 'HELP'
Uso: multi-ssh-tmux [OPÇÕES] [USUARIO@]HOST1 [[USUARIO@]HOST2 ...]

Opções:
  --sync              Ativa modo sincronizado (comandos replicados em todos os painéis)
  -s, --session NOME  Define um nome para a sessão tmux (padrão: multi-ssh-tmux)
  -u, --user USUARIO  Define um usuário padrão para hosts sem usuário
  -o, --ssh-option OPT=VAL
                      Passa opções específicas para o SSH (ex: -StrictHostKeyChecking=no)
  -l, --layout LAYOUT Define o layout tmux (padrão: tiled)
                      Layouts válidos: tiled, even-horizontal, even-vertical,
                                      main-horizontal, main-vertical
  -d, --detach        Cria a sessão mas não anexa
  -c, --command CMD   Executa comando em todos os hosts após conexão
  -f, --file ARQUIVO  Lê hosts de um arquivo (um por linha, # para comentários)
  --list              Lista todas as sessões tmux existentes
  -h, --help          Mostra esta ajuda

Exemplos:
  multi-ssh-tmux --sync user@host1 host2 host3
  multi-ssh-tmux -s my-session -u admin -o StrictHostKeyChecking=no host1 host2
  multi-ssh-tmux -l even-vertical host1 host2 host3
  multi-ssh-tmux -c "uptime" host1 host2 host3
  multi-ssh-tmux -f hosts.txt -l even-horizontal
  multi-ssh-tmux --list

Variáveis de ambiente:
  SSH_DEFAULT_USER    Define o usuário padrão para conexões SSH (padrão: usuário atual)

Exemplos avançados:
  multi-ssh-tmux -f hosts.txt -l even-vertical --sync
  multi-ssh-tmux --sync -u admin -o StrictHostKeyChecking=no -o ConnectTimeout=5 host1 host2
  multi-ssh-tmux -c "uptime && hostname" -s monitoring host1 host2 host3

Notas:
  - Máximo de hosts: 32
  - Se um host não contiver @, o usuário padrão será adicionado automaticamente
  - Comentários em arquivos de hosts começam com #
  - O modo sincronizado permite executar comandos em todos os painéis simultaneamente
HELP
}

# ============================================================================
# Função Principal
# ============================================================================

main() {
    local sync_mode=false
    local hosts=()
    local session_name="multi-ssh-tmux"
    local default_user="${SSH_DEFAULT_USER:-$USER}"
    local ssh_options=()
    local layout="tiled"
    local attach=true
    local initial_command=""
    local hosts_file=""
    
    # Processar argumentos
    while [[ $# -gt 0 ]]; do
        case $1 in
            --sync)
                sync_mode=true
                shift
                ;;
            -s|--session)
                if [ -z "${2:-}" ]; then
                    _error "Opção $1 requer um valor"
                    return 1
                fi
                session_name="$2"
                shift 2
                ;;
            -u|--user)
                if [ -z "${2:-}" ]; then
                    _error "Opção $1 requer um valor"
                    return 1
                fi
                default_user="$2"
                shift 2
                ;;
            -o|--ssh-option)
                if [ -z "${2:-}" ]; then
                    _error "Opção $1 requer um valor"
                    return 1
                fi
                if ! _validar_opcao_ssh "$2"; then
                    _error "Opção SSH inválida: $2 (use formato: -ChaveOpcao=valor)"
                    return 1
                fi
                ssh_options+=("-$2")
                shift 2
                ;;
            -l|--layout)
                if [ -z "${2:-}" ]; then
                    _error "Opção $1 requer um valor"
                    return 1
                fi
                if ! _validar_layout "$2"; then
                    _error "Layout inválido: $2"
                    _error "Layouts válidos: ${VALID_LAYOUTS[*]}"
                    return 1
                fi
                layout="$2"
                shift 2
                ;;
            -d|--detach)
                attach=false
                shift
                ;;
            -c|--command)
                if [ -z "${2:-}" ]; then
                    _error "Opção $1 requer um valor"
                    return 1
                fi
                initial_command="$2"
                shift 2
                ;;
            -f|--file)
                if [ -z "${2:-}" ]; then
                    _error "Opção $1 requer um valor"
                    return 1
                fi
                hosts_file="$2"
                shift 2
                ;;
            --list)
                tmux list-sessions 2>/dev/null || _info "Nenhuma sessão tmux ativa"
                return 0
                ;;
            -h|--help)
                mostrar_ajuda
                return 0
                ;;
            -*)
                _error "Opção desconhecida: $1"
                mostrar_ajuda
                return 1
                ;;
            *)
                if [[ "$1" != *"@"* ]]; then
                    hosts+=("${default_user}@$1")
                else
                    hosts+=("$1")
                fi
                shift
                ;;
        esac
    done
    
    # Processar arquivo de hosts se fornecido
    if [ -n "$hosts_file" ]; then
        if [ ! -f "$hosts_file" ]; then
            _error "Arquivo não encontrado: $hosts_file"
            return 1
        fi
        
        while IFS= read -r host; do
            [ -z "$host" ] && continue
            [[ "$host" =~ ^[[:space:]]*# ]] && continue
            
            host=$(echo "$host" | xargs)
            
            if [[ "$host" != *"@"* ]]; then
                hosts+=("${default_user}@$host")
            else
                hosts+=("$host")
            fi
        done < "$hosts_file"
    fi
    
    # Validação dos hosts
    if [ ${#hosts[@]} -eq 0 ]; then
        _error "Nenhum host especificado"
        _error "Use -h ou --help para ajuda"
        return 1
    fi
    
    # Validação de limite máximo de hosts
    if [ ${#hosts[@]} -gt $MAX_HOSTS ]; then
        _error "Máximo de hosts permitido: $MAX_HOSTS (você especificou ${#hosts[@]})"
        return 1
    fi
    
    # Validar todos os hosts antes de começar
    for host in "${hosts[@]}"; do
        if ! _validar_host "$host"; then
            _error "Host inválido: $host"
            return 1
        fi
    done
    
    # Verificar se tmux está instalado
    if ! command_exists tmux; then
        _error "tmux não está instalado"
        return 1
    fi
    
    # Verificar se SSH está instalado
    if ! command_exists ssh; then
        _error "ssh não está instalado"
        return 1
    fi
    
    # Criar nova sessão tmux
    _info "Criando sessão tmux: $session_name"
    tmux new-session -d -s "$session_name" -x 200 -y 50
    
    # Criar janela principal
    local window=0
    tmux rename-window -t "$session_name" "ssh"
    
    # Criar painéis para cada host
    for i in "${!hosts[@]}"; do
        if [ $i -eq 0 ]; then
            # Primeiro host usa o painel padrão
            local pane_target="$session_name:$window.0"
        else
            # Criar novo painel
            tmux split-window -t "$session_name:$window" -h
            local pane_target="$session_name:$window.$i"
        fi
        
        # Construir comando SSH
        local ssh_cmd="ssh"
        for opt in "${ssh_options[@]}"; do
            ssh_cmd="$ssh_cmd $opt"
        done
        ssh_cmd="$ssh_cmd ${hosts[$i]}"
        
        # Enviar comando SSH para o painel
        tmux send-keys -t "$pane_target" "$ssh_cmd" Enter
    done
    
    # Aplicar layout
    tmux select-layout -t "$session_name" "$layout"
    
    # Ativar modo sincronizado se solicitado
    if [ "$sync_mode" = true ]; then
        tmux set-window-option -t "$session_name" synchronize-panes on
        _info "Modo sincronizado ativado"
    fi
    
    # Executar comando inicial se fornecido
    if [ -n "$initial_command" ]; then
        sleep 1
        local escaped_cmd=$(_escapar_para_tmux "$initial_command")
        tmux send-keys -t "$session_name" "$escaped_cmd" Enter
    fi
    
    # Anexar ou desanexar
    if [ "$attach" = true ]; then
        _success "Sessão criada e anexada: $session_name"
        tmux attach-session -t "$session_name"
    else
        _success "Sessão criada (desanexada): $session_name"
        _info "Para anexar, use: tmux attach-session -t $session_name"
    fi
}

# Executar programa principal
main "$@"
EOF

# Dê permissão de execução
$ chmod +x ~/workspace-as-code/scripts/multi-ssh-tmux/multi-ssh-tmux

# Verifique se foi criado
$ ls -la ~/workspace-as-code/scripts/multi-ssh-tmux/

# Você deve ver:
# -rwxr-xr-x multi-ssh-tmux

Para usar o script de qualquer lugar, crie um link simbólico em /usr/local/bin:

1
2
3
4
5
6
7
8
9
10
11
# Crie o link simbólico
$ sudo ln -s ~/workspace-as-code/scripts/multi-ssh-tmux/multi-ssh-tmux /usr/local/bin/multi-ssh-tmux

# Verifique se foi criado
$ ls -la /usr/local/bin/multi-ssh-tmux

# Você deve ver:
# lrwxrwxrwx multi-ssh-tmux -> /home/user/workspace-as-code/scripts/multi-ssh-tmux/multi-ssh-tmux

# Teste se funciona
$ multi-ssh-tmux --help

Informação: O link simbólico permite chamar multi-ssh-tmux de qualquer diretório sem precisar do caminho completo.


Usando o multi-ssh-tmux

Sintaxe Básica

1
2
3
4
5
6
7
8
# Forma simples
$ multi-ssh-tmux host1 host2 host3

# Com usuário
$ multi-ssh-tmux user@host1 user@host2 host3

# Com opções
$ multi-ssh-tmux --sync -s my-session host1 host2 host3

Opções Principais

OpçãoDescrição
--syncAtiva modo sincronizado (comandos em todos os painéis)
-s, --session NOMEDefine nome da sessão tmux
-u, --user USUARIODefine usuário padrão
-l, --layout LAYOUTDefine layout tmux
-c, --command CMDExecuta comando após conexão
-f, --file ARQUIVOLê hosts de arquivo
-d, --detachCria sessão sem anexar
--listLista sessões tmux
-h, --helpMostra ajuda

Layouts Disponíveis

LayoutDescrição
tiledDivide igualmente (padrão)
even-horizontalPainéis lado a lado
even-verticalPainéis um sobre o outro
main-horizontalUm painel grande em cima
main-verticalUm painel grande à esquerda

Exemplos Práticos

Exemplo 1: Conectar a Múltiplos Hosts

1
2
3
4
# Conectar a 3 hosts com layout padrão
$ multi-ssh-tmux host1 host2 host3

# Você verá 3 painéis com conexões SSH abertas

Exemplo 2: Modo Sincronizado

1
2
3
4
5
6
# Ativar modo sincronizado
$ multi-ssh-tmux --sync host1 host2 host3

# Agora qualquer comando digitado vai para todos os painéis
# Digite: uptime
# Resultado: uptime executado em todos os 3 hosts simultaneamente

Exemplo 3: Layout Customizado

1
2
3
4
5
# Usar layout even-vertical (painéis um sobre o outro)
$ multi-ssh-tmux -l even-vertical host1 host2 host3

# Usar layout main-vertical (um grande à esquerda)
$ multi-ssh-tmux -l main-vertical host1 host2 host3 host4

Exemplo 4: Executar Comando Inicial

1
2
3
4
# Executar comando após conectar
$ multi-ssh-tmux -c "uptime" host1 host2 host3

# Resultado: uptime executado automaticamente em todos os hosts

Exemplo 5: Ler Hosts de Arquivo

Primeiro, crie um arquivo de hosts:

1
2
3
4
5
6
7
8
9
10
11
12
$ cat > ~/hosts.txt << 'EOF'
# Servidores de produção
prod-server-1
prod-server-2

# Servidores de staging
staging-server-1
staging-server-2
EOF

# Usar o arquivo
$ multi-ssh-tmux -f ~/hosts.txt --sync

Exemplo 6: Opções SSH Customizadas

1
2
3
4
5
# Desabilitar verificação de chave de host
$ multi-ssh-tmux -o StrictHostKeyChecking=no host1 host2

# Múltiplas opções
$ multi-ssh-tmux -o StrictHostKeyChecking=no -o ConnectTimeout=5 host1 host2

Exemplo 7: Sessão Nomeada e Desanexada

1
2
3
4
5
6
# Criar sessão nomeada e desanexada
$ multi-ssh-tmux -s monitoring -d host1 host2 host3

# Resultado: Sessão criada em background
# Para anexar depois:
$ tmux attach-session -t monitoring

Exemplo 8: Caso de Uso Real - Monitorar Cluster

1
2
3
4
5
6
# Criar sessão para monitorar cluster
$ multi-ssh-tmux -s cluster-monitor -l even-vertical \
  -c "watch -n 1 'uptime && free -h'" \
  server1 server2 server3 server4

# Resultado: Cada painel mostra uptime e memória em tempo real

Entendendo o Script

Seção 1: Inicialização

1
set -euo pipefail

Garante que o script falhe se houver erro, variável indefinida ou falha em pipe.

Seção 2: Cores e Formatação

1
2
3
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
# ... etc

Define cores para tornar a saída mais legível.

Seção 3: Funções de Validação

1
2
3
_validar_host()      # Valida formato de host
_validar_layout()    # Valida layout tmux
_validar_opcao_ssh() # Valida opções SSH

Garantem que entrada é válida antes de processar.

Seção 4: Processamento de Argumentos

1
2
3
4
5
6
7
8
while [[ $# -gt 0 ]]; do
    case $1 in
        --sync)
            sync_mode=true
            ;;
        # ... etc
    esac
done

Processa opções de linha de comando.

Seção 5: Criação de Sessão Tmux

1
2
3
tmux new-session -d -s "$session_name"
tmux split-window -t "$session_name"
tmux send-keys -t "$pane_target" "$ssh_cmd" Enter

Cria sessão, painéis e envia comandos SSH.


Troubleshooting

Erro: “tmux not found”

Problema: tmux não está instalado.

Solução:

1
2
3
4
$ sudo apt install tmux

# Verifique
$ tmux -V

Erro: “ssh not found”

Problema: SSH não está instalado.

Solução:

1
2
3
4
$ sudo apt install openssh-client

# Verifique
$ ssh -V

Erro: “Invalid host”

Problema: Você digitou um hostname inválido.

Solução:

1
2
3
4
5
# Hostnames válidos: server1, prod-server, 192.168.1.1
# Hostnames inválidos: server@1, server#1

# Use hostnames válidos
$ multi-ssh-tmux server1 server2

Erro: “Maximum hosts exceeded”

Problema: Você tentou conectar a mais de 32 hosts.

Solução:

1
2
3
4
# Máximo de hosts: 32
# Divida em múltiplas sessões
$ multi-ssh-tmux -s session1 host1 host2 host3
$ multi-ssh-tmux -s session2 host4 host5 host6

Conexão não funciona

Problema: SSH não consegue conectar aos hosts.

Solução:

1
2
3
4
5
6
7
8
9
10
11
# Teste conexão manual
$ ssh user@host1

# Se falhar, verifique:
# 1. Host está online
# 2. SSH está configurado corretamente
# 3. Chaves SSH estão corretas
# 4. Firewall permite SSH

# Use opções SSH para debug
$ multi-ssh-tmux -o StrictHostKeyChecking=no host1

Modo sincronizado não funciona

Problema: Comandos não são replicados em todos os painéis.

Solução:

1
2
3
4
5
6
7
8
# Verifique se sincronização está ativada
$ tmux show-window-options -t session-name synchronize-panes

# Se estiver off, ative manualmente
$ tmux set-window-option -t session-name synchronize-panes on

# Ou use flag --sync
$ multi-ssh-tmux --sync host1 host2 host3

Arquivo de hosts não encontrado

Problema: Arquivo especificado não existe.

Solução:

1
2
3
4
5
6
7
8
9
10
11
12
# Verifique se arquivo existe
$ ls -la ~/hosts.txt

# Se não existir, crie
$ cat > ~/hosts.txt << 'EOF'
host1
host2
host3
EOF

# Use o arquivo
$ multi-ssh-tmux -f ~/hosts.txt

Dicas e Boas Práticas

Dica 1: Use Nomes Descritivos de Sessão

1
2
3
4
5
6
# Bom
$ multi-ssh-tmux -s prod-monitoring host1 host2 host3
$ multi-ssh-tmux -s staging-deploy host4 host5

# Ruim
$ multi-ssh-tmux host1 host2 host3

Dica 2: Organize Hosts em Arquivos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Crie arquivo para cada ambiente
$ cat > ~/prod-servers.txt << 'EOF'
prod-web-1
prod-web-2
prod-db-1
EOF

$ cat > ~/staging-servers.txt << 'EOF'
staging-web-1
staging-db-1
EOF

# Use facilmente
$ multi-ssh-tmux -s prod -f ~/prod-servers.txt
$ multi-ssh-tmux -s staging -f ~/staging-servers.txt

Dica 3: Combine com Comandos Úteis

1
2
3
4
5
6
7
8
# Monitorar recursos
$ multi-ssh-tmux --sync -c "watch -n 1 free -h" host1 host2

# Verificar status de serviço
$ multi-ssh-tmux --sync -c "systemctl status nginx" host1 host2

# Coletar logs
$ multi-ssh-tmux --sync -c "tail -f /var/log/syslog" host1 host2

Dica 4: Use Variáveis de Ambiente

1
2
3
4
5
# Definir usuário padrão
$ export SSH_DEFAULT_USER=admin
$ multi-ssh-tmux host1 host2 host3

# Resultado: Conecta como admin@host1, admin@host2, etc

Dica 5: Navegue Entre Painéis

Dentro de uma sessão tmux:

1
2
3
4
5
# Navegar entre painéis
Ctrl+B Seta      # Navegar para painel adjacente
Ctrl+B Z         # Zoom em um painel
Ctrl+B Espaço    # Trocar layout
Ctrl+B S         # Sincronizar painéis (se configurado)

Dica 6: Salve Sessões Frequentes

1
2
3
4
5
6
7
# Crie alias para sessões frequentes
$ alias prod-monitor='multi-ssh-tmux -s prod-monitor -l even-vertical -f ~/prod-servers.txt'
$ alias staging-monitor='multi-ssh-tmux -s staging -f ~/staging-servers.txt'

# Agora use facilmente
$ prod-monitor
$ staging-monitor

Integrando com Seu Fluxo de Trabalho

Adicionar multi-ssh-tmux ao Git

1
2
3
4
5
# Adicione o script ao repositório
$ cd ~/workspace-as-code
$ git add scripts/multi-ssh-tmux/
$ git commit -m "feat: add multi-ssh-tmux for managing multiple ssh sessions"
$ git push origin main

Criar Arquivo de Hosts Versionado

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Crie diretório para hosts
$ mkdir -p ~/workspace-as-code/hosts

# Crie arquivos de hosts
$ cat > ~/workspace-as-code/hosts/production.txt << 'EOF'
prod-web-1
prod-web-2
prod-db-1
EOF

# Versione
$ git add hosts/
$ git commit -m "docs: add host configurations"
$ git push origin main

Criar Scripts de Automação

1
2
3
4
5
6
7
8
# Crie script para atualizar todos os servidores
$ cat > ~/workspace-as-code/scripts/update-all.sh << 'EOF'
#!/bin/bash
multi-ssh-tmux --sync -c "sudo apt update && sudo apt upgrade -y" \
  -f ~/workspace-as-code/hosts/production.txt
EOF

$ chmod +x ~/workspace-as-code/scripts/update-all.sh

Conclusão

O multi-ssh-tmux é uma ferramenta poderosa que transforma como você gerencia múltiplos servidores. Ele oferece:

✓ Automação de criação de sessões tmux ✓ Sincronização de comandos em múltiplos hosts ✓ Diferentes layouts para diferentes necessidades ✓ Suporte a arquivos de hosts ✓ Opções SSH customizadas ✓ Validação completa de entrada ✓ Integração com workspace-as-code

O Que Você Alcançou

✓ Instalação do multi-ssh-tmux ✓ Criação de link simbólico para acesso global ✓ Compreensão de como o script funciona ✓ Capacidade de criar sessões com múltiplos hosts ✓ Uso de modo sincronizado ✓ Exploração de diferentes layouts ✓ Integração com seu fluxo de trabalho

Próximos Passos Imediatos

  1. Teste o multi-ssh-tmux:
    1
    
    $ multi-ssh-tmux --help
    
  2. Crie seus primeiros hosts:
    1
    2
    3
    4
    
    $ cat > ~/test-hosts.txt << 'EOF'
    localhost
    EOF
    $ multi-ssh-tmux -f ~/test-hosts.txt
    
  3. Explore layouts:
    1
    
    $ multi-ssh-tmux -l even-vertical localhost localhost
    
  4. Commit suas mudanças:
    1
    2
    3
    4
    
    $ cd ~/workspace-as-code
    $ git add scripts/multi-ssh-tmux/
    $ git commit -m "feat: add multi-ssh-tmux for managing multiple ssh sessions"
    $ git push origin main
    

Próximo Tutorial

Com Tmux e SSH avançados configurados, o próximo passo é aprender a gerenciar configurações SSH de forma organizada e profissional.


Recursos Adicionais


Fim da Parte 3.5

Próxima: Organizando Acessos com SSH Config

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