10

说我有一个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 问题!

4

5 回答 5

9

您可以用过滤器替换标准输出(或任何 iostream),而不是修改/覆盖 Fabric。

这是一个覆盖 stdout 以审查特定密码的示例。它从 Fabric 的env.password变量中获取密码,-I参数设置。请注意,您可以使用正则表达式执行相同的操作,这样您就不必在过滤器中指定密码。

我还应该提到,这不是世界上最高效的代码,但如果您使用的是结构,您可能会将一些东西粘合在一起,并且更关心可管理性而不是速度。

#!/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-07T04:39:20.393 回答
1

当您使用 Fabric 命令run时,Fabric 不知道您正在运行的命令是否包含纯文本密码。如果不修改/覆盖 Fabric 源代码,我认为您无法获得所需的输出,其中显示正在运行的命令,但密码被星号替换。

但是,您可以更改整个 Fabric 脚本或一部分的 Fabric 输出级别,以便不显示正在运行的命令。虽然这会隐藏密码,但缺点是您根本看不到该命令。

查看有关管理输出的 Fabric 文档。

于 2010-09-06T22:50:43.170 回答
1

最好将密码放在用户的 ~/.my.cnf 的 [client] 部分下。这样您就不必将密码放入 python 文件中。

[client]
password=TheActualPassword
于 2010-09-06T22:15:04.783 回答
0

编写一个 shell 脚本,使用适当的密码调用相关命令,但不回显该密码。您可以让 shell 脚本从比 .py 文件更安全的位置查找密码。

然后让织物调用 shell 脚本。

这既解决了结构不显示密码的问题,又解决了源代码中没有凭据的问题。

于 2012-08-28T14:32:38.427 回答
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))
于 2016-11-23T18:32:59.963 回答