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

Yoh*_*gan 31 ssh scp

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

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

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

如何通过服务器将文件从我的办公室(远程)机器下载到我的笔记本电脑(本地)机器中?

Mar*_*ryl 39

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

scp -J user@intermediate user@target:/path
Run Code Online (Sandbox Code Playgroud)

对于旧版本(但至少是 7.3),您可以在命令行上使用ProxyJump指令

scp -o ProxyJump=user@intermediate user@target:/path
Run Code Online (Sandbox Code Playgroud)

或在ssh_config文件中,如@Ángel 的回答所示。


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

  • “鄙视”似乎是一种极端的反应。当然,在某些情况下,快速修改命令行比首先修改配置文件更容易。但是,如果您打算多次连接到同一台主机,我*肯定* 宁愿更新一次我的配置文件,而不是每次需要连接时都使用 `-J user@intermediate`。 (3认同)
  • 这应该是公认的答案。当一个简单的命令行选项足以完成这项工作时,我鄙视所有对“ssh”问题的回答,这些问题建议修改特定主机的“config”。 (2认同)

Áng*_*gel 38

前面的答案提到了如何使用 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
...
Run Code Online (Sandbox Code Playgroud)

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

ProxyCommand ssh -W %h:%p bastion-machine
Run Code Online (Sandbox Code Playgroud)

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

ssh bastion-machine nc %h %p
Run Code Online (Sandbox Code Playgroud)

虽然这最后一个需要nc安装堡垒机。

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


Jos*_*hua 10

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

ssh -A user@host1 ssh user@host2 cat filename > filename
Run Code Online (Sandbox Code Playgroud)

你也可以上传

ssh -A user@host1 ssh user@host2 cat \\\> filename < filename
Run Code Online (Sandbox Code Playgroud)

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


Ral*_*edl 8

使用ProxyJump配置:

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

scp -o ProxyJump=user@intermediate user@target:/path
Run Code Online (Sandbox Code Playgroud)