2024-10-01 09:17:11 发布
网友
假设我有一个fabfile.py,看起来像这样:
fabfile.py
def setup(): pwd = getpass('mysql password: ') run('mysql -umoo -p%s something' % pwd)
其输出为:
有没有办法让输出看起来像这样?在
[host] run: mysql -umoo -p*******
注意:这不是一个mysql问题!在
使用Fabric命令run时,Fabric不知道您正在运行的命令是否包含纯文本密码。如果不修改/重写Fabric源代码,我认为您无法获得所需的输出,即显示正在运行的命令,但密码将替换为星号。在
run
但是,可以更改整个结构脚本或部分结构脚本的结构输出级别,以便不显示正在运行的命令。虽然这会隐藏密码,但缺点是您根本看不到命令。在
查看Managing Output上的Fabric文档。在
与其修改/重写Fabric,不如用过滤器替换stdout(或任何iostream)。在
下面是一个覆盖stdout以审查特定密码的示例。它从Fabric的env.password变量set by the ^{} argument获取密码。注意,可以对正则表达式执行相同的操作,这样就不必在过滤器中指定密码。在
env.password
我还应该指出,这并不是世界上最高效的代码,但是如果您使用的是fabric,那么您可能会将一些东西粘在一起,并且更关心可管理性而不是速度。在
#!/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
运行时:
这将产生:
Hello there My password is [[TOP SECRET]]
最好把密码放在用户的~/中。我的.cnf在[客户]部分。这样就不必在python文件中输入密码。在
[client] password=TheActualPassword
使用Fabric命令
run
时,Fabric不知道您正在运行的命令是否包含纯文本密码。如果不修改/重写Fabric源代码,我认为您无法获得所需的输出,即显示正在运行的命令,但密码将替换为星号。在但是,可以更改整个结构脚本或部分结构脚本的结构输出级别,以便不显示正在运行的命令。虽然这会隐藏密码,但缺点是您根本看不到命令。在
查看Managing Output上的Fabric文档。在
与其修改/重写Fabric,不如用过滤器替换stdout(或任何iostream)。在
下面是一个覆盖stdout以审查特定密码的示例。它从Fabric的} argument 获取密码。注意,可以对正则表达式执行相同的操作,这样就不必在过滤器中指定密码。在
env.password
变量set by the ^{我还应该指出,这并不是世界上最高效的代码,但是如果您使用的是fabric,那么您可能会将一些东西粘在一起,并且更关心可管理性而不是速度。在
运行时:
^{2}$这将产生:
最好把密码放在用户的~/中。我的.cnf在[客户]部分。这样就不必在python文件中输入密码。在
相关问题 更多 >
编程相关推荐