通过两跳 SSH 会话传输文件

Bar*_*den 6 ssh

我在工作中有一个 Linux 机器,我经常从家里登录。Linux 机器在内部网络上,但有一个跨越两个网络的机器,所以我可以像这样登录:

ssh -tA username@bridge.work.com ssh username@10.10.10.130
Run Code Online (Sandbox Code Playgroud)

我有几个文件位于 ~/tmp 中,我想将它们复制到我的本地机器上。(为了论证,我们称它们为 ~/tmp/file1 ~/tmp/file2 和 ~/tmp/file3)

我见过这样的工作:

ssh -tA username@bridge.work.com ssh username@10.10.10.130 'tar cf - ~/tmp/file*' | tar xf -
Run Code Online (Sandbox Code Playgroud)

这将对远程机器上的文件进行 tar,将结果发送到 stdout,然后将结果通过管道传输到本地 tar,后者在本地 stdin 上解包数据。

不起作用:

在远程机器上,如果我运行

tar cf - tmp/file* | md5sum
f1b776364c10dfc20500f228399a7c63  -
Run Code Online (Sandbox Code Playgroud)

从本地机器:

ssh -tA username@bridge.work.com ssh username@10.10.10.130 'tar cf - ~/tmp/file*' | md5sum
bc7436c9771ee2b4978ffd29b8b7ed36  -
Run Code Online (Sandbox Code Playgroud)

我假设这可能是网络上的字节排序混乱……我最终能够通过对文件进行 uuencoding、通过网络对它进行分类然后在本地对它进行 uudecoding 来解决它……出于某种原因我不能获取正确的语法以便能够 tar | 远程端的 uuencode 和 uudecode | 在本地解压。

我正在寻找一种一次性完成这一切的好方法;最好是我可以包装在 shell 函数中的东西。

Zor*_*che 6

使用 SSH ProxyCommand 配置选项在您的客户端上进行配置。这允许您直接连接到目的地。

Host remotebox
    ProxyCommand /usr/bin/ssh username@bridge.work.com "/bin/netcat -w 1 10.10.10.130 22"
    User username
Run Code Online (Sandbox Code Playgroud)

scp remotebox:本地文件


Kev*_*n M 6

您可以设置端口转发。将您的初始命令更改为:

ssh -TA username@bridge.work.com -L 2222:10.10.10.130:22
Run Code Online (Sandbox Code Playgroud)

然后忽略此命令。打开一个新终端并运行以下命令之一:

ssh -p 2222 username_for_10.10.10.130@127.0.0.1
scp -P 2222 username_for_10.10.10.130@127.0.0.1 remote_file local_file
Run Code Online (Sandbox Code Playgroud)

每当您的本地系统在其 localhost IP 地址端口 2222 上收到连接请求时,您首先运行的 SSH 命令会将其转发到远程系统,并让它向 10.10.10.130 发出连接请求。这都是由 -L 开关指定的。