2017-08-17 26 views
2

私はPythonスクリプトをいくつか書いています。私はSSH Connectionを介して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

あなたがプロセスを殺すことができるようになります引数のリストを代わりに渡すこと

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

ノートsplit一部を(あなただけのハンドルを閉じos.popenclose以降で簡単にそれを行うことはできません)文字列のそれは速いです。&が汚いですが、一部のOSは文字列をPopenに渡すことをサポートしていません。適切な方法は["ssh","config","-L","3306:127.0.0.1:3306"]です。そのため、argsにスペースを入れて透過的に渡すことができます。

+0

ありがとう、私はそれを適切な方法に変更しましたが、まだ正しく動作していません。今度はデータベースサーバーに接続してDatabaseServer上でコマンドを実行しますが、sqlリクエストをローカルで実行するためにはssh接続をバッ​​クグラウンドで開く必要があります。 – Knoedelauflauf

+0

ですが、 'サブプロセス 'はそれを行います:バックグラウンドでプロセスを実行します。 –

+0

ああ私はそれを取得しません。データベースクエリを実行すると、データベースサーバのユーザ名が常に表示されます。 – Knoedelauflauf

関連する問題