编程语言
首页 > 编程语言> > python-通过ssh隧道传输TCP端口而不阻塞

python-通过ssh隧道传输TCP端口而不阻塞

作者:互联网

我正在尝试通过pexpect使用以下代码设置ssh隧道:

#!/bin/env python2.4

import pexpect, sys
child = pexpect.spawn('ssh -CfNL 0.0.0.0:3306:127.0.0.1:3306 user@server.com')
child.logfile = sys.stdout
while True:
    code = child.expect([
        'Are you sure you want to continue connecting \(yes/no\)\?',
        'password:',
        pexpect.EOF,
        pexpect.TIMEOUT
    ])
    if code == 0:
        child.sendline('yes')
    elif code == 1:
        child.sendline('passwordhere')
    elif code == 2:
        print ".. EOF"
        break
    elif code == 3:
        print ".. Timeout"
        break

我希望在发送密码并建立ssh隧道之后,退出while循环,以便我可以继续使用其他业务逻辑进行处理.

但是,如果建立了ssh隧道,则上面的代码将阻止util超时(约30秒).

谁能给我一些关于如何避免阻塞的建议?

解决方法:

我认为最简单的解决方案是使用ssh主机密钥身份验证,并结合使用& ssh作为后台.这是一个非常基本的实现,但是您可以增强它以在完成后杀死该进程…此外,请注意,由于我们正在后台处理该进程,因此我在您的ssh args中添加了-n.

import subprocess

USER = 'user'
HOST = 'server.com'
cmd = r"""ssh -CfNnL 0.0.0.0:3306:127.0.0.1:3306 %s@%s &""" % (USER, HOST)
subcmd = cmd.split(' ')
retval = subprocess.Popen(subcmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stat = retval.poll()
while stat == None:
    stat = retval.poll()
print "ssh in background"

最后,如果您的ssh_config中尚未包含ServerAliveInterval,请考虑将ssh称为ssh -o ServerAliveInterval = 30< other_options_and_args>确保您尽快检测到隧道丢失,并防止该隧道在路径中的任何NAT实现中老化(在不活动期间).

标签:pexpect,ssh-tunnel,python
来源: https://codeday.me/bug/20191208/2090092.html