1

我正在尝试编写一个 python 脚本来恢复我们的数据库。我们将所有表(单独)存储在存储库中。由于键入“source table1.sql, source table2.sql,..”会很麻烦,我编写了一个脚本来自动执行此操作。

我找到了使用 Popen 的解决方案。

process = Popen('mysql %s -u%s -p%s' % (db, "root", ""), stdout=PIPE, stdin=PIPE, shell=True) output = process.communicate('source' + file)[0]

该方法似乎工作得很好,但是,对于每个表,它都会提示我输入密码。如何绕过它以使其仅提示输入一次密码或让子进程从配置文件中读取密码?

有一个更好的方法吗?我尝试使用 Windows 批处理脚本来执行此操作,但正如您所料,这比使用 python 灵活得多(例如)

4

3 回答 3

3

由于显然您的密码为空,请删除 -p 选项, -p 没有密码会使 mysql 提示

from subprocess import Popen, PIPE

process = Popen('mysql %s -u%s' % (db, "root"), stdout=PIPE, stdin=PIPE, shell=True)
output = process.communicate('source' + file)[0]
于 2012-07-03T19:58:34.583 回答
2

为了防止将密码暴露给有权查看正在运行的进程的任何人,最好将密码放在配置文件中,并从命令行调用:

配置文件:

[client]
host=host_name
user=user_name
password=your_pass

然后命令行:

mysql --defaults-extra-file=your_configfilename

于 2012-07-03T08:01:55.447 回答
-1

好吧,你可以在从文件中读取它之后在命令行中传递它

with open('secret_password.txt', 'r') as f:
    password = f.read()
process = Popen('mysql %s -u%s -p%s' % (db, "root", password), stdout=PIPE, stdin=PIPE, 

否则,您可以调查 pexpect,它可以让您与流程进行交互。从配置文件(如 ConfigParser)中读取或简单地将其设置为 python 模块并将密码作为变量导入的其他替代方法。

于 2012-07-03T07:32:08.950 回答