2017-10-04 107 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)