O comando SSH remoto requer um terminal

3

Então, para um dos meus servidores, a maior parte do que eu faço é editar arquivos com o vim. É possível fazer algo como ssh me@myserver vim ? Quando tento fazer isso, recebo "Aviso, a saída não é para um terminal", e o vim está inutilizável.

Eu li o manual do ssh, mas o bash não gosta do caractere de escape ~ C para criar um terminal de comando.

    
O
por Ray Vinmad 04.01.2016 / 10:34

1 resposta

5

Teoria

As sessões SSH podem ser iniciadas com - ou sem - o servidor remoto alocando um dispositivo pseudo-terminal (PTY).

Normalmente, quando você se conecta a um host remoto via SSH (sem especificar um comando), você executa seu shell de login padrão após autenticar corretamente. Ao executar este shell em um host remoto, um pseudo-terminal é automaticamente alocado para o shell interativo. Isso permite que o shell grave na tela do usuário para que ele possa fazer coisas como exibir seu prompt.

Durante a sessão interativa, a variável de ambiente SSH_TTY é definida para o nó de dispositivo do dispositivo PTY remoto, por exemplo, /dev/pts/10 e quando o pseudo-terminal sai, ssh imprime a seguinte mensagem:

Connection to <remotehost> closed.

Para sessões SSH não-interativas , isto é, especificando um comando para executar no host remoto, nenhum pseudo-terminal é alocado e a saída do comando é enviada para o stdout do terminal local . Esse comportamento padrão funciona bem ao executar comandos que simplesmente lêem entrada de stdin e imprimem em stdout e / ou stderr , por exemplo, ls , ps , etc. Nesse caso, a variável de ambiente SSH_TTY não está definido e também notei que a variável de ambiente TERM está definida como dumb . Ao operar sem um pseudo-terminal, os caracteres de escape, como ~C , não são suportados; isso torna seguro para programas transferir arquivos binários que podem conter essas seqüências.

No entanto, programas como vim ou top precisam ser capazes de redesenhar a tela usando vários recursos de terminal (geralmente usando a biblioteca ncurses ). Para isso, eles exigem um dispositivo terminal - ou um dispositivo que emula um terminal. O cliente ssh apresenta uma opção -t que força a alocação de um pseudo-terminal. Esta opção -t é descrita na página de manual do SSH:

  

Força a alocação pseudo-tty. Isso pode ser usado para executar programas arbitrários baseados em telas em uma máquina remota, o que pode ser muito útil, por ex. ao implementar serviços de menu. Múltiplas opções -t forçam a alocação tty, mesmo que ssh não tenha tty local.

Conclusão

Portanto, adicionar a opção -t ao seu comando SSH é tudo o que você precisa fazer para fornecer ao Vim um dispositivo terminal que possa ser usado:

ssh -t me@myserver vim
    
por Anthony Geoghegan 04.01.2016 / 11:06