当我这样做时,ssh host
它会让我登录host
然后运行 bash。但当我ssh host bash
这样做时,它就会坐在那里,看似什么也不做。要获得可用的 bash 提示符,我必须提供-t
如下内容:ssh -t host bash
。
实际上它并不只是坐在那里无所事事。当我这样做时ssh host bash
(没有-t
),似乎我得到了一个有效的bash,但没有提示。我可以执行像echo foo
or 这样的命令ps -ef
,并将获得可用的输出。只是没有提示。
为什么我需要-t
获得ssh host bash
可用的 bash 提示符,但ssh host
bash 运行得很好?
答案1
当你跑步时:
ssh host some command
ssh
不请求在远程端使用伪 tty 设备。 stdout 和 stderr 或远程命令是管道。sshd
运行:
exec("remote-user-login-shell", ["remote-user-login-shell", "-c", "some command"])
这就是rsh
模式。当您不指定命令时,它会进入该rlogin
模式,在该模式下启动伪终端,并运行登录交互式 shell 会话,在该会话中运行:
exec("remote-user-login-shell", ["-remote-user-login-shell"])
(-
在 中加一个前导argv[0]
告诉 shell 它将充当登录 shell)。
-t
当您需要以交互方式运行特定命令(例如bash
或vi
)时,您需要sshd
在远程主机上创建一个伪终端来与远程命令交互。如果没有,你就这样做不是想要使用-t
。
在:
ssh host bash
bash
不执行任何操作,只是不具有交互性。它将以与处理脚本相同的方式处理输入,或者就像您通过运行cat | bash
.您仍然可以输入命令并查看其输出。
从历史上看,rsh
(替换的)在没有给出任何运行命令时ssh
实际上正在运行,并且从该服务调用不同的服务(在不同的 TCP 端口上)。rlogin
rlogin
rsh