我在公司有一台 Linux 机器,我经常在家里登录。这台 Linux 机器位于内部网络上,但有一个机器跨越两个网络,因此我可以像这样登录:
ssh -tA [email protected] ssh [email protected]
我有几个文件位于 ~/tmp 中,我想将它们复制到我的本地机器上。(为了便于论述,我们将它们称为 ~/tmp/file1、~/tmp/file2 和 ~/tmp/file3)
我曾经见过类似这样的作品:
ssh -tA [email protected] ssh [email protected] 'tar cf - ~/tmp/file*' | tar xf -
这将对远程机器上的文件进行 tar 打包,将结果发送到标准输出,然后将结果通过管道传输到本地 tar,本地 tar 将在本地标准输入上解压数据。
不起作用:
在远程机器上,如果我运行
tar cf - tmp/file* | md5sum
f1b776364c10dfc20500f228399a7c63 -
从本地机器:
ssh -tA [email protected] ssh [email protected] 'tar cf - ~/tmp/file*' | md5sum
bc7436c9771ee2b4978ffd29b8b7ed36 -
我假设这可能是网络上的字节排序混乱...我最终能够通过对文件进行 uuencoding 来解决这个问题,通过网络对其进行 catting,然后在本地对其进行 uudecoding...出于某种原因,我无法获得正确的语法,以便能够在远程端进行 tar | uuencode 并在本地端进行 uudecode | untar。
我正在寻找一个可以一步完成所有操作的好方法;最好是可以包装在 shell 函数中的东西。
答案1
在客户端的配置中使用 SSH ProxyCommand 配置选项。这允许您直接连接到目标。
Host remotebox
ProxyCommand /usr/bin/ssh [email protected] "/bin/netcat -w 1 10.10.10.130 22"
User username
scp 远程框:文件本地
答案2
您可以设置端口转发。将您的初始命令更改为:
ssh -TA [email protected] -L 2222:10.10.10.130:22
然后忽略此命令。打开一个新终端并运行以下之一:
ssh -p 2222 [email protected]
scp -P 2222 [email protected] remote_file local_file
每当您的本地系统在其本地主机 IP 地址端口 2222 上收到连接请求时,您首先运行的 SSH 命令都会将其转发到远程系统,并让其向 10.10.10.130 发出连接请求。这一切都由 -L 开关指定。
答案3
字节顺序只适用于诸如 IP 标头(具有四字节大小的地址作为单个单元)之类的内容,但不影响仅使用 8 位字节的更高层协议 - IP、TCP 和 SSH 均保证您逐字节接收与发送时完全相同的数据。
问题是由-t
第一个 选项引起的ssh
。它强制为第一个连接分配一个伪终端,这只对终端(和终端仿真器)是必要的,并且会在传输过程中破坏某些数据。特别是,回车符(0x0D)将自动插入到每个换行符(0x0A)之前。
只需删除该-t
选项,您将拥有一个用于传输二进制数据的干净通道。