问题描述
|
我正在尝试通过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
参数中添加了-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\"
最后,如果您的ѭ7中还没有ѭ6,请考虑将ѭ1称为ѭ9,以确保尽快检测到隧道的丢失,并防止该隧道在路径中的任何NAT实现中老化(不活动)。