2012-11-27 38 views
5

tôi cần phải thực hiện một máy chủ ssh sử dụng paramiko mà chỉ xử lý các yêu cầu cổng chuyển tiếp '-R' như thế này:paramiko chuyển tiếp

ssh -N -T -R 40005:destination_host:22 [email protected] 

Cho đến nay từ những gì tôi hiểu tôi sẽ phải thực hiện ServerInterface .check_port_forward_request và tại một số điểm sau, tạo một ổ cắm và lắng nghe cổng được chỉ định. Bất kỳ dữ liệu nào đi qua Kênh/Kết nối đều đi tới Kết nối/Kênh tương ứng

class Server (paramiko.ServerInterface): 
    . 
    . 
    . 
    def check_port_forward_request(self, address, port): 
     'Check if the requested port forward is allowed' 
     ... 
     return port 

def handler(chan, port): 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.bind(('', port)) 
    sock.listen(1) 
    conn, addr = s.accept()  

    while True: 
     r, w, x = select.select([conn, chan], [], []) 
     if conn in r: 
      data = conn.recv(1024) 
      if len(data) == 0: 
       break 
      chan.send(data) 
     if chan in r: 
      data = chan.recv(1024) 
      if len(data) == 0: 
       break 
      conn.send(data) 
    chan.close() 
    conn.close() 
    verbose('Tunnel closed from %r' % (chan.origin_addr,)) 

thr = threading.Thread(target=handler, args=(chan,server_port)) 
thr.setDaemon(True) 
thr.start() 

Đây có phải là ý tưởng chung đằng sau việc triển khai chuyển tiếp cổng ssh paramiko phía máy chủ không? Tôi có nên bắt đầu chuỗi bên trong check_port_forward_request hoặc ở một nơi khác không?

Trả lời