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查询某些其他流属性时不会出错。