Question

Dire que j'ai un fabfile.py qui ressemble à ceci:

def setup():                                
    pwd = getpass('mysql password: ')
    run('mysql -umoo -p%s something' % pwd)

La sortie de c'est:

[host] run: mysql -umoo -pTheActualPassword

Y at-il un moyen de rendre l'apparence de sortie comme ça?

[host] run: mysql -umoo -p*******

Remarque: Ce n'est pas une question de mysql

Était-ce utile?

La solution

Plutôt que de modifier / remplaçant tissu, on pouvait remplacer la sortie standard (ou tout iostream) avec un filtre.

Voici un exemple de stdout remplaçant de censurer un mot de passe spécifique. Il obtient le mot de passe de la variable env.password de tissu, par l'argument -I . Notez que vous pouvez faire la même chose avec une expression régulière, de sorte que vous ne devez spécifier le mot de passe dans le filtre.

Je dois aussi mentionner, ce n'est pas le code le plus efficace dans le monde, mais si vous utilisez tissu que vous êtes probablement coller une couple de choses ensemble et se soucient plus de maniabilité que la vitesse.

#!/usr/bin/python

import sys
import string
from fabric.api import *
from fabric.tasks import *
from fabric.contrib import *

class StreamFilter(object):

    def __init__(self, filter, stream):
        self.stream = stream
        self.filter = filter

    def write(self,data):
        data = data.replace(self.filter, '[[TOP SECRET]]')
        self.stream.write(data)
        self.stream.flush()

    def flush(self):
        self.stream.flush()

@task
def can_you_see_the_password():
    sys.stdout = StreamFilter(env.password, sys.stdout)
    print 'Hello there'
    print 'My password is %s' % env.password 

Lors de l'exécution:

fab -I can_you_see_the_password
Initial value for env.password:

produira:

Hello there
My password is [[TOP SECRET]]

Autres conseils

Il peut être préférable de mettre le mot de passe dans ~ / .my.cnf dans la section [client] de l'utilisateur. De cette façon, vous n'avez pas de mettre le mot de passe dans le fichier python.

[client]
password=TheActualPassword

Lorsque vous utilisez la commande Tissu run, Tissu ne sait pas si la commande ou non que vous utilisez contient un mot de passe en texte brut ou non. Sans modifier / remplaçant le code source de tissu, je ne pense pas que vous pouvez obtenir la sortie que vous voulez où la commande en cours d'exécution est affiché mais le mot de passe est remplacé par des astérisques.

Vous pourriez toutefois modifier le niveau de sortie de tissu, soit pour l'ensemble du tissu de script ou une partie, de sorte que la commande en cours d'exécution n'apparaît pas. Bien que cela cachera le mot de passe, l'inconvénient est que vous ne verriez pas la commande du tout.

Jetez un oeil à la documentation sur tissu Gestion de sortie .

Ecrire un script shell qui appelle la commande en question avec le mot de passe approprié, mais sans écho ce mot de passe. Vous pouvez avoir le script shell rechercher le mot de passe à partir d'un endroit plus sûr que de vos fichiers .py.

Ensuite, ont appel tissu à la place le script shell.

Cela résout la fois le problème d'avoir le tissu non afficher le mot de passe et vous assurant de ne pas disposer d'informations dans votre code source.

from fabric.api import run, settings
with settings(prompts={'Enter password: ': mysql_password}):
    run("mysql -u {} -p -e {}".format(mysql_user,mysql_query))

ou si aucune invite disponible:

from fabric.api import run, hide
with hide('output','running','warnings'):
   run("mycommand --password {}".format(my_password))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top