通过中间主机 scp 文件

通过中间主机 scp 文件

我可以访问 3 台机器,A、B 和 C。唯一可能的 (ssh) 连接是:

A -> B
B <-> C

我需要将文件从 A 传输到 C,因此我可以将文件从 A 传输到 B,然后从 B 传输到 C。但是,B 没有太多磁盘空间,因此这不是一个选项。有没有办法通过 B 将文件从 A 传输到 C?请注意,我在任何机器上都没有 root 访问权限,因此不要认为我可以设置任何持久隧道,但如果我错了,请纠正我!

答案1

代理跳转

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

通过 B 的“隧道”

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不执行远程命令。这对于仅转发端口很有用。

通过 B 到 A 的反向“隧道”

但并不总是有效:

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 套接字。

答案2

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

答案3

几乎所有内容都已经说完了,但这里是我最后要说的:我使用不带ncnor 的ProxyCommand 变体soc。基于OpenSSH 代理和 Jumphost 手册我制作了以下配置:

  1. 因此我们有以下球员:

    • HOME_HOST:从这里我们将文件复制到目标主机
    • HOP_HOST:我们复制通过该主机(记录为 HOP_USER)
    • TARGET_HOST:这是我们的目的地(经过身份验证为 TARGET_USER)
  2. 首先,我将本地公钥从主主机添加.ssh/id_dsa.pub.ssh/authorized_keys跳跃主机和目标主机。是的,主主机和目标主机的公钥相同。通常,您会期望将跳跃公钥添加到目标主机。

  3. 然后我做了.ssh/config一些调整,添加了以下条目:

    Host TARGET_HOST
       User TARGET_USER
       ProxyCommand ssh -W %h:%p HOP_USER@HOP_HOST
    
  4. 此后,复制操作非常简单:scp FILE TARGET_HOST:。它会显示来自跳跃节点和目标节点的双重横幅,但它可以正常工作。

当然,你也可以使用上面的方法直接 ssh 到目标:ssh TARGET_HOST。它与 scp 和 ssh 一起工作。

另一个更通用的选择可能是穿梭巴士实用程序似乎是一种透明代理(通过 ssh 的 vpn)。因此,对于 A->B<->C 的情况,它允许连接到 C 网络中的每个节点:A->B-[CDEFG]。它不需要管理员,但需要 Python 2.7(3.5 也可以),而我们并不总是拥有这个版本。值得一试。

答案4

Grawity 的 ProxyCommand 答案对我有用,但由于我对 SSH 不太熟悉,所以需要进行一些实验。我想我会更详细地阐述 Grawity 的答案,以帮助像我一样的其他 SSH 新手。以下是更明确的符号定义:

机器 A:你正在使用的机器

服务器B: [电子邮件保护](跳转主机或中间服务器)

服务器C: [电子邮件保护](您要复制到的远程服务器)

代理命令

    A$ scp -oProxyCommand="ssh -W %h:%p [email protected]" thefile [email protected]:destination

具体例子

举一个具体的例子,假设您有权访问 IP 为(服务器 C)0.0.1.2的用户帐户的服务器bar。但要访问它,您必须首先登录 IP 为(服务器 B)0.0.1.1的用户帐户的服务器foo。现在您要将baz.txt位于当前计算机 (计算机 A) 上的文件复制到服务器0.0.1.2/home/bar/目录中。要使用上述代理命令对于此示例,您需要执行以下操作:

    A$ scp -oProxyCommand="ssh -W %h:%p [email protected]" baz.txt [email protected]:/home/bar/

您还可以通过切换文件和目标的顺序,轻松地从服务器 C 复制文件。例如,如果baz.txt已经在0.0.1.2位于的服务器上,/home/bar/那么您可以使用以下命令将其复制到您的计算机:

    A$ scp -oProxyCommand="ssh -W %h:%p [email protected]" [email protected]:/home/bar/baz.txt /destination/path/on/A

希望这能帮助那些需要更多帮助的人。

相关内容