2011-07-20 28 views
6

Tôi là người dùng mới bắt đầu sử dụng Linux và cũng là người mới sử dụng ssh và đường hầm.Cách thiết lập tự động (khởi động lại) đường hầm ssh nền

Dù sao, mục tiêu của tôi là duy trì đường hầm ssh mở ở chế độ nền.

Để làm điều đó, tôi đã viết lô sau mà sau đó tôi thêm vào crontab (lô được xử lý tự động sau mỗi 5 phút trong ngày làm việc và từ 8 giờ sáng đến 9 giờ tối). Tôi đọc trong một số chủ đề khác trong stackoverflow mà một trong những nên sử dụng autossh mà sẽ đảm bảo ssh sẽ luôn luôn được ok thông qua một kiểm tra thường xuyên. Vì vậy đã làm tôi ....

#!/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 

Vấn đề của tôi là đôi khi các đường hầm ngừng hoạt động, mặc dù tất cả mọi thứ trông ok (ps ax | grep ssh> kết quả cho thấy hai nhiệm vụ dự kiến: autossh Nhiệm vụ chính và ssh đường hầm chính nó). Tôi thực sự biết về vấn đề gây ra đường hầm được sử dụng bởi một phần mềm của bên thứ ba mà gây ra một lỗi ngay sau khi đường hầm không còn đáp ứng.

SO Tôi tự hỏi làm thế nào tôi nên cải thiện hàng loạt của tôi theo thứ tự Nó sẽ có thể kiểm tra đường hầm và khởi động lại nó nếu nó xảy ra để được chết. Tôi đã thấy một số ý tưởng trong there, nhưng nó đã được ký kết bằng gợi ý "autossh" ... mà tôi đã sử dụng. Vì vậy, tôi không có ý tưởng ... Nếu có ai trong số các bạn có, tôi vui mừng có một cái nhìn vào họ!

Cảm ơn bạn đã quan tâm đến câu hỏi của tôi và cho các đề xuất (có thể) của bạn!

+0

Tôi nghĩ bạn nên có một cái nhìn tại serverfault.com. Tìm kiếm 'ssh' hoặc' autossh' Ví dụ: http://serverfault.com/questions/159766/bash-script-with-permanent-ssh-connection – powerMicha

Trả lời

12

Thay vì kiểm tra quá trình ssh với ps bạn có thể làm các trick sau

tạo kịch bản, nào sau đây và thêm nó vào crontab của bạn thông qua 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 

Trong thực tế, kịch bản này sẽ mở hai cổng

  • cổng 22 sẽ được sử dụng để kiểm tra xem đường hầm vẫn còn sống
  • cổng 8080 là cổng bạn có thể muốn sử dụng

Vui lòng kiểm tra và gửi cho tôi thắc mắc thông qua ý kiến ​​

+0

Xin chào và cảm ơn vì điều này. – Marvin

+0

Hi Marvin, nếu câu trả lời của tôi đã giúp bạn giải quyết vấn đề, bỏ phiếu và chấp nhận câu trả lời này - Điều này sẽ nâng cao danh tiếng của bạn trong stackoverflow. – powerMicha

+0

Tôi đã thử nhưng gặp phải một số sự cố: * Tôi nhầm lẫn về các cổng; không nên cổng từ xa là như nhau, whatevever địa phương có thể được? * cũng về cổng: Tôi có tùy chọn này '-p $ SOME_PORT' trong lệnh ssh mà tôi đã sử dụng; điều này có ghi đè lên $ REMOTE_PORT hoặc đây là một số cổng bổ sung hay không và bạn có tránh đề cập đến mục đích đó không? Cuối cùng, tôi nhận được điều này khi trở về từ lô (cố định): ssh: Không thể phân giải tên máy chủ [MyHostName]: Tên hoặc dịch vụ không xác định. tên máy chủ là chính xác, nhưng có vẻ như nó không thể làm trình nghe đường hầm trên cổng 22): Có stg tôi bỏ lỡ? – Marvin

0

(tôi thêm này như một câu trả lời vì không có đủ chỗ cho nó un một bình luận)

Ok, tôi cố gắng làm cho chạy batch để khởi động đường hầm ssh (tôi đã phải chỉ định tên máy của tôi thay vì localhost để nó có thể được kích hoạt):

#!/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 

Tuy nhiên, tôi nhận được một số thông điệp ngay lập tức (bên dưới) khi đường hầm đang chạy và khi cron cố gắng lau lại lô hàng ... có vẻ như nó không thể nghe được. Cũng vì tôi cần một chút thời gian để có được bằng chứng, tôi không thể nói được rằng nó sẽ khởi động lại thành công nếu đường hầm đã hết.

Đây là câu trả lời cho lần bắt đầu thứ hai của lô.

ràng buộc: Địa chỉ đã được sử dụng channel_setup_fwd_listener: không thể nghe đến cảng: 10022 bind: Địa chỉ đã được sử dụng channel_setup_fwd_listener: không thể lắng nghe cổng: 8082 Không thể yêu cầu chuyển tiếp địa phương.

+0

địa chỉ sử dụng thư bạn nhận được là vì bạn đã xóa khỏi tập lệnh của mình, phần kiểm tra xem đường hầm của bạn đã chạy chưa. 'pgrep -fl $ SSH_LOCALPORT: $ REMOTEHOST: $ SSH_REMOTEPORT' sẽ tiết lộ rằng ssh từ lần chạy đầu tiên vẫn đang chạy. – Superole

-1

Bạn có thể sử dụng netcat để kiểm tra kết nối và mở nó nếu cần thiết:

while sleep 3; do nc -z localhost 3333 >/dev/null || ssh -NfL 3333:lg:5432 [email protected]; done 
Các vấn đề liên quan