我在工作中有一个 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 函数中的东西。
使用 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:本地文件
您可以设置端口转发。将您的初始命令更改为:
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 开关指定的。