我正在尝试编写一个用于恢复数据库的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(例如)更不灵活
答案 0 :(得分:3)
由于显然你有一个空密码,删除-p选项,-p没有密码make 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]
答案 1 :(得分:2)
为了防止将密码泄露给有权查看正在运行的进程的任何人,最好将密码放在配置文件中,并从命令行调用:
配置文件:
[client]
host=host_name
user=user_name
password=your_pass
然后是命令行:
mysql --defaults-extra-file = your_configfilename
答案 2 :(得分:-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模块并将密码作为变量导入的其他替代方法。