Dev (Back & Front)ARTIGO

Executando Comandos Remotos de Forma Interativa com SSH

Executando Comandos Remotos de Forma Interativa com SSH
Imagem: Cesar Gimenes

Muitas vezes, eu preciso executar um comando em um servidor remoto, mas não desejo iniciar uma sessão interativa completa. Quero que o programa mantenha todas as características de um processo local, porém seja executado no servidor remoto.

Inicialmente, eu apenas usava o comando ssh especificando o servidor e o comando que desejo executar:

bash
ssh servidor comando

Esse método não funciona bem para programas que exigem um pseudo terminal, como o Neovim. Para resolver isso, eu tentei a opção -t para forçar a alocação de um pseudo terminal. Assim, programas como o ls exibem cores, mas o ambiente de usuário não é carregado. Nesse caso, eu preciso usar a opção --color no ls. Mesmo assim, programas como o Neovim falham porque o shell não se comporta como interativo e códigos ANSI não são processados corretamente.

bash
ssh -t servidor comando

Para que o shell funcione completamente e carregue as configurações, eu informo ao shell que ele deve ser interativo. No zsh, isso ocorre com a opção -i. Eu também uso a opção -c para executar o comando desejado:

bash
ssh -t servidor "zsh -ic 'comando'"

Assim, eu executo comandos complexos de minha máquina local sem abrir uma sessão remota interativa, aumentando a praticidade e a segurança. Esse método é útil em scripts que precisam manipular o servidor, pois não deixa a sessão aberta.

O único inconveniente é que o comando roda em um shell novo, sem carregar variáveis de ambiente e outras configurações após a finalização. Posso conectar a uma sessão do tmux ou do screen, mas isso dificulta a identificação do início e do fim do comando, impedindo a captura de saída.

De qualquer forma segue o comando para criar uma sessão do tmux ou se conectar a uma existente e então executar o comando:

bash
ssh -t servidor "tmux new-session -d -s persistent || true; \
tmux send-keys -t persistent \"zsh -ic 'comando'\" Enter; \
tmux attach -t persistent"

Para obter um shell remoto com todas as configurações e variáveis de ambiente mantendo o estado entre as sessões, precisaríamos de um novo shell.

Cesar GimenesAutor

Trabalha com tecnologia desde a década de 90. Já atuou na área de educação e participou de projetos de mobilidade de grande volume para laboratórios farmacêuticos. Criou games tanto para PC, como para iOS. Hoje está direcionando seus esforços em plataformas de Sistemas Embarcados, IoT, microservices e cloud computing. É um entusiasta de tecnologias como Golang e Docker.

Ver perfil