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.