AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 37629
In Process
sverrejoh
sverrejoh
Asked: 2009-07-09 04:09:26 +0800 CST2009-07-09 04:09:26 +0800 CST 2009-07-09 04:09:26 +0800 CST

如何在机器之间进行多跳 SCP 传输?

  • 772

我想将文件从我的机器 A 复制到服务器 C,但只能通过服务器 B 访问服务器 C。

不是先传输到服务器B,而是登录然后传输到服务器C,是否可以直接使用SCP或类似程序传输文件?

(Emacs tramp-mode 具有远程编辑文件的功能)。

files ssh scp copying
  • 10 10 个回答
  • 83778 Views

10 个回答

  • Voted
  1. John Tantalo
    2011-01-12T09:30:14+08:002011-01-12T09:30:14+08:00

    您可以将-o选项添加到scp而不是.ssh/config.

    scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path
    

    $jump_host在这种情况下是您的“服务器 B”。

    • 55
  2. tialaramex
    2009-07-09T04:25:59+08:002009-07-09T04:25:59+08:00

    假设 OpenSSH,添加到 .ssh/config 中的 SSH 配置

    Host distant
    ProxyCommand ssh near nc distant 22
    

    这将导致SSH 能够通过代理通过名为near 的机器“直接”连接到名为distant 的机器。然后它可以使用 scp 和 sftp 等应用程序连接到远程机器。

    为此,您需要在名为 near 的机器上安装 'nc' aka netcat。但是许多现代系统已经拥有它。

    假设您已经记住了 tar 的语法和操作规则,towo 的 tar 解决方案对于一次性问题更有效。

    • 46
  3. danblack
    2013-03-20T17:04:46+08:002013-03-20T17:04:46+08:00

    在 (B) 机器附近的服务器上使用更新版本的 ssh,以下将在没有 netcat 的情况下工作:

    Host distant
        ProxyCommand ssh near -W distant:22
    

    但是,它需要 AllowTcpForwarding 在近 (B) 机器上为 yes(默认值)

    编辑:需要 B 上的 OpenSSH 5.4+

    • 23
  4. Saurabh Barjatiya
    2009-07-09T05:02:07+08:002009-07-09T05:02:07+08:00

    您可以使用类似 ssh 的方式连接到服务器 B

    ssh -L 5022:<server C IP>:22 <user_serverB>@<server B IP>
    

    然后你可以使用 ssh 到服务器 C

    ssh -p 5022 <user_serverC>@localhost 
    

    同样 scp 可以使用

    scp -P 5022 foo.txt <user_serverc>@localhost:
    

    请记住在 scp 和 ssh 中使用正确的 p 大小写

    • 19
  5. donhector
    2016-10-08T17:24:21+08:002016-10-08T17:24:21+08:00

    即使您需要使用证书进行身份验证(通常在 AWS 环境中),它也是可能的并且相对容易。

    下面的命令会将文件从 a 直接复制remotePath到server2您的计算机中localPath。在内部,scp 请求通过server1.

    scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>
    

    另一种方法也可以(上传文件):

    scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>
    

    如果您改用密码身份验证,请尝试使用

    scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>
    

    如果您在两台服务器中使用相同的用户凭据:

    scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>
    

    该-W选项内置于 OpenSSH 的新(较早)版本中,因此仅适用于具有最低版本(5.4,除非您的发行版向后移植任何功能;例如,RHEL6 OpenSSH 5.3p1 包含此功能)的机器。根据发行说明:http ://www.openssh.com/txt/release-5.4

    在 ssh(1) 中添加了“netcat 模式”:“ssh -W host:port ...”这会将客户端上的 stdio 连接到服务器上的单个端口转发。例如,这允许使用 ssh 作为 ProxyCommand 通过中间服务器路由连接。

    %h并且%p是主机和端口的占位符。

    • 7
  6. texas-bronius
    2017-12-22T09:07:48+08:002017-12-22T09:07:48+08:00

    这不是 scp (这是 OP 要求的),但我发现rsync通过单跳从本地复制到远程非常简单:

    rsync -v -e 'ssh -A -t user@jumpserver ssh -A -t user@destinationserver' /path/to/sourcefile :/path/to/destination
    

    来源: http: //mjbright.blogspot.com/2012/09/using-rsync-over-multi-hop-ssh.html

    我已经尝试了上面的 -o ProxyPass 建议并且不想更改配置以满足我不断变化的需求。正如上述链接中的作者所述,冒号 (:) 前面的目标文件对于指示指定路径在目标服务器上很重要。此外,使用 rsync,您可以选择日期比较、文件夹同步等。我希望这对某人有所帮助!

    • 6
  7. towo
    2009-07-09T04:16:52+08:002009-07-09T04:16:52+08:00

    如果你想变得非常邪恶,你可以链接 ssh 和 tar,比如tar c mydir | ssh server "ssh otherserver | tar x",但这可能会遇到各种问题。

    更简单的方法是使用 SSH 的内置方法建立一个 SSH 隧道;查看-D手册页中的交换机,然后将某个端口转发到另一台服务器的 ssh 端口。

    • 3
  8. SYANiDE
    2016-11-19T12:22:41+08:002016-11-19T12:22:41+08:00

    您也可以反向执行此操作,并且可能更容易。

    假设您在要将文件发送到的机器上打开了一个 ssh 会话。这个跳得最远的 PC,我们称之为 hop2。您的“代理”主机将是 hop1。PC 是文件源,我们称之为源。

    origin:~/asdf.txt  --> hop1 --> hop2:~/asdf.txt
    

    您可以构建隧道,使本地端口在远程 PC 上可用。因此,我们定义了一个要在远程 PC 上打开的端口,该端口将重定向到您在构建隧道时拉过来的端口。

    在 hop2 上:

    ssh -R 5555:127.0.0.1:22 <hop1_user>@<hop1_IP>
    #this has the effect of building a tunnel from hop2 to hop1, making hop2's port 22 available on hop1 as port 5555
    

    现在在打开的隧道会话中,您可以从 hop1 到 file_origin 执行相同的操作。

    在 hop1 上:

    ssh -R 6666:127.0.0.1:5555 <origin_user>@<origin_IP>
    #this has the effect of building a tunnel from hop1 to origin while also pulling the active tunnel with it, making hop1's port 5555 (hop2's port 22) available on origin as port 6666.
    

    您现在从 hop2 到 hop1 到 origin 的隧道。巧合的是,现在 5555 和 6666 端口都在源上打开,它们重定向到 hop2 的端口 22。在此会话中,以下两个都是到 hop2 的有效 scp 路由:

    原产地:

    scp -P 6666 ~/asdf.txt <hop2_user>@<127.0.0.1>:~/asdf.txt
    

    通过这种方式,您可以在其间有任意数量的跃点,并且将两个以上的跃点链接在一起更容易使用。

    • 2
  9. Benjamin Goodacre
    2014-06-26T02:33:06+08:002014-06-26T02:33:06+08:00

    尝试调整以下示例 openssh 配置以进行可用于多个主机的设置:

    Host uat-*
         ProxyCommand ssh bastion-uat nc %h %p
    

    这假定一组服务器以“uat-”开头,只能通过 jumpbox/网关服务器“bastion-uat”访问。ForwardAgent yes如果您使用密钥登录,您可能还想添加。

    • 1
  10. IanD
    2018-11-15T05:39:00+08:002018-11-15T05:39:00+08:00

    scp -o 'ProxyJump jumpboxname' somefilename.txt finaldestinationhost:/tmp/.

    • -1

相关问题

  • 在 Windows Server 2003 上通过 SSH 启动和停止 Mongrel 服务

  • 隧道 Xbox 网络流量 [关闭]

  • 在两个位置之间保持数据同步的最有效方法是什么?

  • 为什么使用authorized_keys通过ssh自动登录不起作用?

  • 在 SQL Server 中,何时应将 PRIMARY Data FileGroup 拆分为辅助数据文件?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve