Answers:
OpenSSH 7.3的新功能:
A$ scp -oProxyJump=B thefile C:destination
(在幕后,这只是使用ProxyCommand和ssh -W
。)
更新为包含其他答案的-W:
A$ scp -oProxyCommand="ssh -W %h:%p B" thefile C:destination
如果A安装了非常旧的SSH客户端(不-W
支持),或者如果B配置为禁止TCP转发(但仍允许shell命令),请使用替代方法:
A$ scp -oProxyCommand="ssh B socat stdio tcp:%h:%p" thefile C:destination
A$ scp -oProxyCommand="ssh B nc %h %p" thefile C:destination
A$ tar cf - thefile anotherfile | ssh B "ssh C \"cd destination && tar xvf -\""
A$ (echo thefile; echo anotherfile) | cpio -o | ssh B "ssh C \"cd destination && cpio -i\""
仅适用于一个文件:
A$ ssh B "ssh C \"cd destination && cat > thefile\"" < thefile
A$ ssh -f -N -L 4567:C:22 B
(continues running in background)
A$ scp -P 4567 thefile localhost:destinationPath
当你完成后,不要忘记杀死之前启动的ssh
进程(由于这已经落到了后台-f -N
)。
-f
请求ssh在命令执行之前转到后台。如果ssh要求密码或密码短语,但用户希望在后台使用密码或密码短语,这很有用。这意味着-n。-N
不要执行远程命令。这对于转发端口很有用。虽然不总是有效:
A$ ssh -f -N -R 4567:localhost:22 B
(now you can reach A from B, by using localhost:4567)
B$ scp -P 4567 localhost:thefile C:destination
-R
指定将远程(服务器)主机上给定TCP端口或Unix套接字的连接转发到本地端的给定主机和端口或Unix套接字。scp
从 C,虽然 B,到 A,你可以做到A$ scp -oProxyJump=B C:destination thefile
。
2011年初及之后的scp版本可能有“-3”选项:
-3 Copies between two remote hosts are transferred through the local
host. Without this option the data is copied directly between
the two remote hosts. Note that this option disables the
progress meter.
如果你有这个,你可以运行:
B$ scp -3 A:file C:file
几乎所有人都已经说过了,但这是我的最后一分钱:我使用ProxyCommand变种而nc
没有soc
。基于OpenSSH Proxies和Jumphost Cookbook,我精心设计了以下配置:
所以我们有以下球员:
首先,我将本地公钥从我的主机添加.ssh/id_dsa.pub
到.ssh/authorized_keys
了主机和目标主机。是的,从家庭主机到他们两个的相同公钥。通常你会期望它是你必须添加到TARGET的HOP公钥。
然后我.ssh/config
通过添加以下条目稍微调整一下:
Host TARGET_HOST
User TARGET_USER
ProxyCommand ssh -W %h:%p HOP_USER@HOP_HOST
之后,复制操作就像:scp FILE TARGET_HOST:
。它显示来自跃点和目标节点的双横幅,但它可以工作。
当然你可以使用上面的方法直接ssh到目标:ssh TARGET_HOST
。它适用于scp和ssh。
另一个更通用的选项可能是sshuttle实用程序,它似乎是一种透明代理(vpn over ssh)。因此,在A-> B < - > C的情况下,它允许连接到C网络中的每个节点:A-> B- [CDEFG]。它不需要管理员,但它需要Python 2.7(3.5也可以),这并不总是我们拥有的。值得尝试一下。
ssh -L 4321:hostC:22 youruser@hostB
在另一个shell中:
scp -P 4321 localfile youruser@127.0.0.1
这是使用端口转发。这里唯一的限制是主机B需要配置为允许端口转发。否则这应该工作正常。
在解释的方式,-L
并-R
允许您转发端口。在-L
,给出的第一个端口是端口ssh将开始侦听始发机器(主机A),它将通过SSH连接将它在该端口上接收的任何内容转发给主机B,然后在端口22上路由到主机C.
编辑
我略微搞砸了语法。它在您的LOCAL机器上设置了一个前进。
Grawity的ProxyCommand答案对我有用,但由于我不太熟悉SSH,所以需要进行一些实验。我想我会更详细地说明Grawity的答案,以帮助像我这样的任何其他新手。以下是更明确的表示法的定义:
机器A:您所在的机器
服务器B: userB@ip.address.for.B(跳转主机或中间服务器)
服务器C: userC@ip.address.for.C(要复制到的远程服务器)
A$ scp -oProxyCommand="ssh -W %h:%p userB@ip.address.for.B" thefile userC@ip.address.for.C:destination
因此,对于一个具体示例,假设您可以访问0.0.1.2
具有名为bar
(服务器C)的用户帐户的IP 服务器。但要实现它,您必须首先0.0.1.1
使用名为foo
(服务器B)的用户帐户登录到具有IP的服务器。现在,您要将baz.txt
位于当前计算机(计算机A)上的文件复制到服务器0.0.1.2
的/home/bar/
目录中。要在此示例中使用上述ProxyCommand,您将执行以下操作:
A$ scp -oProxyCommand="ssh -W %h:%p foo@0.0.1.1" baz.txt bar@0.0.1.2:/home/bar/
您也可以通过切换文件和目标的顺序轻松地从服务器C复制文件。因此,例如,如果baz.txt
已经位于服务器上0.0.1.2
,/home/bar/
那么您可以使用以下方法将其复制到您的计算机:
A$ scp -oProxyCommand="ssh -W %h:%p foo@0.0.1.1" bar@0.0.1.2:/home/bar/baz.txt /destination/path/on/A
希望这能帮助那些需要为他们拼出的东西的人比其他人更多。
A$ rsync <options> -e 'ssh B ssh' source C:destination