Frage

Grüße.

Ich habe einen kleinen Python-Skript geschrieben, dass MySQL in einem Teilprozess aufruft. [Ja, ich weiß, dass der richtige Ansatz ist MySQLdb zu verwenden, aber es unter OS X Leopard Kompilieren ist ein Schmerz, und wahrscheinlich mehr schmerzhaft, wenn ich das Skript auf Computern verschiedener Architekturen. Verwenden wollte] Subprocess Technik funktioniert, vorausgesetzt, dass ich liefere das Kennwort in dem Befehl, der den Prozess beginnt; aber das bedeutet, dass andere Benutzer auf der Maschine das Passwort sehen können.

Der ursprüngliche Code schrieb ich kann hier .

unten Diese Variante ist sehr ähnlich, obwohl ich die Testroutine unterlassen, damit es kürzer:

#!/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

Ich bin misstrauisch, dass die MySQL-Kennwort-Eingabeaufforderung nicht wirklich auf stdout (oder stderr), obwohl ich weiß nicht, wie das sein könnte oder wenn es bedeutet, ich kann Fall es.

Ich habe versucht Ausgabe liest zuerst, bevor Sie ein Kennwort angeben, aber es hat nicht funktioniert. Ich habe auch versucht, das Passwort geben

Auch wenn ich das Passwort auf der Kommandozeile liefern (und damit keinen Code zwischen dem „Popen“ hat und „kommunizieren“ Funktionen) meine gewickelte Funktion funktioniert.


Zwei neue Gedanken, Monate laster:

  1. Mit pexpect würde mir ein Passwort liefern lassen. Es simuliert einen tty und bekommt alle Ausgaben, auch das, was umgeht stdout und stderr.

  2. Es gibt ein Projekt MySQL Connector / Python , in frühen Alpha genannt, die zur Verfügung stellen können eine reine python-Bibliothek MySQL für den Zugriff, ohne dass Sie jeden C-Code zu kompilieren.

War es hilfreich?

Lösung

Sie könnten einfach eine Datei my.cnf und zeigt auf, dass auf dem MySQL-Befehl bauen. Natürlich sollten Sie diese Datei mit Berechtigungen / acls schützen. Aber es soll nicht sein wirklich ein mehr / weniger sicher dann in Ihrem Python-Skript, das Passwort mit, oder die Config für Python-Skript.

Sie würden also so etwas wie tun

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

und Ihre Konfiguration würde wie folgt aussehen etwa

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

Andere Tipps

Die einzige sichere Methode ist eine MySQL-CNF-Datei als eine der anderen Plakate erwähnt zu verwenden. Sie können auch eine MYSQL_PWD env Variable übergeben, aber das ist unsicher auch: http://bitnami.org/stacks

Dies kann eine Windows / SQL-Server-Funktion sein, aber könnten Sie eine vertrauenswürdige Verbindung verwenden (das heißt Ihr O Login / Passwort verwenden, um den Zugriff auf DB)? Es kann ein OS X-Äquivalent für MySQL sein.

Oder Sie können einfach Ihre DB müssen eingerichtet, um die OS-Login und Passwort zu verwenden, so dass Sie brauchen, um es nicht in Ihrem Code zu halten.

Wie auch immer, nur eine Idee.

Versuchen Sie folgendes:

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

return stdout

Anruf kommunizieren () zu zwingen, was Sie gerade in den Puffer geschrieben zu senden. Außerdem ist es gut stdin zu schließen, wenn Sie fertig sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top