我想将本地目录挂载到远程 ssh 服务器。特别是我的 ~/.gnupg 目录,所以我可以在任何地方使用我的本地密钥环,而无需远程存储它。
所以我认为这个解决方案:
我把它放在我的 ssh/config 中:
Host remote
HostName remotehost
RemoteForward 10000 localhost:22
User user
PermitLocalCommand yes
LocalCommand sshfs -p 10000 user@127.0.0.1:/Users/remoteuser/.gnupg .gnupg
Run Code Online (Sandbox Code Playgroud)
做 ssh,我得到:
fuse: bad mount point `.gnupg': No such file or directory
Run Code Online (Sandbox Code Playgroud)
如果我在 ssh 登录后手动运行 sshfs,一切正常。所以我猜 LocalCommand 指令是在 RemoteForward 之前执行的。
如何解决这个问题?
问题:ssh
'sLocalCommand
在本地(客户端)端执行,而不是在您希望的远程执行。没有RemoteCommand
选项,但您可以将功能修改到您的配置文件中。请注意,所有这些都假设您的remotehost:.gnupg
目录事先存在。
选项 1:在您的~/.ssh/config
:
Host remote
HostName remotehost
PermitLocalCommand yes
LocalCommand ssh -f %r@%n-mount -p %p sshfs -p 10000 %u@localhost:%d/.gnupg .gnupg
Host remote-mount
HostName remotehost
ForwardAgent yes
RemoteForward 10000 localhost:22
Run Code Online (Sandbox Code Playgroud)
缺点:对于您想要此挂载点的每个主机,这两个条目都需要退出。
选项 2:将ssh 选项和端口转发结合到 LocalCommand 中:
Host remote
HostName remotehost
PermitLocalCommand yes
LocalCommand ssh -f %r@%h -o RemoteForward="10000 localhost:22" -o ForwardAgent=yes -p %p sshfs -p 10000 %u@localhost:%d/.gnupg .gnupg
Run Code Online (Sandbox Code Playgroud)
请注意,这两LocalCommand
行之间的细微差别是第一个示例中使用了 %n,而第二个示例中使用了 %h。这会起作用,但有一个巨大的假设:您永远不会通过主机的真实名称 ssh 连接到主机,并且只能通过.ssh/config
文件中存在的“短名称” ,否则最终会出现无限循环的ssh
连接试图执行您的LocalCommand
.
选项 3:使用 SSH 多路复用仅设置一个到远程的连接:
Host remote
HostName remotehost
PermitLocalCommand yes
LocalCommand ssh -f %r@%h -o RemoteForward="10000 localhost:22" -o ForwardAgent=yes -p %p sshfs -p 10000 %u@localhost:%d/.gnupg .gnupg
ControlMaster auto
ControlPersist 30m
ControlPath ~/.ssh/controlmasters/%r@%h:%p
Run Code Online (Sandbox Code Playgroud)
我认为这是唯一成功的解决方案,甚至可以在Host *
规则中工作,并且没有任何缺点。它甚至解决了同一主机的第二个 ssh 会话不会尝试通过 sshfs 重新挂载同一目录的问题。
警告: 最后一个我没有费心解决的问题:sshfs
在您注销远程主机后,您的遥控器将持续很长时间。事实上,它永远不会unmount
,除非您的本地主机脱机或连接中断。
当您注销远程主机时,您可以查看umount
该sshfs
挂载的其他一些选项,也许使用诸如 this 之类的想法。或者你可以玩游戏LocalCommand
来执行一些在看到一些触发事件发生后观察和自我卸载的东西,但充其量看起来很脆弱。
另一种选择是将ssh
命令包装在某个 shell 中,或者ProxyCommand
用来做一些棘手的事情,但我将把它留给读者作为练习。