MXterm Pro

Como evitar que o SSH caia no seu MacBook por tempo limite

Henry AGI
5 min de leitura
An ssh config file with Host *, ServerAliveInterval 60 and ServerAliveCountMax 3, marked packet every 60 s and gives up at 180 s

Para evitar que o SSH caia no Mac por tempo limite, adicione ServerAliveInterval 60 e ServerAliveCountMax 3 em Host * no ~/.ssh/config. O cliente SSH do seu Mac passa a enviar um pequeno pacote de keepalive antes que um roteador Wi-Fi, um firewall corporativo ou o timer de inatividade do servidor remoto feche a conexão. Mesmo assim, ela não sobrevive ao repouso nem a uma troca de Wi-Fi. A seguir, você vê qual dos quatro tempos limite está derrubando sua conexão.

Configure o keepalive global do SSH no ~/.ssh/config

Abra (ou crie) o ~/.ssh/config e adicione um bloco Host * com duas diretivas: ServerAliveInterval 60 e ServerAliveCountMax 3. Apps de terminal que executam seu shell, MXterm Pro incluso, usam o ssh do seu PATH, normalmente o OpenSSH que vem com o macOS.

Esse cliente passa a enviar um pacote nulo de "você está aí?" ao servidor a cada 60 segundos. Se três seguidos (180 segundos) ficarem sem resposta, o SSH fecha a conexão de forma limpa, em vez de travar num socket morto.

Coloque o bloco Host * no final do arquivo. O OpenSSH usa "vale o primeiro valor obtido" para cada opção. Se você já tem blocos Host específicos para servidores individuais (um jump host, uma máquina da VPN do trabalho com configurações próprias), um bloco Host * acima deles já "reservou" o ServerAliveInterval antes de o bloco específico ser lido.

Um intervalo de 60 segundos com 3 tentativas leva até três minutos para notar uma conexão morta, um ponto de partida razoável. Se um firewall corporativo ou um Wi-Fi público derruba conexões ociosas por volta de um minuto, reduza para ServerAliveInterval 30 e ServerAliveCountMax 2. Você detecta a queda em um minuto em vez de três, ao custo de mais um pacote minúsculo a cada 30 segundos.

Para confirmar que funciona, deixe uma sessão ociosa por mais tempo do que o necessário para ela cair antes e veja se continua conectada. O FAQ abaixo mostra como observar os próprios pacotes de keepalive.

O cliente SSH do macOS já vem com TCPKeepAlive yes por padrão, mas essa é uma checagem no nível do TCP, que pode levar até duas horas para notar um socket realmente morto. Ela não resolve o caso de um firewall ou dispositivo NAT que ainda encaminha pacotes, mas decidiu que sua conexão ociosa acabou. O ServerAliveInterval atua no nível do protocolo SSH, e por isso é a configuração que resolve isso.

Guia relacionadoComo gerenciar mais de 50 servidores SSH e VMs na nuvem no Mac

Qual tempo limite está derrubando sua conexão (e por que os MacBooks sofrem mais)

Nem toda desconexão SSH tem a mesma causa, e a correção certa depende de qual é a sua.

Tempo limite de inatividade do firewall ou NAT: algo entre você e o servidor (um firewall corporativo, o roteador de casa, um gateway de VPN) decide que uma conexão sem tráfego por alguns minutos está morta e descarta o estado dela. O ServerAliveInterval resolve isso diretamente, desde que seja menor que a janela de tempo limite desse dispositivo.

Tempo limite de inatividade no servidor: o sshd remoto está configurado para desligar clientes ociosos, ou o shell de login tem seu próprio TMOUT. O ServerAliveInterval local ajuda no caso do sshd, já que seu cliente deixa de parecer ocioso do lado do servidor.

Troca de rede: trocar de rede Wi-Fi, entrar numa VPN ou passar de casa para um hotspot muda seu IP no meio da sessão. A conexão TCP do SSH não sobrevive a isso, e nenhuma configuração de keepalive resolve uma troca de IP. Só um protocolo feito para isso (Mosh) consegue, e ele troca alguns recursos de terminal por essa resiliência.

Repouso: o caso exclusivo do MacBook. Quando você fecha a tampa ou o Mac entra em repouso, ele para de executar seu cliente SSH, então nenhum pacote de keepalive sai nesse intervalo. Ao despertar, o servidor muitas vezes já desistiu da conexão e o SSH reporta um tempo limite ou um broken pipe.

Se uma sessão precisa sobreviver ao fechamento da tampa, rode o job remoto dentro do tmux/screen, para que ele não dependa de a sua conexão local ter caído (mais sobre isso no FAQ).

Corrija também no servidor, se puder

Se você administra o servidor remoto, também pode evitar que o SSH caia no Mac por esse lado. Adicione ClientAliveInterval 60 e ClientAliveCountMax 3 ao /etc/ssh/sshd_config e reinicie o sshd. É o espelho da configuração do cliente no servidor, e impede que o servidor seja quem desliga na sua cara.

Se você não controla o servidor (um host compartilhado, a VM de um cliente, uma máquina na nuvem que outra pessoa gerencia), você não fica sem saída. O ServerAliveInterval no seu próprio ~/.ssh/config funciona de forma independente, já que é o seu cliente que envia o tráfego de keepalive e o sshd remoto não precisa colaborar.

O que acontece no MXterm Pro quando uma sessão atinge o tempo limite

Cada painel de terminal do MXterm Pro é um PTY real executando seu shell de login normal, construído com Tauri e portable-pty em Rust. Não é uma aba de navegador fingindo ser um terminal.

Uma conexão SSH aberta ali dentro usa o mesmo cliente OpenSSH que seu Mac já tem. Num painel comum, o ssh lê seu ~/.ssh/config exatamente como no Terminal.app ou no iTerm2, então as linhas de keepalive deste guia valem sem mudança.

