python - 从 python 发起 SSH 隧道的问题

标签 python ssh tunnel paramiko

目标是在卫星服务器和中央注册数据库之间建立 n 个 ssh 隧道。我已经在我的服务器之间设置了公钥身份验证,因此它们无需密码提示即可直接登录。怎么办 ?我试过Paramiko。看起来不错,但仅仅设置一个基本的隧道就变得相当复杂,尽管代码示例会很受欢迎。我试过 Autossh,它在建立一个工作隧道后 2 分钟就死了,很奇怪!希望有人可以帮助我提供一个简单的代码片段,我可以使用 supervisord 或 monit 对其进行守护进程和监控。

最佳答案

这是 script 的精简版亚历克斯指给你看的。

它只是连接到 192.168.0.8 并将端口 3389192.168.0.6 转发到本地主机

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()

关于python - 从 python 发起 SSH 隧道的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2323471/

相关文章:

python - 使用Python telnet lib w/o logout命令

安装后 CentOs 上的 Python 2.6 问题

python - "zsh: unknown file attribute: 0"在命令行上传递Python元组

java - Eclipse 环境中的 Hadoop

proxy - 使用 Envoy 在网络之间设置隧道

python - 为什么我的 2 层神经网络的二元分类准确率仅为 50%?

svn 超过 2 个 ssh 隧道

linux - 用于在 Linux 中通过 Web 浏览器访问和开发的独立程序

linux - 如何在两个接口(interface)之间建立 Telnet 连接隧道?

security - 将 JMX 限制到本地主机