Quando você executa:
ssh host some command
ssh
não solicita um tty remoto e o sshd é executado:
exec("remote-user-login-shell", ["remote-user-login-shell", "-c", "some command"])
Esse é o modo rsh
. Quando você não especifica um comando, ele entra no modo rlogin
, onde ele inicia um pseudo-terminal e executa uma sessão de shell interativo de login, onde é executado:
exec("remote-user-login-shell", ["-remote-user-login-shell"])
(com um -
no argv[0]
para dizer ao shell que ele deve se comportar como um shell de login).
Você precisa de -t
quando precisar executar um comando específico de forma interativa (como bash
ou vi
). Nesse caso, sshd
cria um pseudo-terminal no host remoto. Se não, você não quer usar -t
.
Em:
ssh host bash
bash
não faz nada, apenas não é interativo. Ele processará a entrada da mesma forma que processaria um script ou como você obteria executando cat | bash
. Você ainda pode inserir comandos e ver sua saída.
Historicamente, rsh
(que ssh
substituiu) estava executando rlogin
quando não recebeu nenhum comando para executar, e rlogin
estava chamando um serviço diferente (em uma porta TCP diferente) do rsh
serviço.