通过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实现中老化(不活动)。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...