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

我们有以下情况:

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

我在#2和#3上都没有root权限。 在机器#2上我也不能真正存储信息(不超过200MB)(因为它是进入networking其余部分的门户,而不是那么多)。 在机器#3上有一个大小约为3 GiB的文件夹,我想要复制到本地。 我不能从#1到#3的SSH,但我可以SSH到#2,然后到#3。 在#2和#3之间build立一个公共的私人密钥对也是不可能的,但是在#1和#2之间安装了一个密钥对。

通常我使用SSH和tar的组合来完成这个任务:

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

但在这种情况下,将需要某种嵌套,我似乎无法完成这件事。

那么,从#3到#1的数据有什么好的方法呢?

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

例如,在machine1上打开两个CLI会话。 在第一次会议中运行以下内容:

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

在第二次会议中运行以下内容:

 MACHINE1 $ ssh -p 2022 <user>@localhost 

第一个命令发生了什么事是一个本地端口(machine1上的2022)正在通过SSH连接到machine2到达machine3上的端口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。

您也可以使用较新版本的SSH的主会话function。 这里描述:

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

可能所有你需要的是编辑/创build你的.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 

不要忘记创build〜/ .ssh / cm_socket目录,configuration权限应该是644。

那么你应该可以通过SSH或者SCP直接从你的第二台服务器上下载。 可以有更多的链接像这样的服务器。