如何从python程序设置ssh隧道

时间:2016-03-02 19:17:24

标签: python linux ssh pymysql

(如果你有答案,请发一个经过测试的剧本,因为我已经尝试过完美的理论剧本并且它没有工作)

我在python中有一个cronjob,通过ssh隧道连接到外部服务器,在那里读取和写入MySQL数据库。

python程序打开一个ssh隧道并将mysql端口绑定到本地端口,然后通过pymysql库连接到外部数据库,就好像它是本地的一样。

一切正常,但是......我无法通过同一个程序打开和关闭隧道。所以,我必须手动打开一个隧道,让它打开-f -N -T参数到shh。

它运作正常,但我希望程序可以管理隧道而无需打开隧道。我无法为此获得正确的参数。

我在互联网上读到了一些答案,这些答案意味着等待隧道打开,然后通过杀死操作系统中的de进程来关闭。我不喜欢那些解决方案。事实上,我可以使用以下命令执行此操作:

sys_command = "ssh -T -f user@external.server -i /home/user/.ssh/id_rsa -p 22222 -L 3310:localhost:3306"    
            prog = subprocess.Popen(sys_command, stdout=subprocess.PIPE , stderr=subprocess.PIPE , shell = True)
            out,err = prog.communicate()

然后我用:

连接到数据库
con_test = pymysql.connect(user=conf.dbUser, passwd=conf.dbPass, host='localhost', port = 3310, db=conf.database)

它在另一个环境中工作,但是当我现在尝试它时,我得到了:

  

如果没有执行命令,就无法进入后台。

我尝试过很多参数组合。唯一有效的是:

ssh -f -N -T .....

但是,正如我所说,这会无限期地打开一条隧道。

我也尝试过使用Popen(用参数和逗号分隔参数和Shell = False):

sys_command = ["ssh","-f","-T","user@external.server","-i","/home/user/.ssh/id_rsa","-p","22222","-L","3310:localhost:3306"]

prog = subprocess.Popen( sys_command, stdout=subprocess.PIPE , stderr=subprocess.PIPE , shell = False)

但我得到同样的错误。

但是,哦,出乎意料的是,如果我在那里制作一个红色的技巧,我会添加"睡眠"," 10"到最后:

sys_command = ["ssh","-f","-T","user@external.server","-i","/home/user/.ssh/id_rsa","-p","22222","-L","3310:localhost:3306","sleep","10"]

...我通过外人从其他服务器得到问候语! 以及,错误:

  

bind:无法分配请求的地址

因此,如果有人知道正确的方法,请使用经过测试的脚本回答,因为我在互联网上找到的许多解决方案都不能在我的环境中工作。

提前致谢。

0 个答案:

没有答案