2017-08-17 71 views
2

我寫了一些python腳本,我想通過SSH連接隧道我的MySQL服務器並執行一些SQL請求。Python ssh與子流程中的隧道

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

我還沒有測試過這個,但是,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"],這樣您就可以透明地傳遞帶有空格的參數。

+0

謝謝你,我已經改變了正確的方式,它仍然無法正常工作。現在它連接到數據庫服務器並執行DatabaseServer上的命令,但我需要它運行SQL請求本地,SSH連接應該只在後臺打開。 – Knoedelauflauf

+0

但是'subprocess'做到了這一點:它在後臺運行進程。 –

+0

哦,我不明白。它總是在執行數據庫查詢時顯示數據庫服務器的用戶名。 – Knoedelauflauf