我面临的设置是这样的:
在服务器 A 上我想从服务器 B 挂载一个目录(我们称之为SHARED
)。没有路由,也没有办法从 A 到 B 或从 B 到 A 添加任何路由。相反,在 B 中挂载来自 A 的目录也是必要的。
有第三台服务器 C。C 可以 ping 通 A 和 B,但无法 pingssh
通其中任何一个。但 A 和 B 可以ssh
ping 通 C。C 无法 NFS(或 Samba)导出目录。
这回答接近它,但它缺少目录的公共共享的第二个分支。
如果无法在 B 中挂载 A 的目录(反之亦然),那么有没有办法在 C 中挂载一个由 A 和 B 共享的目录,就像将 C 导出为 NFS 共享一样,但使用sshfs
反向模式?
答案1
sshfs
A 和 B 可以
ssh
到 C。
有没有办法在 C 中挂载一个由 A 和 B 共享的目录,就像将 C 导出为 NFS 共享一样,但使用
sshfs
反向模式?
我不知道你说的“反向模式”是什么意思,但是既然你可以ssh
从 A 到 C,那么你应该能够sshfs
在 A 上运行以挂载 C 上存在的目录(除非 C 上的 SSH 服务器不支持 SFTP)。这很简单:
# on A
sshfs user@C:/specific/dir/of/C /some/mountpoint
B 也是一样。这样 A 看到的/specific/dir/of/C
将是/some/mountpoint
A 上的;而 B 看到的将/specific/dir/of/C
是/some/mountpoint
B 上的。
缺点:
无论 A (或 B) 对其做什么
/some/mountpoint
,在 C 上它都会通过 来完成user
。sshfs
在 A (或 B) 上使用 FUSE 和有一种方法可以允许调用者以外的用户在 A(或 B)上使用它,仍然在 C 上它们都将充当user
。user
如果A 指定的目录与 B 指定的目录不同user
,并且两个用户无法在 C 上找到在所有权和权限方面适合他们的“公共”目录,则可能出现其他问题。将文件从 A 复制到 B(或从 B 复制到 A)需要将其从 A(B)上传到 C,然后从 C 下载到 B(A)。您无法仅通过执行 A xor B 来实现此目的。
此外,这种复制要求您下载速度不要太快(或不要太早),因此当您到达文件末尾时,这才是真正的结束,而不是因为您赶上了同时运行并将继续追加到 C 上现有文件的上传过程。实际上,您很可能希望一端在另一端下载(或使用)文件之前完全上传。在复制目录时,下载程序很可能希望等待上传程序上传整个目录,否则可能会错过一些文件。
隧道链接
从 A 可以通过连接两个 SSH 隧道到达 B 的 TCP 端口。在这是另一个答案我通过从“中间节点”进行操作来执行此操作,因为在这种情况下,从中间到两端都有 SSH 访问权限。您需要通过从两端向“中间节点”(即您的 C)进行操作来执行此操作,因为这些是您可以ssh
进入的方向。请按如下方式继续:
# on A
ssh -N -L 3333:localhost:4444 user@C
# on B
ssh -N -R 4444:localhost:5555 user@C
当这些工作时,任何连接到 A 的进程localhost:3333
都将通过隧道传输到localhost:4444
C,最终传输到localhost:5555
B。
3333
和4444
是任意端口,请根据需要调整数字(注意特权端口)。5555
是您要访问的服务在 B 上使用的端口。
笔记:
- 这种情况是对称的,因此要从 B 到达 A 的服务,只需在上面的例子中交换 A 和 B。
- 某些服务需要多个端口。
- 您可以在一次调用中使用多个
-L
and/or选项。这意味着您只需在 A 上使用一个隧道,在 B 上使用一个隧道,即可建立多个链式隧道(一些朝一个方向,一些朝相反方向)。-R
ssh
ssh
ssh
~/.ssh/config
是你的朋友。在 A 和 B 上,在配置文件中定义隧道的相应部分,然后ssh -N user@C
在每一端都定义隧道就足够了。请参阅man 5 ssh_config
。autossh
也是你的朋友。- SSH 无法通过 UDP 隧道传输数据。不要相信另一个答案, 他们是有缺陷的。 一般来说
ssh -w
可以使用但这个很难(硬即使您不需要链接连接。