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

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

我想将本地目录挂载到远程 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 [email protected]:/Users/remoteuser/.gnupg .gnupg

执行 ssh 时,我得到:

fuse: bad mount point `.gnupg': No such file or directory

如果我在 ssh 登录后手动运行 sshfs,一切都会正常工作。所以我猜测 LocalCommand 指令是在 RemoteForward 之前执行的。
如何解决这个问题?

答案1

问题: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

缺点:两个入口都需要退出每个主机您想要这个挂载点。

选项 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

请注意,这两行之间的细微差别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

我认为这是唯一有效的解决方案,甚至可以在Host *规则中工作,并且没有任何缺点。它甚至解决了同一主机的第二个 ssh 会话不会尝试通过 sshfs 重新挂载同一目录的问题。

警告: 最后一个问题我还没解决:sshfs远程主机注销后,远程仍会保留很长时间。事实上,unmount除非本地主机离线或连接中断,否则远程主机永远不会保留。

您可以在退出远程主机时查看umount该挂载的其他选项,也许使用sshfs诸如此类的想法。或者你可以玩游戏来LocalCommand执行一些在看到某些触发事件发生后进行监视并自行卸载的东西,但看起来很脆弱。

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

相关内容