我们有以下情况:
我在#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直接从你的第二台服务器上下载。 可以有更多的链接像这样的服务器。