假设我有fabfile.py
,如下所示:
def setup():
pwd = getpass('mysql password: ')
run('mysql -umoo -p%s something' % pwd)
这个输出是:
[host] run: mysql -umoo -pTheActualPassword
有没有办法让输出看起来像这样?
[host] run: mysql -umoo -p*******
注意:这不是一个mysql问题!
答案 0 :(得分:8)
您可以使用过滤器替换stdout(或任何iostream),而不是修改/重写Fabric。
这是一个覆盖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]]
答案 1 :(得分:1)
最好将密码放在[client]部分下的用户〜/ .my.cnf中。这样您就不必将密码放在python文件中。
[client]
password=TheActualPassword
答案 2 :(得分:1)
使用Fabric命令run
时,Fabric不知道您运行的命令是否包含纯文本密码。在不修改/覆盖Fabric源代码的情况下,我认为您不能获得所需的输出,而是显示正在运行的命令,但密码将替换为星号。
但是,您可以更改整个Fabric脚本或部分的Fabric输出级别,以便不显示正在运行的命令。虽然这会隐藏密码,但缺点是你根本看不到命令。
查看Managing Output上的Fabric文档。
答案 3 :(得分:0)
编写一个shell脚本,该脚本使用适当的密码调用相关命令,但不回显该密码。您可以让shell脚本从比.py文件更安全的位置查找密码。
然后让Fabric调用shell脚本。
这解决了Fabric无法显示密码和确保源代码中没有凭据的问题。
答案 4 :(得分:0)
from fabric.api import run, settings
with settings(prompts={'Enter password: ': mysql_password}):
run("mysql -u {} -p -e {}".format(mysql_user,mysql_query))
或如果没有提示可用:
from fabric.api import run, hide
with hide('output','running','warnings'):
run("mycommand --password {}".format(my_password))