而不是修改/覆蓋結構,你可以用過濾器替換stdout(或任何iostream)。
下面是覆蓋stdout來檢查特定密碼的示例。它從Fabric的env.password
變量獲得密碼,set by the -I
argument。請注意,您可以使用正則表達式執行相同的操作,以便您不必在過濾器中指定密碼。我還應該提到,這不是世界上最高效的代碼,但如果你使用結構,你可能會把幾件事粘在一起,關心可管理性而不是速度。
#!/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
當運行:
fab -I can_you_see_the_password
Initial value for env.password:
這將產生:
Hello there
My password is [[TOP SECRET]]
這是一個不錯的主意! – 2010-09-08 01:18:14
我想如果OP不想在他的終端日誌中輸入他的密碼,那麼他可能不希望他的密碼在'.py'文件中。 – 2012-05-19 00:28:56
他也可以在密碼提示符的末尾使用正則表達式。你有更好的主意還是喜歡挑剔? :) – synthesizerpatel 2012-05-21 09:49:54