我有 2 台服务器 [电子邮件保护]和[电子邮件保护],我想连接到[电子邮件保护]但由于限制,我无法直接连接,我必须先连接到[电子邮件保护]然后我必须从 example1.com 连接到 example2.com。
现在我想在本地将我的应用程序连接到远程 psql 服务器,该服务器位于[电子邮件保护]:5432。为此我必须执行以下步骤。
通过 SSH 进入 example1.com
ssh [email protected]
现在从 example1 开始,在 ssh 之后进入 example1.com,然后通过在 example1.com 中输入以下内容将端口 5432 从 example2 转发到 example1 的 5434:
ssh -L 5434:localhost:5432 [email protected]
现在,从我的本地另一个终端选项卡中,我必须输入以下命令将 example1.com 的端口 5434(来自 example2 的 5432)转发到我的本地 5432。
ssh -L 5432:localhost:5434 [email protected]
现在终于在本地,我的应用程序可以使用端口 5432 连接到本地主机,就好像 psql 在本地运行一样。
我想将整个过程变成一个命令,这样我就可以只用一步完成它并在一步中停止它,而不是执行上述 3 个步骤,因为我必须一次又一次地输入很多内容,所以我愿意创建一个可执行文件(如 shell 脚本)。
到目前为止我尝试这样做:
ssh -L 5432:localhost:5434 [email protected] ssh -L 5434:localhost:5542 -N [email protected]
这正是我想要的解决方案,效果非常好,有用,但是,有一个但现在。而那不过是,当我按 CTRL + C 时,它会终止 example1 的 5434 到本地 5432 的本地 ssh 连接,但它不会终止 example2.com 和 example1.com 之间的连接,因此当我再次运行上述命令时会出现此错误:
bind: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 5434
然后我必须再次更改端口,然后它再次挂起,当我再次按 CTRL+C 时,它会阻止该端口,
那么我需要什么?
所以我需要另一种端口转发方式,或者我需要一种方法来终止 example1.com 和 example2.com 之间的连接,我只需要一步(单行)来启动和一步来停止(单行)。
到目前为止,我一直通过ps -aux | grep 5434
从 example1.com 内部执行并使用 kill 命令来终止这些连接。
我的本地 SSH 配置(〜/.ssh /配置)
Host *.*.*.*
StrictHostKeyChecking no
Host *
ServerAliveInterval 50
ServerAliveCountMax 10
ForwardAgent yes
编辑#1:
ssh -J [email protected] ssh -L 5432:localhost:5432 -N [email protected]
尝试了上述命令但出现此错误:
open failed: administratively prohibited: open failed
stdio forwarding failed
ssh_exchange_identification: Connection closed by remote host
这可能与 example2 是私有 IP 有关,只有 example1 是公共 IP(不确定这是否是问题所在)。
答案1
问题ssh
在于如何生存下去example1.com
。
简化整个设置。一种优雅的方法是使用ssh -J
:
-J destination
首先与所描述的跳转主机建立 ssh 连接destination
,然后从那里建立到最终目的地的 TCP 转发,从而连接到目标主机。
ssh -J [email protected] ssh -L 5432:localhost:5432 -N [email protected]
这是不是相当于从本地计算机连接到 ,example1.com
然后从example1.com
连接到example2.com
。这相当于从本地计算机连接到 ,example1.com
然后从本地连接到example2.com
(使用通过 转发的数据包example1.com
)。 不会在 上调用 SSH 客户端example1.com
。这意味着:
的凭证
example2.com
必须来自您的本地计算机,而不是来自example1.com
。如果您提到的限制意味着凭证来自example1.com
并且您无法更改这一点,那么这种方法就无法使用。无论是从
/etc/ssh/ssh_config
还是~/.ssh/config
从,都无关紧要example1.com
。example2.com
在您的当地的配置。注意你可以指定ProxyJump
在配置中:Host example2.com ProxyJump example1.com
-J
如果这样做,则连接到时将不再需要example2.com
:ssh -L 5432:localhost:5432 -N [email protected]
如果出现这种情况administratively prohibited: open failed
(或者由于任何原因您不能或不想使用-J
/ ProxyJump
),请恢复为原始命令(我们将立即修复它)。
administratively prohibited: open failed
在您的情况下,意味着无法通过-J
建立从本地计算机到 的 TCP 转发,因为 的管理员不允许这样做。但您的原始命令仍成功转发端口。可能example2.com
example1.com
example1.com
PermitOpen localhost:*
正在使用中。那么让我们修复您的原始命令。
您的原始命令的形式为:
ssh … [email protected] ssh …
像这样修复它:
ssh -tt … [email protected] ssh …
不同之处在于-tt
将强制分配 tty 以ssh
运行[email protected]
(无论您的本地是否ssh
有 tty)。现在,如果您终止本地,ssh
则远程ssh
将收到SIGHUP
:
在符合 POSIX 标准的平台上,
SIGHUP
“信号挂断”是在进程的控制终端关闭时发送给进程的信号。
ssh
正在运行的程序example1.com
将在 时正常退出SIGHUP
。您不再需要手动将其终止。
您的原始命令未分配 tty,因此此有用机制不适用。添加-tt
会更改此情况。