2017-11-28 17 views
2

파이썬에서 ssh-tunnel을 설정하는 함수를 구현하여 NAT 뒤의 DB에 데이터를 삽입 할 수 있습니다 (포트 포워딩 없음).파이썬 : 원격 서버가 다운 된 후 자동으로 ssh 터널 재 연결

import paramiko 
from sshtunnel import SSHTunnelForwarder 
def fnc_ssh_tunnel(): 
    try: 
     sshServer = SSHTunnelForwarder(
       (SSH_IP, SSH_PORT), 
       ssh_username   = SSH_USER, 
       ssh_password   = SSH_PASS, 
       set_keepalive   = float(SSH_KEEP_ALIVE), 
       remote_bind_address  = (DB_IP, DB_PORT), 
      ) 
     sshServer.start() 
     localPort = sshServer.local_bind_port 
     logPrint("SSH Tunnel Started to " + str(sshServer.tunnel_bindings), DEBUG_ID) 
     sshServer.check_tunnels() 
     return localPort 

    except Exception as e: 

     logPrint("Error SSH Tunnel", DEBUG_ID) 
     logPrint(e,DEBUG_ID) 
     quit() 

이제는 매우 잘 작동하고 있습니다. 이 구현을 통해 나중에 localhost:localport (localport이 반환되는 fnc_ssh_tunnel()에있는 DB)에 대한 연결을 가져옵니다.

어떤 이유로 DB가있는 원격 PC가 재부팅되면 문제가 발생합니다. 그렇다면 PC의 SSH 서버가 모든 연결을 끊어 버리므로 내 SSH 터널도 다운됩니다.

그런 상황에서 복구하려면 파이썬 프로그램을 다시 시작해야합니다.이 경우 터널이 다시 설정됩니다.

원격 서버가 다운 된 경우 ssh-tunnel을 다시 설정하는 좋은 방법이 있습니까?

감사합니다.

서버를 시작한 후 서버가 활성화되어있는 경우가 아니라면, 계속 확인 다시 시작 : 여기 같은 문제에 직면하고 있어요

답변

0

내 솔루션입니다.

def get_server(): 
    # define ssh server and return it 

server = get_server() 
server.start() 
while True : 
    if(server.is_active): 
     print("alive... " + (time.ctime())) 
    else: 
     print("reconnecting... " + time.ctime()) 
     server.stop() 
     server = get_server() 
     server.start() 
    time.sleep(60)