我正在尝试使用以下代码通过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秒)。
有人可以就如何避免阻止给我一些建议吗?
答案 0 :(得分:3)
我认为最简单的解决方案是使用ssh主机密钥身份验证,结合后台ssh
和&
...这是一个非常基本的实现,但你可以增强它来杀死进程在你完成之后......另外,请注意我已将-n
添加到您的ssh
args,因为我们正在处理此过程。
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"
最后,如果您的ServerAliveInterval
中还没有ssh_config
,请考虑将ssh
称为ssh -o ServerAliveInterval=30 <other_options_and_args>
,以确保尽快检测到隧道丢失可能,并防止路径中的任何NAT实现老化(在不活动期间)。