如何从只能通过SSH通过另一台主机进行连接的主机上下载文件?


30

我想将文件从办公室计算机下载到笔记本电脑。

我可以通过SSH将办公室计算机连接到组织服务器,然后通过SSH从服务器连接到办公室计算机。

组织服务器接受的唯一命令是ssh,ssh1和ssh2。

如何通过服务器从办公室(远程)计算机下载文件到笔记本计算机(本地)?


2
使用反向SSH隧道?看到这里我的答案和适应它作为必要的:superuser.com/questions/1186905/...
达伦

1
多跳SSH?
mckenzm

Answers:


37

前面的答案提到了如何使用ProxyJump指令(在OpenSSH 7.3中添加)通过中间服务器(通常称为堡垒主机)进行连接,但只是将其作为命令行参数来提及。

除非它是一台您将来不会连接的机器,否则最好将它配置为~/.ssh/config

我会放一个像这样的文件:

Host office-machine
Hostname yochay-machine.internal.company.local
ProxyJump bastion-machine

Host bastion-machine
Hostname organization-server.company.com
...

如果您使用的是不支持ProxyJump的早期版本的OpenSSH,则可以将其替换为等效的版本:

ProxyCommand ssh -W %h:%p bastion-machine

如果您本地的ssh版本是一个不支持的非常古老的版本-W

ssh bastion-machine nc %h %p

尽管这最后一个要求nc安装了堡垒机器。

ssh的优点是您可以在文件上配置每个目标,并且它们可以很好地堆叠。因此,您最终将office-machine所有工具(ssh,scp,sftp ...)用作主机名,因为它们是直接连接,它们将根据ssh_config找出如何进行连接。您也可以使用通配符Host *.internal.company.local,使所有主机的结局都经过一个特定的堡垒,它将应用于所有主机。一旦正确配置,进行一跳连接或进行二十跳连接之间的唯一区别就是连接速度较慢。


36

如果您有最新的OpenSSH(8.0),则可以使用-J(jump)开关

scp -J user@intermediate user@target:/path

对于较旧的版本(但至少为7.3),可以在命令行上使用ProxyJump伪指令

scp -o ProxyJump=user@intermediate user@target:/path

ssh_config存档中,如@Ángel的答案所示。


还有其他选项,例如ProxyCommand或端口转发,您甚至可以在旧版本的OpenSSH上使用它们。这些在覆盖不OpenSSH的支持多跳登录?


2
@yochaymaganssh -J userA@orgserv userB@officecomp cat remote/path > local/path
mosvy

4
对于SCP,它在7.10加
安赫尔

4
即使scp不支持-J,它可能仍然足够支持该ProxyJump选项。请尝试使用该选项的其他答案之一。
戈登·戴维森

2
这应该是公认的答案。我鄙视所有ssh问题的答案,这些问题建议config在简单的命令行选项足以完成任务的情况下针对特定主机修改您的主机。
clemisch

2
“鄙视”似乎是一种极端的反应。当然,在某些情况下,快速修改命令行比必须先修改配置文件容易。但是,如果您打算多次连接到同一主机,那么我肯定会更新一次配置文件,而不是-J user@intermediate每次需要连接时都使用它。
chepner

10

有时我们可以只使用管道。那个时间是今天。

ssh -A user@host1 ssh user@host2 cat filename > filename

您也可以上传

ssh -A user@host1 ssh user@host2 cat \\\> filename < filename

是的,还有其他涉及代理的解决方案等,但是了解如何做到这一点很有用。


有用的cat
皮斯克沃

请注意,这使中间主机的任何具有足够特权的用户都可以访问您的ssh代理和密钥。在主机和host2之间流动的数据也将以未加密的形式存在于host1上。使用代理的方法可以避免上述两个问题。
詹姆斯

@james:我不是不知道。这样的堡垒主机通常非常值得信赖。
约书亚

7

使用ProxyJump配置:

ProxyJump将
一个或多个跳转代理指定为[user @] host [:port]或ssh URI。多个代理服务器可以用逗号分隔,并将按顺序访问。设置此选项将导致ssh(1)连接到目标主机,方法是先与指定的ProxyJump主机建立ssh(1)连接,然后从那里建立到最终目标的TCP转发。

scp -o ProxyJump=user@intermediate user@target:/path

2

有一个古老的协议叫做ZMODEM:很少有程序支持它,但是当它起作用时,它会非常方便。

首先检查笔记本电脑的终端程序是否支持ZMODEM。(例如,您可以将iTerm2(在Mac上)配置为支持ZMODEM。此处提供示例脚本。)

在办公室的机器上,运行: sudo apt install lrzsz

现在,您只需要在办公计算机上使用ssh并运行即可sz (filename)。该文件将通过您的终端下载。


1

用户ssh下的配置: ~/.ssh/config

Host *
    UserKnownHostsFile=/dev/null
    StrictHostKeyChecking=no
    ServerAliveInterval 300
    ServerAliveCountMax 2
    ForwardAgent yes


Host jump server
    HostName server.company.org
    User root

Host jump1 server1
    HostName server1.dmz.company.org
    User root
    ProxyJump jump

Host jump2 server2
    HostName server.dmz2.company.org
    User root
    ProxyJump jump1

Host *.intranet.company.org
    User user
    ProxyJump jump2

您现在可以直接通过3个跳转服务器从Intranet服务器进行复制。

scp user@server.intranet.company:/home/user/ ./*

我之所以这样,是因为不再需要使用scp指定跳转服务器


0

通过SCP -3:

scp -3 user1@remote1:/root/file1.txt user2@remote2:/root/file1.txt

2
-3选项被描述为“通过本地主机传输两个远程主机之间的副本”。虽然我相信这个问题规定本地主机无法访问“ remote2”。
杰夫·谢勒

2
@JeffSchaller:您在中间连接到计算机,然后使用-3。但这假设您可以从中间计算机重新连接到第一台计算机。

-J/ 相比,我看不出有任何优势JumpHost。相反,它具有@Joe提到的限制。
Martin Prikryl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.