2017-10-04 74 views
2

我试图从Python文件运行命令:密码被用作命令

p = subprocess.Popen("mysqldump -h" + hostname + " -u" + mysql_user + " --password=" + mysql_pw + " " + db + " > dump_" + hostname + "_" + timestamp + ".sql", shell=True) 

--password=甚至-p不断得到绞死了我的密码字符串

密码与此类似结构:

[email protected]&sfeafxegwa 

命令行错误:

'sfeafxegwa' is not recognized as an internal or external command, 
operable program or batch file. 
+4

使用try:

with open('dump_{}_{}.sql'.format(hostname, timestamp), 'w') as dump_file: p = subprocess.Popen( [ 'mysqldump', '-h', hostname, '-u', mysql_user, '--password={}'.format(mysql_pw), db ], stdout=dump_file ) 

shell=True的问题是,最好在旧版本的文档的解释'&'被bash解释,并将命令的前半部分作为自己的进程分叉,然后在下半部分失败。上面提到的将会在密码字符串周围添加单引号。 –

+0

此外,恕我直言,这将是更多使用格式字符串可读 –

+0

@MattClark,这很有道理,但我仍然收到错误:''sfeafxegwa'' ',这次用额外的'''非常非常真实@tobias_k - 谢谢! –

回答

1

您需要引用密码保护壳元字符(如&)从被shell特殊处理,如:

cmd = "mysqldump -h {} -u {} -p'{}' {} > dump_{}_{}.sql".format(
    hostname, mysql_user, mysql_pw, db, hostname, timestamp) 
subprocess.run(cmd, shell=True, check=True) 

然而,这是不行的,如果密码本身可以包含引号。一个更好的替代方法是参数的列表自己传递给subprocess并执行重定向:

args = ["mysqldump", "-h", hostname, "-u", mysql_user, "-p{}".format(mysql_pw), db] 
outfile = "dump_{}_{}.sql".format(hostname, timestamp) 

with open(outfile, "w") as f: 
    subprocess.run(args, check=True, stdout=f)