2017-03-10 57 views
1

我有这个脚本创建了从机器A到机器B的“反向”SSH连接,这样我就可以从机器访问机器A.保证这种SSH连接的最佳方式是什么?

我怎么做的

这是脚本机器A使用连接到计算机B,它在启动时运行一次:

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

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

ssh [email protected] -p 20007

凭啥我使用这种“逆向工程& se“SSH连接?那么,这是唯一的出路机器B可以看到并连接到机器A,因为A机是以一个NAT后面,它不能被解决,所以连接必须来自机器A.

问题

这工作正常,尽管它都是硬编码,特别是密码部分。然而,它有一个问题......如果机器A的互联网出现恶作剧,SSH连接就会关闭,并且在互联网出现时不会重新打开。

该解决方案尝试

我的第一个解决方案是在运行每隔一小时的SSH脚本一个cronjob,但很快我不得不每天到B机24个同时SSH连接从机A,并在2006年底本周机器B因多余的SSH连接而死亡。

问题

那么,有没有任何其他方法,使机器A“再生”仅在连接时断开连接,并确保旧的连接被杀死,这样我有且只有从机器A到B的一个SSH连接?

谢谢!

+1

如何可靠地保持SSH隧道打开? https://superuser.com/questions/37738/how-to-reliably-keep-an-ssh-tunnel-open –

+1

如果由于某种原因,你仍然想使用你的代码,你可以有一个你的cron调用的脚本检查您使用的特定端口上的活动连接的作业。为此,losf -i:port_number将为您提供使用port_number的进程的PID(如果有的话)。 – Ben

+1

哦,顺便说一下,如果你有权访问NAT配置,你可以使用端口转发:https://en.wikipedia.org/wiki/Port_forwarding – Ben

回答

0

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

相关问题