Quando você executa ssh user@somehost
sem um comando explícito, está solicitando ao ssh que inicie um shell interativo na máquina remota.
Um shell interativo (como o bash) normalmente quer ter um terminal disponível, já que ele usará comandos de terminal para implementar uma experiência aprimorada ao editar a linha de comando e navegar pelo histórico. (Comandos de terminal permitem controle em tela cheia).
Mas ssh alocará apenas um terminal por padrão (também chamado de pseudo-terminal ) se sua saída padrão estiver conectada a um terminal.
Se você simplesmente executar ssh user@somehost
de um programa terminal (como gnome-terminal, rxvt, xterm, etc.), então sua saída padrão será um terminal, então o ssh criará um pseudo-terminal e o interativo remoto o shell se comportará bem.
Se você canaliza o ssh através de algo (qualquer coisa), como ssh user@somehost | cat
, então sua saída padrão será um pipe (e não o terminal), então o ssh não criará um terminal e isso pode fazer com que o shell interativo se comporte mal.
Uma possível solução é forçar o ssh a criar um pseudo-terminal, passando a opção -t
, como ssh -t user@somehost | cat
, que pode ajudar. (Além disso, você pode precisar de uma opção dupla -tt
para forçar a alocação do pseudo-terminal.)
Outra possibilidade, se você estiver executando o ssh principalmente porque está interessado em um comando específico, é executar o comando específico a partir da linha de comando ssh, como ssh user@somehost mycommand | cat
. Se você executar um comando específico, um shell interativo não se envolverá e, nesse caso, ter um terminal disponível provavelmente não causará problemas.