A maneira normal de se conectar a um servidor SSH é ssh username@ip_address
. Mas um usuário pode querer apenas executar um programa na máquina remota. Portanto, o nome do programa segue o argumento normal, que é ssh username@ip_address <program_name>
. Por exemplo ssh username@ip_address ls
,. Esse argumento é bom, exceto para programas interativos (que também aceitam entrada do usuário e também fornecem saída), por exemplo top
. A saída é
Variável de ambiente TERM não definida.
o que significa que nenhum terminal (pseudo-) está conectado entre os programas sshd e top. A solução é adicionar argumento -t
onde todo o comando se torna agora ssh -t username@ip_address top
.
Minha pergunta é por que o sshd por padrão também não pode usar um pseudo-terminal para se comunicar com programas não interativos, para que não seja necessário adicionar o -t
argumento para programas interativos?
RequestTTY yes
(ouforce
) na sua configuração.top
pode ser executado em modo batch.Respostas:
É verdade que, como já foi dito, os PTYs têm uma certa sobrecarga - mas o grande motivo para não usar um PTY ao executar um comando remoto é que você perde informações.
Normalmente, quando você executa um comando remotamente via ssh, os comandos
stdout
e osstderr
fluxos são enviados para o localstdout
estderr
, o que significa que você pode redirecioná-los / canalizá-los separadamente - por exemplo:Mas se você usar um PTY, toda a saída será
stdout
enviada, porque os PTYs não possuem fluxos separados para saída / erro:fonte
-t
deve ser o padrão e uma opção necessária para desativá-lo. Portanto, a menor vantagem de desempenho é o que faz mais sentido para mim nos casos em que isso não importa.A página de manual para
ssh
descreve isso:É característica e provavelmente causada por razões históricas de
rsh
comportamento. É bem razoável. A maioria dos comandos não é realmente interativa e não é uma operação livre para alocar PTY (que era mais importante há 20 anos).fonte
rsh
é obscuro, pois esse programa não tem opção correspondente.rsh
, mas certamente há alguma influência, não nas opções, mas no comportamento dersh
erlogin
(se houver comando ou não). Você não pode executar um comando interativo (como rogue (6) ou vi (1)) usando rsh; use rlogin (1) em vez disso. .Como é
ssh
possível dizer se o comando que você está chamando é interativo ou não?Esse pesadelo é agravado quando você percebe que pode estar fazendo login em uma máquina executando um sistema operacional não-unix.
Não havendo solução fácil, um caso tinha que ser o padrão.
fonte