我正在尝试从本地计算机连接到远程 MySql 服务器。
我想在 DEBUG 常量设置为 true 时运行它。

这是脚本:

import select 
import SocketServer 
import sys 
import threading 
import paramiko 
 
SSH_PORT = 22 
DEFAULT_PORT = 4000 
 
g_verbose = True 
 
 
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: 
            verbose('Incoming request to %s:%d failed: %s' % (self.chain_host, 
                                                              self.chain_port, 
                                                              repr(e))) 
            return 
        if chan is None: 
            verbose('Incoming request to %s:%d was rejected by the SSH server.' % 
                    (self.chain_host, self.chain_port)) 
            return 
 
        verbose('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() 
        verbose('Tunnel closed from %r' % (self.request.getpeername(),)) 
 
 
def forward_tunnel(local_port, remote_host, remote_port, transport): 
    # this is a little convoluted, but lets me configure things for the Handler 
    # object.  (SocketServer doesn't give Handlers any way to access the outer 
    # server normally.) 
    class SubHander (Handler): 
        chain_host = remote_host 
        chain_port = remote_port 
        ssh_transport = transport 
    ForwardServer(('', local_port), SubHander).serve_forever() 
 
 
def verbose(s): 
    if g_verbose: 
        print s 
 
 
HELP = """\ 
Set up a forward tunnel across an SSH server, using paramiko. A local port 
(given with -p) is forwarded across an SSH session to an address:port from 
the SSH server. This is similar to the openssh -L option. 
""" 
 
def forward(): 
    client = paramiko.SSHClient() 
    client.load_system_host_keys() 
    client.set_missing_host_key_policy(paramiko.WarningPolicy()) 
 
    try: 
        print 'connecting' 
 
        client.connect('*******', username='***', password='****!') 
 
        print 'connected' 
    except Exception, e: 
        print '*** Failed to connect to %s:%d: %r' % ('*****', 22, e) 
        sys.exit(1) 
 
    try: 
        forward_tunnel(3306, '127.0.0.1', 3306, client.get_transport()) 
    except SystemExit: 
        print 'C-c: Port forwarding stopped.' 
        sys.exit(0) 

我这里有两个问题:
1)当 django 引发时,我不知道如何以及何时调用我的 forward 函数。
2)当我在本地访问 django 并从控制台运行脚本时,出现以下异常:

exception happened during processing of request from ('127.0.0.1', 41872) Traceback (most recent call last): File "/usr/lib/python2.6/SocketServer.py", line 558, in process_request_thread self.finish_request(request, client_address) File "/usr/lib/python2.6/SocketServer.py", line 320, in finish_request self.RequestHandlerClass(request, client_address, self) File "/usr/lib/python2.6/SocketServer.py", line 615, in init self.handle() File "/home/omer/Aptana Studio 3 Workspace/Website/src/ssh_tunnel/tunnel.py", line 51, in handle verbose('Tunnel closed from %r' % (self.request.getpeername(),)) File "", line 1, in getpeername
File "/usr/lib/python2.6/socket.py", line 165, in _dummy raise error(EBADF, 'Bad file descriptor') error: [Errno 9] Bad file descriptor



这是一个坏主意吗?
我应该每次都手动执行吗?

请您参考如下方法:

我不认为这是一个坏主意。

我认为您不需要手动执行此操作。

异常(exception)是 paramiko 的正向代码示例中的错误。 jhalcrow 在此处的拉取请求中已解决此问题:

https://github.com/paramiko/paramiko/pull/36

这篇文章有一些代码可以以更多的事件驱动方式来完成,即如果您想通过 django 代码中的一些 Web 事件 Hook 等来调用它:

Paramiko SSH Tunnel Shutdown Issue


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!