当命令被打印出来时,如何在fabric中隐藏密码?

2024-10-01 09:17:11 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个fabfile.py,看起来像这样:

def setup():                                
    pwd = getpass('mysql password: ')
    run('mysql -umoo -p%s something' % pwd)

其输出为:

^{pr2}$

有没有办法让输出看起来像这样?在

[host] run: mysql -umoo -p*******

注意:这不是一个mysql问题!在


Tags: runpyhostdefsetuppwdmysqlpassword
3条回答

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

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

查看Managing Output上的Fabric文档。在

与其修改/重写Fabric,不如用过滤器替换stdout(或任何iostream)。在

下面是一个覆盖stdout以审查特定密码的示例。它从Fabric的env.password变量set by the ^{} argument获取密码。注意,可以对正则表达式执行相同的操作,这样就不必在过滤器中指定密码。在

我还应该指出,这并不是世界上最高效的代码,但是如果您使用的是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 

运行时:

^{2}$

这将产生:

Hello there
My password is [[TOP SECRET]]

最好把密码放在用户的~/中。我的.cnf在[客户]部分。这样就不必在python文件中输入密码。在

[client]
password=TheActualPassword

相关问题 更多 >