【问题标题】:Python ssh with tunnel in subprocess子进程中带有隧道的Python ssh
【发布时间】:2017-08-18 00:45:11
【问题描述】:

我正在编写一些 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()

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

感谢阅读并提前感谢您。

【问题讨论】:

    标签: python mysql ssh


    【解决方案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 部分传递参数列表而不是字符串。这既快又脏,但有些操作系统不支持将字符串传递给Popen。正确的方法是:["ssh","config","-L","3306:127.0.0.1:3306"] 这样您就可以透明地传递带有空格的参数。

    【讨论】:

    • 谢谢,我已将其更改为正确的方式,但仍然无法正常工作。现在它连接到数据库服务器并在数据库服务器上执行命令,但我需要它在本地运行 sql 请求,ssh 连接应该只在后台打开。
    • subprocess 这样做:它在后台运行进程。
    • 哦,我不明白。它在执行数据库查询时总是显示数据库服务器的用户名。
    • 我发现了问题,我在主进程中使用睡眠,这导致了问题......希望我能找到一些新的方法让脚本空闲(我不等待任何输入只是减慢脚本)
    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 2012-10-05
    • 2022-01-27
    • 1970-01-01
    • 2013-08-12
    • 2021-11-10
    相关资源
    最近更新 更多