允许使用同一通道执行多个命令ControlMaster
的功能,例如ssh
ssh
我如何维持开放的 ssh 连接并从 shell 脚本中使用它?
为了使用ControlMaster
,我添加了以下几行~/.ssh/config
:
Host example.com
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 5m
当我运行时ssh example.com
,出现以下错误:
$ ssh example.com
bind: No such file or directory
unix_listener: cannot bind to path: /home/peter/.ssh/sockets/[email protected]
为了解决这个问题,我可以运行mkdir ~/.ssh/sockets
:
$ mkdir ~/.ssh/sockets
$ ll ~/.ssh/sockets
total 8
drwxrwxr-x 2 peter peter 4096 Dec 28 17:51 ./
drwx------ 3 peter peter 4096 Dec 28 17:51 ../
可以看到,该目录~/.ssh/sockets
是有权限的rwxrwxr-w
。的权限应该是什么~/.ssh/sockets
?sockets
甚至应该在~/.ssh
?
答案1
您可以将sockets
目录放在任何您喜欢的地方(只要您有在那里写入的适当权限),但将其放在里面在我.ssh
看来是更明智的想法(除了一些非常罕见的特殊情况,比如我曾经遇到过:路径名太长)
因为.ssh
应该已经是 之类的了drwx------
, 的权利.ssh/sockets
可能相同甚至更加自由,这不会产生任何影响。
但我不认为这是你的问题。你的错误消息与你的配置文件不一致。配置文件@
中有ControlPath
(并且没问题)但在错误消息中没有。
测试时,请确保首先终止ssh
给定主机上所有正在运行的实例,因为某些实例可能会根据您的配置持续存在,然后如果您更改它,您可能无法获得预期的行为。
example.com
PS:当你需要虚拟主机名用于文档目的时请使用
答案2
创建您将要创建 unix 套接字的目录,如在 OP 中一样,如果您使用ControlPath ~/.ssh/sockets/%r@%h-%p
,则使用以下命令:
mkdir -p ~/.ssh/sockets
编辑:该目录可能不存在。