我想将本地目录挂载到远程 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
做一些棘手的事情,但我将把这留给读者作为练习。