为什么“ssh_config(5)”手册页建议该ControlPath
选项至少应包含%h
,%p
和%r
占位符,以便唯一标识每个共享连接?
我认为应该进行多次会议分享连接到同一主机的同一套接字。那么有一个简单的定义是不是有意义,例如:
ControlPath ~/.cache/ssh/mux/%h
而不是类似的东西:
ControlPath ~/.cache/ssh/mux/%r@%h:%p
根据我对第一个定义的理解,一个连接是在不同远程用户的多个会话之间共享到同一远程主机的不同远程端口上的。
我想在主机默认部分中有第一个定义,这样就足够了ssh -o ControlMaster=no
。
我想在同一本地用户启动的所有会话之间共享与同一远程主机的连接,无论远程用户和远程端口如何。主客户端的套接字应位于本地用户的主目录下。
答案1
“我认为多个会话应该共享同一个套接字并连接到同一主机。”
他们能。但请注意,如果您通过 现有连接连接到主机ControlPath
,则无论您打算以哪个用户身份登录,您都将以该连接的原始用户身份登录。例如,没有与“某处”建立连接:
ssh -o ControlPath=~/.ssh/%h -o ControlMaster=yes bob@somewhere
本次会议是 bob@somewhere。
ssh -o ControlPath=~/.ssh/%h -o ControlMaster=no sue@somewhere
本次会议将还是 bob@somewhere,因为您使用了相同的 ControlPath 并设置了ControlMaster=no
;如果ControlMaster=yes
,您将以 sue 身份登录,但 ssh 将忽略您的 ControlPath 参数,如以下所示man ssh_config
:
其他会话可以连接到此套接字使用相同的 ControlPathControlMaster 设置为“否”。
作为证据,如果在这两种情况下,当 bob 退出时,即使“sue”会话仍在运行,ControlMaster=yes
ControlPath 套接字也会消失,这意味着~/.ssh/somewhere
sue 会话从未使用过该套接字。
因此,如果您想使用相同的连接,就%h
可以了,但要注意您不能作为多个不同的远程用户共享连接-- ssh 不会让你这样做。
答案2
即使同一台服务器也可以使用多个用户和多个端口。我自己连接到公司内联网上的数百个系统,大多数系统都有多个具有不同功能或应用程序服务器的用户。对 userA 的访问与对 userB 的访问非常不同,并且主连接也需要不同。更简洁地说,如果您要运行:
$ 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
正如您所看到的,我们没有获得与用户 B 的 OpenSSH 会话,而是与用户 A 的原始会话。这意味着主目录、权限甚至身份验证本身都不是预期的。使用此功能,如果您尝试删除 userB 目录中的文件,则 a) 它可能是错误的文件,b) 它可能是错误的权限。
如果你愿意绝不使用单个端口连接到任何一台服务器上的多个用户,那么是的,使用%h
就足够了。在您的~/.ssh/config
文件中,您需要使用:
ControlMaster=auto # use existing or create a master connection
ControlPath=~/.cache/ssh/mux/%h
ControlPersist=yes
使用该ControlPersist
选项,主连接在后台保持打开状态,直到被杀死或终止ssh -O exit
。这是一个很好的“一劳永逸”功能。
但如果有任何如果有可能连接到任何一台主机上的多个用户,那么您会想要更安全的东西:
ControlMaster=auto
ControlPath=~/.cache/ssh/mux/%r@%h:%p
ControlPersist=yes