如何解决通过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
参数中添加了-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实现中老化(不活动)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。