2014-07-08 17 views
0

我正在使用反向ssh連接到遠程客戶端,運營商反向運行一次並離開客戶端系統 如何在反向ssh與服務器重試斷開連接時編寫bash腳本連接到服務器(ssh)如何知道ssh是否被拒絕並使用bash腳本重試

+0

您的意思是「反向SSH隧道」? – kiran

+0

有時SSH會話可能會顯示爲「掛起」,進程無法消失。這聽起來像你想要一種「看門狗」,它將測試一個*函數*隧道,而不是檢查以確保該過程仍然存在。有很多方法可以做到這一點,你可以研究。如果您在實施某項功能時遇到問題,請提出顯示您嘗試的代碼的問題,以及您的預期結果和實際結果。 – ghoti

回答

2

使用autossh。 Autossh「自動重新啓動[S] SSH會話和隧道」

sudo apt-get install autossh 

我用autossh來保持我依賴的開放反向隧道。即使長時間連接失敗,它也能很好地工作。

這裏是我用來創建隧道的腳本:

#!/bin/bash 
AUTOSSH_GATETIME=0 
export AUTOSSH_GATETIME 
autossh -f -N -R 8022:localhost:22 [email protected] -o "ServerAliveInterval 45" -o "ServerAliveCountMax 2" 

我在啓動這個的cronjob執行這個腳本:

@reboot /home/scripts/./persistent-tunnel.sh 
+0

顯然,如果使用'-f','AUTOSSH_GATETIME'設置爲0,所以我不認爲你需要它。 – Timmmm

0

您可以使用netstat -ntp | grep ":22"ss -ntp | grep ":22"查看建立的與ssh端口的連接,然後使用grep過濾您要查找的IP地址。如果您沒有找到連接,請重新連接隧道。

2

如果你只是想重試命令,直到成功,您可以使用此模式:

while ! ssh [...] 
do 
    echo "Command failed, retrying..." >&2 
done 
1

你可能想看看到SSH選項ServerAliveInterval ,ServerAliveCountMax和TCPKeepAlive,因爲有時候你的線路沒有這麼明顯就死掉了,讓我來演示一下:

#!/bin/sh 

while true; do 

ssh -T [email protected] \ 
    -o IdentityFile=~/.ssh/tunnel \ 
    -o UserKnownHostsFile=~/.ssh/known_hosts.tunnel \ 
    pkill -f "^sshd:\ user\ \ \ \ $" # needs to be edited for nearly every case 

sleep 2 

ssh -T -N [email protected] \ 
    -o IdentityFile=~/.ssh/tunnel \ 
    -o UserKnownHostsFile=~/.ssh/known_hosts.tunnel \ 
    -o Batchmode=yes \ 
    -o ExitOnForwardFailure=yes \ 
    -o ServerAliveCountMax=1 \ 
    -o ServerAliveInterval=60 \ 
    -o LocalForward=127.0.0.1:2501=127.0.0.1:25 \ 
    -o RemoteForward=127.0.0.1:2501=127.0.0.1:25 

sleep 60 

done 
1

我有一個稍微不同的方法。 我的方法總是試圖重新連接你,如果你有一個髒斷開:'〜'。或'通過遠程主機關閉連接'。 但是,如果您使用'CRTL + D'或'退出'斷開連接,它會斷開連接並顯示一些連接信息。

我有一個稍微不同的方法。 我的方法總是試圖重新連接你,如果你有一個髒斷開:'〜'。或'通過遠程主機關閉連接'。 但是,如果您使用'CRTL + D'或'退出'斷開連接,它會斷開連接並顯示一些連接信息。

#/bin/bash 
if [ -z "$1" ] 
then 
     echo ''' 
     Please also provide ssh connection details. 
     ''' 
     exit 1 
fi 
retries=0 
repeat=true 
today=$(date) 
while "$repeat" 
do 
     ((retries+=1)) && 
     echo "Try number $retries..." && 
     today=$(date) && 
     ssh "[email protected]" && 
     repeat=false 
     sleep 5 
done 
echo """ 
     Disconnected sshx after a successful login. 
     Total number of tries = $retries 
     Connected at: 
     $today 
"""