保证这种 SSH 连接的最佳方式是啥?

Posted

技术标签:

【中文标题】保证这种 SSH 连接的最佳方式是啥?【英文标题】:What is the best way to guarantee this type of SSH connection?保证这种 SSH 连接的最佳方式是什么? 【发布时间】:2017-07-31 19:52:06 【问题描述】:

我有这个脚本可以创建从机器 A 到机器 B 的“反向”SSH 连接,以便我可以从机器访问机器 A。

我是怎么做到的

这是机器 A 用来连接机器 B 的脚本,它在启动时运行一次:

spawn ssh -fN -oStrictHostKeyChecking=no -i /home/pi/.ssh/id_rsa -R 20007:localhost:22 machine_b@123.456.789.012
expect "*passphrase*"
send "the passphrase string\r"
expect eof

然后在机器B上,我只需要像这样连接到机器A:

ssh pi@localhost -p 20007

为什么我要使用这种“反向”SSH 连接?嗯,这是机器 B 可以看到并连接到机器 A 的唯一方法,因为机器 A 在 NAT 之后,无法寻址,所以连接必须来自机器 A。

问题

这很好用,尽管它都是硬编码的,尤其是密码部分。但是它有一个问题...如果机器 A 的 Internet 出现故障,SSH 连接将关闭并且在 Internet 出现时不会重新打开。

解决方案尝试

我的第一个解决方案是让一个 cronjob 每小时运行 SSH 脚本,但很快我每天从机器 A 到机器 B 有 24 个同时 SSH 连接,到本周末机器 B 因过多的 SSH 连接而死机。

问题

那么,有没有其他方法可以让机器 A 仅在断开连接时“重新生成”连接,并确保旧连接被终止,以便我只有一个从机器 A 到 B 的 SSH 连接?

谢谢!

【问题讨论】:

如何可靠地保持 SSH 隧道打开? superuser.com/questions/37738/… 如果出于某种原因您仍想使用您的代码,您可以使用由您的 cron 作业调用的脚本来检查您使用的特定端口上的活动连接。为此, losf -i :port_number 将为您提供使用 port_number 的进程的 PID(如果有)。 哦,顺便说一句,如果您可以访问 NAT 配置,您可以使用端口转发:en.wikipedia.org/wiki/Port_forwarding 【参考方案1】:

您可以使用 netstat 检查当前连接,grep 端口 22,如果已建立则什么也不做。即 netstat -an | egrep 22

【讨论】:

以上是关于保证这种 SSH 连接的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中拥有这种复杂的水平和垂直滚动结构的最佳方式是啥? [关闭]

在 Hibernate 的 SessionFactory 和 JDBC DAO 之间共享连接的最佳方式是啥?

将 ibm cloud app-connect 与 mq 连接的最佳方式是啥?

Window下使用Xshell连接VirtualBox中CentOS SSH最佳实践

在数据库中存储货币价值的最佳方式是啥?

在数据库中存储货币价值的最佳方式是啥?