Um painel aberto a partir de um host salvo é diferente. O MXterm Pro inicia o ssh com -o ServerAliveInterval=30 -o ServerAliveCountMax=3 na linha de comando, e por isso nota uma conexão morta em cerca de 90 segundos. O OpenSSH usa o primeiro valor que obtém, e as opções da linha de comando vêm antes do arquivo de configuração. Portanto, os valores do seu ~/.ssh/config para essas duas opções não se aplicam a esse painel.

O que você vê quando uma sessão cai depende de como você a abriu. Se você digitou ssh num painel comum, o processo que termina é o ssh, não o shell por baixo. Você volta ao prompt local do seu Mac, no mesmo painel, com tudo o que já foi impresso ainda na tela. Reconecte digitando o comando de novo ou apertando ↑.

Um painel aberto a partir de um host salvo se comporta de outro jeito. Ele inicia o ssh diretamente, então não há shell para onde voltar. Se o código de saída for 255, o mais comum numa sessão caída, o painel imprime sua própria linha esmaecida que começa com SSH connection failed or dropped (exit 255) e termina com press Enter to reconnect. O Enter abre a conexão de novo.

Para qualquer outro código de saída, o painel imprime Disconnected (exit N) seguido de press Enter to reconnect.

O SSH Host Manager (⌘⇧H) ajuda antes e depois de uma queda, não durante ela. Conectar por um host salvo reaproveita a multiplexação de conexão do próprio OpenSSH (ControlMaster=auto, ControlPersist=10m). Abrir o painel de arquivos SFTP de um host ao qual você já está conectado reaproveita essa conexão e pula o handshake. A conexão compartilhada continua aberta por 10 minutos depois que a última sessão nela é fechada. Há mais sobre hosts salvos na documentação de SSH e SFTP.

A conexão compartilhada fecha antes se você mudar as configurações de conexão do host salvo ou excluir o host, e o painel de arquivos tem um botão Redefinir conexão para um servidor que recusa o login ou força a troca de senha.

Uma observação sobre planos para quem lida com mais de um par de servidores: por padrão, o plano Free salva até 5 hosts SSH nesse gerenciador, e o plano Pro remove esse limite.

MXterm Pro vs iTerm2, Warp, Termius e MobaXterm em sessões SSH longas

O Termius aceita Mosh, que sobrevive a trocas de IP e ao ciclo de repouso e despertar de um jeito que o SSH puro estruturalmente não consegue. Para uma comparação mais completa, veja melhores clientes SSH para Mac.

O MXterm Pro executa várias sessões SSH e agentes de código com IA (Claude Code, Codex, Gemini CLI) lado a lado num mesmo espaço de trabalho. Com o isolamento por worktree marcado no Composer da nova aba (desativado por padrão, só para repositórios git), cada painel de agente ganha seu próprio git worktree, o que reduz a chance de as mudanças de um agente colidirem com as de outro. Isso não substitui as configurações de keepalive acima, então defina-as em qualquer app de terminal que você use.

Veja funcionando na prática

SSH com vários painéis, Command Recipes (Cmd+J) e uma Control Room (antes War Room) multiagente: comece grátis.

Baixar o MXterm Pro

Já tem o MXterm Pro? Leia o guia de configuração →

Novo no MXterm Pro? Veja os preços →

Perguntas frequentes

Qual a diferença entre ServerAliveInterval e ClientAliveInterval?

O ServerAliveInterval é uma configuração do cliente, no ~/.ssh/config do seu Mac. Ela manda sua máquina dar ping no servidor. O ClientAliveInterval é o espelho no servidor, definido em /etc/ssh/sshd_config na máquina remota. Ele manda o servidor dar ping no seu cliente. Você só precisa de um dos lados para o keepalive funcionar. Definir os dois não faz mal e ajuda quando você não sabe qual ponta está derrubando a conexão.

Devo rodar jobs longos dentro do tmux ou screen em vez de depender de keepalive?

Sim, para qualquer coisa que precise sobreviver a uma desconexão de verdade, não só a um tempo limite de inatividade. O ServerAliveInterval só impede que a conexão seja derrubada por parecer ociosa. Ele não salva um job se o MacBook entrar em repouso, o Wi-Fi cair ou você fechar a tampa. Um build ou uma migração dentro do tmux ou screen no servidor remoto continua rodando, aconteça o que acontecer com sua conexão local. Reconecte com tmux attach quando voltar a ficar online.

Por que minha sessão SSH ainda cai mesmo com ServerAliveInterval configurado?

Em geral porque o MacBook entrou em repouso, não porque o keepalive falhou. Um Mac em repouso não executa nenhum cliente SSH, então nenhum pacote de keepalive sai. O SSH reporta a queda no instante em que você desperta o Mac.

Como verifico se minhas configurações de keepalive estão funcionando?

O jeito mais simples é deixar uma sessão ociosa por mais tempo do que o necessário para ela cair antes e confirmar que continua conectada. Para ver os próprios pacotes, execute sudo tcpdump -i en0 host <server-ip> and port 22 numa segunda janela. Procure por pacotes pequenos saindo a cada ServerAliveInterval segundos, mesmo com a sessão ociosa. Um painel aberto a partir de um host salvo os envia a cada 30 segundos.

Pergunte a uma IA sobre o MXterm Pro

Gere na hora uma resposta no ChatGPT, no Claude ou no Perplexity, com base nesta página. Quem escreve a resposta é o assistente, não a gente, então confira as fontes que ele cita.

Pergunta enviadaComo evito que conexões SSH expirem em um MacBook e o que fazem ServerAliveInterval e ServerAliveCountMax?