通过中间主机的 scp 文件

ast*_*rog 111 scp

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

A -> B
B <-> C
Run Code Online (Sandbox Code Playgroud)

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

use*_*686 137

代理跳转

OpenSSH 7.3 中的新功能:

A$ scp -oProxyJump=B thefile C:destination
Run Code Online (Sandbox Code Playgroud)

(在幕后,这只是使用 ProxyCommand 和ssh -W。)

代理命令

更新以包含来自其他答案的 -W:

A$ scp -oProxyCommand="ssh -W %h:%p B" thefile C:destination
Run Code Online (Sandbox Code Playgroud)

如果 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
Run Code Online (Sandbox Code Playgroud)

管道

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\""
Run Code Online (Sandbox Code Playgroud)

仅一个文件:

A$ ssh B "ssh C \"cd destination && cat > thefile\"" < thefile
Run Code Online (Sandbox Code Playgroud)

通过 B 的“隧道”

A$ ssh -f -N -L 4567:C:22 B
(continues running in background)

A$ scp -P 4567 thefile localhost:destinationPath
Run Code Online (Sandbox Code Playgroud)

完成后,不要忘记终止之前启动的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
Run Code Online (Sandbox Code Playgroud)
  • -R 指定到远程(服务器)主机上给定 TCP 端口或 Unix 套接字的连接将转发到本地端的给定主机和端口或 Unix 套接字。


Dan*_*och 34

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.
Run Code Online (Sandbox Code Playgroud)

如果你有这个,你可以运行:

B$ scp -3 A:file C:file
Run Code Online (Sandbox Code Playgroud)


Bri*_*erg 9

ssh -L 4321:hostC:22 youruser@hostB
Run Code Online (Sandbox Code Playgroud)

在另一个外壳中:

scp -P 4321 localfile youruser@127.0.0.1
Run Code Online (Sandbox Code Playgroud)

这是使用端口转发。这里唯一的限制是主机 B 需要配置为允许端口转发。否则这应该可以正常工作。

以解释的方式,-L-R允许您转发端口。在 中-L,给出的第一个端口是端口 ssh 将开始侦听始发机器(主机 A),并且它将通过您的 SSH 连接将在该端口上接收到的任何内容转发到主机 B,然后通过端口 22 路由到主机 C。

编辑

我稍微弄乱了语法。它在您的 LOCAL 机器上设置了一个转发。


SQ9*_*MCP 9

几乎所有内容都已经说过了,但这是我的最后一分钱:我使用 ProxyCommand 变体,而没有ncnor soc。基于OpenSSH 代理和 Jumphost Cookbook,我制作了以下配置:

  1. 所以我们有以下球员:

    • HOME_HOST:我们将文件复制到目标主机的位置
    • HOP_HOST:我们通过此主机进行复制(记录为 HOP_USER)
    • TARGET_HOST:它是我们的目的地(认证为 TARGET_USER)
  2. 首先,我将我的本地公钥从我的家庭主机添加.ssh/id_dsa.pub.ssh/authorized_keys跃点和目标主机。是的,从家庭主机到他们两个的相同公钥。通常您会期望它是您必须添加到 TARGET 的 HOP 公钥。

  3. 然后我.ssh/config通过添加以下条目进行了一些调整:

    Host TARGET_HOST
       User TARGET_USER
       ProxyCommand ssh -W %h:%p HOP_USER@HOP_HOST
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在此之后,复制操作很简单,只要: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 也可以),这并不总是我们所拥有的。值得一试。


小智 5

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

机器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
Run Code Online (Sandbox Code Playgroud)

具体例子

举一个具体的例子,假设您可以0.0.1.2使用名为(服务器 C)的用户帐户访问具有 IP 的服务器bar。但要访问它,您必须首先0.0.1.1使用名为(服务器 B)的用户帐户登录具有 IP 的服务器foo。现在您想要将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/
Run Code Online (Sandbox Code Playgroud)

您还可以通过切换文件和目标的顺序轻松地从服务器 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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助那些比其他人更需要为他们详细说明事情的人。