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