2010-09-06 7 views

Antwort

8

Anstatt Fabric zu ändern/zu überschreiben, können Sie stdout (oder einen beliebigen Iostream) durch einen Filter ersetzen.

Hier ist ein Beispiel für das Überschreiben von stdout, um ein bestimmtes Passwort zu zensieren. Es erhält das Passwort von Fabric's env.password Variable, set by the -I argument. Beachten Sie, dass Sie dasselbe mit einem regulären Ausdruck tun könnten, sodass Sie das Kennwort nicht im Filter angeben müssen.

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

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

fab -I can_you_see_the_password 
Initial value for env.password: 

diese produzieren:

Hello there 
My password is [[TOP SECRET]] 
+0

Das ist eine ziemlich gute Idee! –

+0

Ich stelle mir vor, dass, wenn das OP sein Passwort in seinen Terminalprotokollen nicht will, er wahrscheinlich nicht möchte, dass sein Passwort in einer '.py' Datei herumsteht. –

+1

er könnte auch eine Regex auf die Passwortabfrage bis zum Ende der Zeile verwenden .. hast du eine bessere Idee oder einfach nur nitpick? :) – synthesizerpatel

1

Es kann besser sein, das Passwort in die ~/.my.cnf des Benutzers im Abschnitt [client] zu setzen. Auf diese Weise müssen Sie das Passwort nicht in die Python-Datei eingeben.

[client] 
password=TheActualPassword 
+0

geklärt ich die Frage. Ich verwende nur mysql als Beispiel, da der Befehl, den ich verwende, keine alternative Option zur Befehlszeile hat. –

1

Wenn Sie den Befehl Stoff verwenden run, ist Stoff nicht bekannt, ob der Befehl enthält ein Klartext-Passwort oder nicht ausgeführt werden. Ohne den Fabric-Quellcode zu ändern/zu überschreiben, glaube ich nicht, dass Sie die gewünschte Ausgabe bekommen können, wo der Befehl ausgeführt wird, aber das Passwort wird durch Sternchen ersetzt.

Sie können jedoch die Fabric-Ausgabestufe entweder für das gesamte Fabric-Skript oder einen Teil ändern, sodass der ausgeführte Befehl nicht angezeigt wird. Während dies das Passwort verbergen wird, ist der Nachteil, dass Sie den Befehl überhaupt nicht sehen würden.

Werfen Sie einen Blick auf die Fabric-Dokumentation unter Managing Output.

0

einen Shell-Skript schreiben, das den Befehl in Frage mit dem entsprechenden Passwort aufruft, aber ohne dass das Kennwort Echo. Sie können das Shell-Skript das Kennwort von einem sicheren Ort als von Ihren .py-Dateien suchen lassen.

Dann rufen Sie Fabric das Shell-Skript stattdessen.

Dies löst sowohl das Problem, dass Fabric das Kennwort nicht anzeigt, als auch dass Sie keine Anmeldeinformationen in Ihrem Quellcode haben.

0
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 Aufforderung zur Verfügung:

from fabric.api import run, hide 
with hide('output','running','warnings'): 
    run("mycommand --password {}".format(my_password)) 
Verwandte Themen