2011-07-20 17 views
6

我是一個初學者的Linux用戶,也很新手在SSH和隧道。如何設置一個自動(重新)開始的背景SSH隧道

無論如何,我的目標是維護一個在後臺打開的ssh隧道。

爲了做到這一點,我編寫了以下批處理,然後將其添加到crontab中(批處理在工作日期間每隔5分鐘自上午8點至晚上9點自動處理)。 我在一些其他線程在stackoverflow閱讀,應該使用autossh,這將確保ssh將永遠通過經常性檢查確定。所以做我....

#!/bin/bash 
LOGFILE="/root/Tunnel/logBatchRestart.log" 
NOW="$(date +%d/%m/%Y' - '%H:%M)" # date & time of log 

if ! ps ax | grep ssh | grep tunnelToto &> /dev/null 
then 
    echo "[$NOW] ssh tunnel not running : restarting it" >> $LOGFILE 
    autossh -f -N -L pppp:tunnelToto:nnnnn [email protected] -p qqqq 
    if ! ps ax | grep ssh | grep toto &> /dev/null 
    then 
      echo "[$NOW] failed starting tunnel" >> $LOGFILE 
    else 
      echo "[$NOW] restart successfull" >> $LOGFILE 
    fi 
fi 

我的問題是,有時隧道停止工作,但是每一件事情看起來不錯(ps的斧頭| grep的SSH>,結果表明這兩個預期任務:autossh主要任務和SSH隧道本身)。實際上我知道這個問題導致隧道被第三方軟件使用,只要隧道沒有響應就會觸發錯誤。

因此,我想知道如何改進我的批次,以便它能夠檢查隧道,並重新啓動它,如果它發生死亡。我在there中看到了一些想法,但它是由我已經使用的「autossh」提示得出的。因此,我沒有想法......如果你們有任何人,我很樂意看看他們!

感謝您對我的問題感興趣,併爲您的(也許)建議!

+0

我想你應該看看serverfault.com。搜索'ssh'或'autossh'例如:http://serverfault.com/questions/159766/bash-script-with-permanent-ssh-connection – powerMicha

回答

12

而不是檢查ssh過程與ps你可以做下面的技巧

創建腳本,做以下,並通過crontab -e

#!/bin/sh 

REMOTEUSER=username 
REMOTEHOST=remotehost 

SSH_REMOTEPORT=22 
SSH_LOCALPORT=10022 

TUNNEL_REMOTEPORT=8080 
TUNNEL_LOCALPORT=8080 

createTunnel() { 
    /usr/bin/ssh -f -N -L$SSH_LOCALPORT:$REMOTEHOST:SSH_REMOTEPORT -L$TUNNEL_LOCALPORT:$REMOTEHOST:TUNNEL_REMOTEPORT [email protected]$REMOTEHOST 
    if [[ $? -eq 0 ]]; then 
     echo Tunnel to $REMOTEHOST created successfully 
    else 
     echo An error occurred creating a tunnel to $REMOTEHOST RC was $? 
    fi 
} 

## Run the 'ls' command remotely. If it returns non-zero, then create a new connection 
/usr/bin/ssh -p $SSH_LOCALPORT [email protected] ls >/dev/null 2>&1 
if [[ $? -ne 0 ]]; then 
    echo Creating new tunnel connection 
    createTunnel 
fi 

事實上,該腳本將添加到您的crontab打開兩個端口

  • 端口22將用於檢查隧道是否仍然存在
  • 端口8080是端口,你可能想使用

請檢查並通過評論

+0

嗨,謝謝你。 – Marvin

+0

嗨馬文,如果我的回答幫助你解決了這個問題,請對它進行投票並接受這個答案 - 這會提高你和我的聲譽。 – powerMicha

+0

我試過但遇到一些問題: *我對端口感到困惑;不應該遠程端口是相同的,可能是本地的? *還有關於端口:我在我曾經使用的ssh命令中有'-p $ SOME_PORT'這個選項;這是否覆蓋了$ REMOTE_PORT,或者這是一些額外的端口,你是否避免提及它? 最後,我從(固定)批次返回時得到這個結果: ssh:無法解析主機名[MyHostName]:名稱或服務未知。主機名是正確的,但它看起來無法在端口22上執行隧道監聽器):是否存在stg我錯過了? – Marvin

0

給我更多的問題(我添加這作爲一個答案,因爲沒有足夠的空間,它取消一個評論)

好吧,我設法讓批處理啓動SSH隧道(我必須指定我的hostname,而不是本地主機,以便它可以被觸發):

#!/bin/bash 

LOGFILE="/root/Tunnel/logBatchRedemarrage.log" 
NOW="$(date +%d/%m/%Y' - '%H:%M)" # date et heure du log 


REMOTEUSER=username 
REMOTEHOST=remoteHost 

SSH_REMOTEPORT=22 
SSH_LOCALPORT=10022 

TUNNEL_REMOTEPORT=12081 
TUNNEL_SPECIFIC_REMOTE_PORT=22223 
TUNNEL_LOCALPORT=8082 

createTunnel() { 
    /usr/bin/ssh -f -N -L$SSH_LOCALPORT:$REMOTEHOST:$SSH_REMOTEPORT -L$TUNNEL_LOCALPORT:$REMOTEHOST:$TUNNEL_REMOTEPORT [email protected] -p $TUNNEL_SPECIFIC_REMOTE_PORT 
    if [[ $? -eq 0 ]]; then 
     echo [$NOW] Tunnel to $REMOTEHOST created successfully >> $LOGFILE 
    else 
     echo [$NOW] An error occurred creating a tunnel to $REMOTEHOST RC was $? >> $LOGFILE 
    fi 
    } 

## Run the 'ls' command remotely. If it returns non-zero, then create a new connection 
/usr/bin/ssh -p $SSH_LOCALPORT [email protected] ls >/dev/null 2>&1 
if [[ $? -ne 0 ]]; then 
    echo [$NOW] Creating new tunnel connection >> $LOGFILE 
    createTunnel 
fi 

但是,當隧道運行時,以及cron試圖再次激活批處理時,我收到了一些即時消息(聽起來像聽不到它)。另外,因爲我需要一些時間來獲得證明,所以我不能說如果隧道不在,它會成功重啓。

以下是對批次第二次啓動的響應。

綁定:地址已在使用channel_setup_fwd_listener:不能聽 端口:10022綁定:已在使用 channel_setup_fwd_listener地址:不能聽端口:8082未能進行 要求本地轉發。

+0

您使用的地址正在使用的消息是因爲您從腳本中刪除了檢查隧道是否已在運行的部分。 'pgrep -fl $ SSH_LOCALPORT:$ REMOTEHOST:$ SSH_REMOTEPORT'將顯示第一次運行的ssh仍在運行。 – Superole

-1

您可以使用netcat來測試連接,如果需要打開它:

while sleep 3; do nc -z localhost 3333 >/dev/null || ssh -NfL 3333:lg:5432 [email protected]; done