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