Frage

Sprich ich habe eine fabfile.py dass sieht wie folgt aus:

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

Der Ausgang dieses ist:

[host] run: mysql -umoo -pTheActualPassword

Gibt es eine Möglichkeit, die Ausgabe wie folgt aussehen zu machen?

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

Hinweis: Dies ist keine mysql Frage

War es hilfreich?

Lösung

Anstatt Ändern / Überschreiben Stoff, könnten Sie stdout ersetzen (oder jede Iostream) mit einem Filter.

Hier ist ein Beispiel von stdout zwingenden ein bestimmten Passwort zu zensieren. Es wird das Passwort aus Stoffe des env.password Variable, Satz von dem -I Argumente . Beachten Sie, dass Sie die gleiche Sache mit einem regulären Ausdruck tun konnten, so dass Sie das Passwort nicht in den Filter geben würden.

Ich sollte auch erwähnen, ist dies nicht die effizienteste Code in der Welt, aber wenn Sie Stoff verwenden sind Sie wahrscheinlich ein paar Dinge zusammen und kümmern sich mehr um die Verwaltbarkeit als Geschwindigkeit Kleben.

#!/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 

Wenn er ausgeführt wird:

fab -I can_you_see_the_password
Initial value for env.password:

Dies erzeugt:

Hello there
My password is [[TOP SECRET]]

Andere Tipps

Es kann besser sein, um das Passwort zu setzen in dem Benutzer ~ / .my.cnf unter dem [client] -Abschnitt. Auf diese Weise müssen Sie das Passwort nicht in der Python-Datei setzen.

[client]
password=TheActualPassword

Wenn Sie den Stoff Befehl run verwenden, ist Stoff nicht bekannt, ob der Befehl, den Sie ausgeführt werden, enthält ein Klartext-Passwort oder nicht. Ohne Änderung / Überschreiben der Quellcode Stoff, ich glaube nicht, dass Sie die Ausgabe bekommen, dass Sie möchten, wo der Befehl das ausgeführt wird gezeigt, aber das Passwort durch Sternchen ersetzt wird.

Sie können jedoch ändern, um den Gewebe-Ausgangspegel, entweder für den gesamten Stoff Skript oder einen Teil, so dass der Befehl des ausgeführt wird nicht angezeigt. Während dies das Passwort verbergen, der Nachteil ist, dass Sie nicht den Befehl überhaupt nicht sehen würden.

Werfen Sie einen Blick in die Dokumentation Stoff auf Verwalten Ausgabe .

Schreiben Sie einen Shell-Skript, das den Befehl in Frage mit dem entsprechenden Passwort aufruft, aber ohne das Passwort Echo. Sie können das Shell-Skript das Passwort von einem sichereren Ort Nachschlag haben als von Ihrem Py-Dateien.

Dann Stoff Aufruf stattdessen den Shell-Skript hat.

Das löst sowohl das Problem, Gewebe das Passwort nicht angezeigt werden und sicherstellen, dass Sie nicht über Anmeldeinformationen im Quellcode.

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

oder, wenn keine Eingabeaufforderung zur Verfügung:

from fabric.api import run, hide
with hide('output','running','warnings'):
   run("mycommand --password {}".format(my_password))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top