2017-10-04 5 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 

コマンドラインエラー:

パスワード自体に含めることができる場合

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

しかし、これは動作しません:あなたは例えば、シェルによって特別扱いされることから(例えば&など)シェルのメタ文字を保護するためにパスワードを引用する必要が3210

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

は、使用してみてください: '--password = '」+ mysql_pw + "」" +シングルをdb' '&'はbashによって解釈され、コマンドの前半部分を独自のプロセスとしてforkし、後半には失敗します。上記はパスワード文字列の一重引用符を追加します –

+0

また、IMHOはもっと –

+0

@MattClarkは大変意味がありますが、まだエラーが出ています: '' sfeafxegwa '' '、今回は余分な' ''非常に本当の@tobias_k - ありがとう! –

答えて

2

はすでにコメントで述べたように、shell=Trueを使用しないでください。 https://docs.python.org/3/library/subprocess.html#security-considerationsを参照してください。

シェルを分割する代わりに、引数のリストを直接Popenコンストラクタに渡します。ドキュメントの古いバージョンで説明shell=True

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 
    ) 

問題が優れている:https://docs.python.org/2/library/subprocess.html#frequently-used-arguments

+0

ありがとうございます。これはうまく機能し、ドキュメントに最もよく似合うソリューションです。 –

1

引用符。より良い代替手段が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) 
関連する問題