从服务器获取文件两步之遥

Che*_*ron 14 ssh network-share tar

我们有以下情况:

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

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

通常我使用 SSH 和 tar 的组合来完成这项工作:

ssh name@host "tar cf - folder" > folder.tar
Run Code Online (Sandbox Code Playgroud)

但是在这种情况下,这将需要某种嵌套,而我似乎无法完成此操作。

那么,将数据从#3 获取到#1 的好方法是什么?

Gen*_*ene 27

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

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

MACHINE1$ ssh -L 2022:MACHINE3:22 <user>@MACHINE2
Run Code Online (Sandbox Code Playgroud)

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

MACHINE1 $ ssh -p 2022 <user>@localhost
Run Code Online (Sandbox Code Playgroud)

第一个命令发生的事情是本地端口(machine1 上的 2022)正在使用与 machine2 的 SSH 连接隧道连接到 machine3 上的端口 22。

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

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

ssh -p 2022 <user>@localhost "tar cf - /path/to/remote/directory/" > filename.tar
Run Code Online (Sandbox Code Playgroud)

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

rsync -aHSv --progress -e 'ssh -p 2022' <user>@localhost:/path/to/remote/directory/ /path/to/local/directory/
Run Code Online (Sandbox Code Playgroud)

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

  • 使用 `ProxyCommand` 和 `ssh -W` 可以将两个 `ssh` 命令组合成一个命令行。如果您有一个最新版本的 OpenSSH 客户端,有一个参数可以让您使用单个 `ssh` 命令完成所有操作。 (2认同)

Jar*_*era 5

您还可以使用较新版本的 SSH 的主会话功能。它在这里描述:

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

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

ControlMaster auto
ControlPath ~/.ssh/cm_socket/%r@%h:%p
ControlPersist 4h
ServerAliveInterval 30
Run Code Online (Sandbox Code Playgroud)

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

Host first_hop
Hostname <your first host FQDN or IP>
User <your user>
Run Code Online (Sandbox Code Playgroud)

第二个跃点将使用您的第一个跃点服务器作为代理:

Host second_hop
Hostname <your second host FQDN or IP>
User <your user>
ProxyCommand ssh -W %h:%p first_hop
Run Code Online (Sandbox Code Playgroud)

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

然后您应该能够直接通过 SSH 或 SCP 连接到/从您的第二台服务器。可以有更多的服务器像这样链接。

  • 通过阅读您的链接,我认为不需要多路复用/`ControlMaster` 来进行代理。该维基书中更相关的页面是这个:https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts (3认同)