Python ssh与子进程中的隧道

时间:2017-08-17 16:41:32

标签: python mysql ssh

我写了一些python脚本,我想通过SSH连接隧道我的MySQL服务器并执行一些SQL请求。

import MySQLdb  
import os

handle = os.popen('ssh config -L 3306:127.0.0.1:3306')
db = MySQLdb.connect(host="127.0.0.1",
                     user="Username",
                     passwd="Secret",
                     db="dbName")
cur = db.cursor()
cur.execute("SELECT * FROM tablename")
for row in cur.fetchall():
      print row[1]
db.close()
handle.close()

连接工作正常,但在执行后没有关闭脚本(子进程),而且它在每个打印行的前面添加了一些空格。

感谢您的阅读并提前感谢您。

1 个答案:

答案 0 :(得分:1)

我还没有测试过这个,但os.popen已经过时了。请改用subprocess模块。

  

从2.6版开始不推荐使用:此功能已过时。使用子进程模块。请特别检查“使用子过程模块替换旧函数”部分。

使用subprocess,您将能够终止该过程(由于os.popen仅关闭句柄,因此close无法轻松完成此操作。

handle = subprocess.Popen('ssh config -L 3306:127.0.0.1:3306'.split())
...
handle.kill()

注意split部分传递args列表而不是字符串。这很快&脏,但有些操作系统不支持将字符串传递给Popen。正确的方法是:["ssh","config","-L","3306:127.0.0.1:3306"]所以你可以透明地传递带有空格的args。