将本地目录挂载到远程 ssh 服务器

rob*_*ing 7 ssh mount sshfs

我想将本地目录挂载到远程 ssh 服务器。特别是我的 ~/.gnupg 目录,所以我可以在任何地方使用我的本地密钥环,而无需远程存储它。

所以我认为这个解决方案:

  • 保持本地 ssh 服务器打开(根据需要设置防火墙)
  • ssh 到远程转发本地:22 到远程:10000
  • 启动 sshfs 将 localhost:10000:.gnupg 挂载到 ~/.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 之前执行的。
如何解决这个问题?

cri*_*ret 5

问题: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,除非您的本地主机脱机或连接中断。

当您注销远程主机时,您可以查看umountsshfs挂载的其他一些选项,也许使用诸如 this 之类的想法。或者你可以玩游戏LocalCommand来执行一些在看到一些触发事件发生后观察和自我卸载的东西,但充其量看起来很脆弱。

另一种选择是将ssh命令包装在某个 shell 中,或者ProxyCommand用来做一些棘手的事情,但我将把它留给读者作为练习。