質問

挨拶。

サブプロセスでMySQLを呼び出す小さなPythonスクリプトを作成しました。 [はい、MySQLdbを使用するのが正しいアプローチであることは知っていますが、OS X Leopardでコンパイルするのは苦痛であり、異なるアーキテクチャのコンピューターでスクリプトを使用したい場合は痛みを伴う可能性があります。]プロセスを開始するコマンドでパスワードを指定します。ただし、これは、マシン上の他のユーザーがパスワードを見ることができることを意味します。

私が書いた元のコードはこちら

以下のこのバリアントは非常に似ていますが、テストルーチンを省略して短くします:

#!/usr/bin/env python

from subprocess import Popen, PIPE

# Set the command you need to connect to your database
mysql_cmd_line = "/Applications/MAMP/Library/bin/mysql -u root -p"
mysql_password = "root"

def RunSqlCommand(sql_statement, database=None):

    """Pass in the SQL statement that you would like executed.
    Optionally, specify a database to operate on.  Returns the result."""

    command_list = mysql_cmd_line.split()
    if database:
        command_list.append(database)

    # Run mysql in a subprocess
    process = Popen(command_list, stdin=PIPE, stdout=PIPE,
                    stderr=PIPE, close_fds=True)

    #print "Asking for output"
    #needs_pw = process.stdout.readline()
    #print "Got: " + needs_pw

    # pass it in the password
    process.stdin.write(mysql_password + "\n")

    # pass it our commands, and get the results
    #(stdout, stderr) = process.communicate( mysql_password + "\n" + sql_statement)
    (stdout, stderr) = process.communicate( sql_statement )

    return stdout

MySQLのパスワードプロンプトが実際にはstdout(またはstderr)にないのではないかと疑っていますが、それがどのようになるか、またはトラップできるかどうかはわかりません。

パスワードを入力する前に、最初に出力を読み取ろうとしましたが、機能しませんでした。パスワードを渡そうとしました

繰り返しますが、コマンドラインでパスワードを指定すると(したがって、「Popen」関数と「communicate」関数の間にコードがない場合)、ラップされた関数は機能します。


2つの新しい考え、数か月:

  1. pexpect を使用すると、パスワードを入力できます。 ttyをシミュレートし、stdoutとstderrをバイパスする出力も含め、すべての出力を取得します。

  2. 初期アルファ版の MySQL Connector / Python というプロジェクトがあります。 MySQLにアクセスするための純粋なPythonライブラリ。Cコードをコンパイルする必要はありません。

役に立ちましたか?

解決

my.cnfファイルを作成し、mysqlコマンドでそれをポイントするだけです。明らかに、そのファイルをpermissions / aclsで保護する必要があります。ただし、Pythonスクリプトにパスワードを設定したり、Pythonスクリプトの構成を設定したりするよりも、安全性が高くなる/低くなるべきではありません。

だからあなたは次のようなことをするだろう

mysql_cmd_line = "/Applications/MAMP/Library/bin/mysql --defaults-file=credentials.cnf"

そして設定はこのようになります

[client]
host     = localhost
user     = root
password = password
socket   = /var/run/mysqld/mysqld.sock

他のヒント

唯一の安全な方法は、他の投稿者の言及の1つとしてMySQL cnfファイルを使用することです。 MYSQL_PWD env変数を渡すこともできますが、それも安全ではありません: http://dev.mysql.com/doc/refman/5.0/en/password-security.html

別の方法として、Unixソケットファイルを使用してデータベースと通信し、少し調整することで、ユーザーIDレベルで権限を制御できます。

さらに良いのは、OS X(およびWindowsとLinux)用にプリコンパイルされたPythonとMySQLDBを備えた無料のBitNamiスタックDjangoStackを使用できることです http://bitnami.org/stacks

これはWindows / SQL Serverの機能かもしれませんが、トラステッド接続を使用できますか(つまり、OSログイン/パスワードを使用してDBにアクセスできますか)? MySQLに相当するOS Xがあるかもしれません。

または、OSのログインとパスワードを使用するようにDBをセットアップするだけで、コード内に保持する必要がなくなります。

とにかく、ただのアイデア。

これを試してください:

process.stdin.write(mysql_password + "\n")
process.communicate()
(stdout, stderr) = process.communicate( sql_statement )
process.stdin.close()

return stdout

communicate()を呼び出して、バッファに書き込んだ内容を強制的に送信します。また、完了したらstdinを閉じることをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top