문제

인사말.

하위 프로세스에서 MySQL을 호출하는 작은 파이썬 스크립트를 작성했습니다. [예, 올바른 접근법은 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"함수 사이에 코드가 없으면 랩핑 된 기능이 작동합니다.


두 가지 새로운 생각, 몇 개월 레이스터 :

  1. 사용 pexpect 비밀번호를 제공하게 할 것입니다. 그것은 tty를 시뮬레이션하고 모든 출력을 얻습니다.

  2. 부르는 프로젝트가 있습니다 MySQL 커넥터/파이썬, 초기 알파에서는 C 코드를 컴파일하지 않고 MySQL에 액세스하기위한 순수한 Python 라이브러리를 제공 할 수 있습니다.

도움이 되었습니까?

해결책

단순히 my.cnf 파일을 빌드하고 mysql 명령에서이를 가리킬 수 있습니다. 분명히 허가/ACL로 해당 파일을 보호하고 싶을 것입니다. 그러나 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

다른 팁

유일한 안전한 방법은 다른 포스터 중 하나가 언급 한 것처럼 MySQL CNF 파일을 사용하는 것입니다. mysql_pwd env 변수를 전달할 수도 있지만 불안합니다. http://dev.mysql.com/doc/refman/en/password-security.html

또는 UNIX 소켓 파일을 사용하여 데이터베이스와 통신 할 수 있으며 약간의 조정으로 사용자 ID 수준에서 권한을 제어 할 수 있습니다.

더 나은 것은 Python과 MySQLDB가 OS X (및 Windows 및 Linux)를 선호하는 무료 Bitnami 스택 Djangostack을 사용할 수 있습니다. http://bitnami.org/stacks

이것은 Windows / SQL 서버 기능 일 수 있지만 신뢰할 수있는 연결을 사용할 수 있습니까 (즉, 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

방금 버퍼에 쓴 내용을 보내려면 Communice ()를 호출하십시오. 또한 완료되면 stdin을 닫는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top