2017-03-10 55 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

相關問題