擅长:python、mysql、java
<p>与其修改/重写Fabric,不如用过滤器替换stdout(或任何iostream)。在</p>
<p>下面是一个覆盖stdout以审查特定密码的示例。它从Fabric的<code>env.password</code>变量<a href="https://stackoverflow.com/questions/2339735/fabric-password">set by the ^{<cd2>} argument</a>获取密码。注意,可以对正则表达式执行相同的操作,这样就不必在过滤器中指定密码。在</p>
<p>我还应该指出,这并不是世界上最高效的代码,但是如果您使用的是fabric,那么您可能会将一些东西粘在一起,并且更关心可管理性而不是速度。在</p>
<pre><code>#!/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
</code></pre>
<p>运行时:</p>
^{2}$
<p>这将产生:</p>
<pre><code>Hello there
My password is [[TOP SECRET]]
</code></pre>