Problem originating SSH tunnels from python

前端 未结 2 1777
长情又很酷
长情又很酷 2021-02-11 05:45

The object is to set up n number of ssh tunnels between satellite servers and a centralized registry database. I have already set up public key authentication between my servers

2条回答
  •  悲哀的现实
    2021-02-11 06:45

    Here is a cutdown version of the script that Alex pointed you to.

    It simply connects to 192.168.0.8 and forwards port 3389 from 192.168.0.6 to localhost

    import select
    import SocketServer
    import sys
    import paramiko
    
    class ForwardServer(SocketServer.ThreadingTCPServer):
        daemon_threads = True
        allow_reuse_address = True
    
    class Handler (SocketServer.BaseRequestHandler):
        def handle(self):
            try:
                chan = self.ssh_transport.open_channel('direct-tcpip', (self.chain_host, self.chain_port), self.request.getpeername())
            except Exception, e:
                print('Incoming request to %s:%d failed: %s' % (self.chain_host, self.chain_port, repr(e)))
                return
            if chan is None:
                print('Incoming request to %s:%d was rejected by the SSH server.' % (self.chain_host, self.chain_port))
                return
    
            print('Connected!  Tunnel open %r -> %r -> %r' % (self.request.getpeername(), chan.getpeername(), (self.chain_host, self.chain_port)))
            while True:
                r, w, x = select.select([self.request, chan], [], [])
                if self.request in r:
                    data = self.request.recv(1024)
                    if len(data) == 0:
                        break
                    chan.send(data)
                if chan in r:
                    data = chan.recv(1024)
                    if len(data) == 0:
                        break
                    self.request.send(data)
            chan.close()
            self.request.close()
            print('Tunnel closed from %r' % (self.request.getpeername(),))
    
    def main():
        client = paramiko.SSHClient()
        client.load_system_host_keys()
        client.set_missing_host_key_policy(paramiko.WarningPolicy())
        client.connect("192.168.0.8")
    
        class SubHandler(Handler):
            chain_host = "192.168.0.6"
            chain_port = 3389
            ssh_transport = client.get_transport()
    
        try:
            ForwardServer(('', 3389), SubHandler).serve_forever()
        except KeyboardInterrupt:
            sys.exit(0)
    
    if __name__ == '__main__':
        main()
    

提交回复
热议问题