gpt4 book ai didi

python - 为封装的 MySQL 提供密码

转载 作者:行者123 更新时间:2023-11-28 19:52:11 25 4
gpt4 key购买 nike

问候。

我写了一个在子进程中调用 MySQL 的小 python 脚本。 [是的,我知道正确的方法是使用 MySQLdb,但在 OS X Leopard 下编译它很痛苦,如果我想在不同体系结构的计算机上使用脚本,可能会更痛苦。]子进程技术有效,前提是我在启动进程的命令中提供了密码;但是,这意味着机器上的其他用户可以看到密码。

我写的原代码可以看here .

下面的这个变体非常相似,尽管我将省略测试例程以使其更短:

#!/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 密码提示实际上并不在标准输出(或标准错误)上,尽管我不知道那是怎么回事,或者这是否意味着我可以捕获它。

我确实尝试先读取输出,然后再提供密码,但没有成功。我也试过传递密码

同样,如果我在命令行上提供密码(因此在“Popen”和“communicate”函数之间没有代码),我的包装函数就可以工作。


几个月后的两个新想法:

  1. 使用 pexpect让我提供一个密码。它模拟 tty 并获取所有输出,甚至是绕过 stdout 和 stderr 的输出。

  2. 有一个名为 MySQL Connector/Python 的项目,在早期的 alpha 中,这将允许提供一个纯 python 库来访问 MySQL,而无需您编译任何 C 代码。

最佳答案

您可以简单地构建一个 my.cnf 文件并在 mysql 命令中指向该文件。显然,您需要使用权限/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

关于python - 为封装的 MySQL 提供密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/619804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com