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

Python 打印命令时,如何在结构中隐藏密码?,python,passwords,fabric,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*******

假设我有一个像这样的
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问题

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

[client]
password=TheActualPassword

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

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


请查看上的结构文档。

您可以使用过滤器替换stdout(或任何iostream),而不是修改/覆盖结构

下面是一个覆盖stdout以检查特定密码的示例。它从结构的
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 
运行时:

fab -I can_you_see_the_password
Initial value for env.password:
这将产生:

Hello there
My password is [[TOP SECRET]]

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

然后让fabric调用shell脚本

这解决了fabric不显示密码和确保源代码中没有凭据的问题

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

我澄清了这个问题。我只是以mysql为例,因为我使用的命令没有命令行的备用选项。我想,如果OP不希望他的密码出现在终端日志中,那么他可能不希望他的密码出现在
.py
文件中。他也可以在密码提示符的最后使用regex。。你有更好的主意还是喜欢吹毛求疵?:)在Fabric中,您可以使用
env.password
获取密码,因此在.py文件中不需要它,但它似乎只在任务中设置,而不是在全局环境中设置。我还发现我还必须在StreamFilter中实现
flush
,以便在fabric查询某些其他流属性时不会出错。