为什么不在 OpenSSH ssh 的 ControlPath 选项中简单地使用 %h?

Tim*_*ske 13 ssh openssh connection-sharing

为什么“ssh_config(5)”联机帮助页建议该ControlPath选项至少应包含%h,%p%r占位符,以便唯一标识每个共享连接?

我认为多个会话应该共享同一个套接字并连接到同一个主机。那么有一个简单的定义是否有意义,例如:

ControlPath ~/.cache/ssh/mux/%h
Run Code Online (Sandbox Code Playgroud)

而不是像:

ControlPath ~/.cache/ssh/mux/%r@%h:%p
Run Code Online (Sandbox Code Playgroud)

根据我对第一个定义的理解,一个连接在不同远程用户的多个会话之间共享,连接到同一个远程主机,在不同的远程端口上。

我想在主机默认部分中有第一个定义,这样就足够了ssh -o ControlMaster=no

我想在由同一本地用户发起的所有会话之间共享到同一远程主机的连接,而不管远程用户和远程端口如何。主客户端的套接字应该位于本地用户的主目录下。

gol*_*cks 13

“我认为多个会话应该共享同一个套接字并连接到同一个主机。”

他们能。但是,请注意,如果您通过 使用现有连接连接到主机ControlPath,无论您打算以哪个用户身份登录,您都将以连接的原始用户身份登录。例如,没有与“某处”建立连接:

ssh -o ControlPath=~/.ssh/%h -o ControlMaster=yes bob@somewhere
Run Code Online (Sandbox Code Playgroud)

本次会议是 bob@somewhere。

ssh -o ControlPath=~/.ssh/%h -o ControlMaster=no sue@somewhere
Run Code Online (Sandbox Code Playgroud)

此会话将是 bob@somewhere,因为您使用了相同的 ControlPath 和 set ControlMaster=no;if ControlMaster=yes,您将以 sue 身份登录,但 ssh 将忽略您的 ControlPath 参数,如以下所示man ssh_config

其他会话可以使用相同的 ControlPath连接到此套接字并将 ControlMaster 设置为 'no'

作为证据,如果ControlMaster=yes在这两种情况下,当 bob 退出时 ControlPath 套接字~/.ssh/somewhere将消失,即使“sue”会话仍在运行,这意味着sue 会话从未使用过该套接字

因此,如果您想使用相同的连接,那%h很好,但请注意,您不能作为多个不同的远程用户共享连接——ssh 不会让您这样做。


Arc*_*ege 6

即使是同一台服务器,您也可以使用多个用户和多个端口。我自己连接到公司内部网上的数百个系统,大多数都有多个用户,具有不同的功能或应用程序服务器。对用户 A 的访问与对用户 B 的访问非常不同,并且主连接需要不同。更简洁地说,如果你要运行:

$ ssh -n -o ControlMaster=auto -o ControlPath=~/.cache/ssh/mux/%h -l userA localhost sleep 10 & # create the master connection and background it
$ ssh -o ControlMaster=auto -o ControlPath=~/.cache/ssh/mux/%h -l userB localhost whoami
userA
Run Code Online (Sandbox Code Playgroud)

如您所见,我们没有获得与 userB 的 OpenSSH 会话,而是与 userA 的原始会话。这意味着主目录、权限甚至身份验证本身都不是预期的。使用它,如果您要尝试删除 userB 目录中的文件,则 a) 它可能是错误的文件,b) 它可能是错误的权限。

如果您永远不会使用单个端口连接到任何一台服务器上的多个用户,那么是的,使用%h就足够了。在您的~/.ssh/config文件中,您可能希望使用:

ControlMaster=auto  # use existing or create a master connection
ControlPath=~/.cache/ssh/mux/%h
ControlPersist=yes
Run Code Online (Sandbox Code Playgroud)

使用该ControlPersist选项,主连接在后台保持打开状态,直到被终止或终止ssh -O exit。这是一个很好的设置并忘记它的功能。

但是,如果有任何连接到多个用户的任何一台主机上的可能性,那么你会想要的东西更安全:

ControlMaster=auto
ControlPath=~/.cache/ssh/mux/%r@%h:%p
ControlPersist=yes
Run Code Online (Sandbox Code Playgroud)