2017-10-04 10 views
2

Je suis en train d'exécuter une commande à partir d'un fichier python:mot de passe est utilisé comme commande

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

Mais le --password= et même -p continue à me pendre sur ma chaîne de mot de passe

Le mot de passe est similaire à la structure suivante:

[email protected]&sfeafxegwa 

l'erreur de ligne de commande:

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

Essayez d'utiliser: '--password = ' » + mysql_pw + " »" + db' Le single '&' est interprété par bash, et en forçant la première moitié de la commande en tant que son propre processus, puis en échouant sur la seconde moitié.Le ci-dessus va ajouter des guillemets simples autour de la chaîne de mot de passe .. –

+0

Aussi, à mon humble avis cela serait beaucoup plus lisible à l'aide de chaînes de format –

+0

@MattClark qui a beaucoup de sens, mais je reçois toujours une erreur: ''sfeafxegwa' ' ', cette fois avec le supplément' '' Très très vrai @tobias_k - merci! –

Répondre

2

Comme déjà mentionné dans les commentaires, ne pas utiliser shell=True. Voir https://docs.python.org/3/library/subprocess.html#security-considerations.

Transmettez la liste des arguments directement au constructeur Popen, au lieu de laisser le shell effectuer le fractionnement.

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 
    ) 

Le problème avec shell=True est mieux expliqué dans l'ancienne version de la documentation: https://docs.python.org/2/library/subprocess.html#frequently-used-arguments

+0

Merci, c'est la solution qui a fonctionné et qui semble s'harmoniser le mieux avec la documentation. –

1

Vous devez citer le mot de passe pour protéger métacaractères (tels que &) d'être traités spécialement par le shell, par exemple:

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

Cependant, cela ne fonctionnera pas si le mot de passe lui-même peut contenir citations Une meilleure solution serait de passer la liste des arguments à subprocess et faire la redirection vous:

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)