常见的多个 SSH 连接文件处理问题

常见的多个 SSH 连接文件处理问题

我经常需要下载无法通过第一个 SSH 连接直接访问的文件。例如,我在一台 Windows 计算机上,我想访问另一台只能从 LAN 访问的计算机。这意味着我必须首先连接到中间机器并通过 SSH 连接到下一台机器。

如果该文件可用于第一台机器,那么使用 pscp 获取该文件会很容易。在这种情况下可以使用 SSH 端口转发吗?

答案1

我添加.ssh/config这样的定义:

Host SERVER-A
    ProxyCommand ssh SERVER-B nc -q0 %h %p 2> /dev/null

然后以正常方式使用sshor :scp

ssh user@SERVER-A

或者

scp file.tar.gz user@SERVER-A:~

SERVER-A在设置与ssh 库的连接时会发现这些配置。它告诉 ssh 应该使用一些代理命令来连接。代理命令连接SERVER-B并执行nc命令(netcat),它将代理命令的所有输出转发到给定端口的给定服务器,其定义%h%p参数。

这种结构还允许您使用密钥身份验证。您刚刚从两台服务器上的客户端计算机复制了公共内容:SERVER-ASERVER-B

此类配置还与使用 ssh 库的其他应用程序兼容,例如rsyncsftp或 GUI 客户端。

答案2

是的,在这种情况下可以使用 SSH 端口转发,但在尝试此操作时,您也可能会收到有关无效或不正确的主机密钥的警告。某些 SSH 客户端(例如 OpenSSH)仅通过域或 IP 跟踪 SSH 主机密钥,并且不包含端口号。 PuTTY 似乎会使用主机密钥记录端口号,只要您与每个主机使用的端口号保持一致,就不会遇到此问题。我建议将端口转发添加到 PuTTY 中保存的会话中。然后,您还可以将各种远程主机的其他会话保存为已保存会话,并将其与 pscp/psftp 一起使用。您可以从任何高编号端口开始进行转发,例如 2220,然后为需要通过中间主机转发的每台主机从该端口增加 1。添加到intermediate本地端口转发的已保存会话,例如远程主机的端口2220和目标以及带有目标的remote1:22端口,然后为带有目标和 SSH 端口的会话以及带有目标和 SSH 端口的会话 创建会话。要使用主机的pcsp/psftp 会话。2221remote2:22remote1remote2remote1localhost2220remote2localhost2221@session-name

当您以某种方式将 SSH 主机密钥与 localhost 关联,并且尝试连接到转发到另一台计算机的本地端口时,就会出现此问题。借助 OpenSSH,我通过使用 解决了这个问题HostKeyAlias。我像~/.ssh/config这样添加了条目:

Host intermediate
HostName intermediate.example.org
LocalForward 2220 remote1.example.org:22
LocalForward 2222 remote2.example.org:22

Host remote1
HostName localhost
Port 2220
HostKeyAlias remote1.example.org

Host remote2
HostName localhost
Port 2221
HostKeyAlias remote2.example.org

不过,我首选的修复方法是在家庭和工作网络上部署 IPv6,这样我就不必再担心首先连接到中间服务器才能到达最终目的地了。

答案3

您可以使用中间机器作为代理。确保它有网络猫 ( nc)安装。将以下行放入您的~/.ssh/configfoo是无法访问的机器的昵称,foo.example.com是从中间机器看到的名称,gateway.example.com是中间机器):

Host foo
HostName foo.example.com
ProxyCommand ssh gateway.example.com nc %h %p

然后ssh foo将连接(经过两跳,但这是完全透明的)到无法访问的机器。

答案4

遵循gelraen的回答。

.ssh/config.也就是说,您为特定的虚拟主机名设置一个代理命令,该命令除了通过已打开的隧道进行 tcp 转发之外什么也不做:

Host imag
ProxyCommand socat - tcp-connect:localhost:2022

ssh imag然后,当隧道启动时,您可以使用连接到 server-b:22 。

socat这正是我用过的,netcat应该做得很好;)

一个有趣的事情ProxyCommand是它插入环境变量 - 所以......尝试一下。

相关内容