两步即可从服务器获取文件

两步即可从服务器获取文件

我们有以下情况:

  1. 我的机器
  2. 网关机
  3. 目标机器

我对 #2 和 #3 都没有 root 权限。我也无法在机器 #2 上存储信息(不超过 200 MiB)(因为它是通往网络其余部分的网关,不能超过这个数目)。机器 #3 上有一个文件夹,大约 3 GiB 大小,我想将其复制到本地。我无法通过 SSH 从 #1 连接到 #3,但我可以通过 SSH 连接到 #2,然后连接到 #3。也无法在 #2 和 #3 之间设置公钥私钥对,但在 #1 和 #2 之间安装了一对密钥对。

通常我使用 SSH 和 tar 的组合来完成此操作:

ssh name@host "tar cf - folder" > folder.tar

但在这种情况下,这需要某种嵌套,而我似乎无法做到这一点。

那么,将数据从#3 传输到#1 的一个好方法是什么?

答案1

您可以通过 machine2 创建一个 SSH 隧道,然后在另一个会话中连接到该隧道。

例如,在 machine1 上打开两个 CLI 会话。在第一个会话中运行以下命令:

MACHINE1$ ssh -L 2022:MACHINE3:22 <user>@MACHINE2

在第二个会话中运行以下命令:

MACHINE1 $ ssh -p 2022 <user>@localhost

第一个命令发生的情况是,使用与机器 2 的 SSH 连接,将本地端口(机器 1 上的 2022)隧道传输到机器 3 上的端口 22。

使用第二条命令,您将连接到新打开的本地端口(2022),就像直接连接到 machine3 一样。

现在如果您想使用典型的文件传输过程,您可以执行以下操作:

ssh -p 2022 <user>@localhost "tar cf - /path/to/remote/directory/" > filename.tar

或者,您可以熟悉 rsync 并执行如下操作:

rsync -aHSv --progress -e 'ssh -p 2022' <user>@localhost:/path/to/remote/directory/ /path/to/local/directory/

假设最终目标不是获得 tarball。

答案2

您还可以使用较新版本 SSH 的主会话功能。描述如下:

https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing

可能您需要做的就是编辑/创建 .ssh/config。在其中添加控制主会话的定义:

ControlMaster auto
ControlPath ~/.ssh/cm_socket/%r@%h:%p
ControlPersist 4h
ServerAliveInterval 30

然后您可以指定您的第一个跳转服务器定义,例如:

Host first_hop
Hostname <your first host FQDN or IP>
User <your user>

第二跳将使用第一跳服务器作为代理:

Host second_hop
Hostname <your second host FQDN or IP>
User <your user>
ProxyCommand ssh -W %h:%p first_hop

不要忘记创建~/.ssh/cm_socket 目录并且配置权限应该是 644。

然后,您应该能够通过 SSH 或 SCP 直接与第二台服务器建立连接。可以像这样链接更多服务器。

相关内容