打印命令时如何在结构中隐藏密码?

时间:2010-09-06 22:12:43

标签: python passwords fabric

假设我有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问题!

5 个答案:

答案 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))