Как скрыть пароль в ткани, когда команда распечатана?
Вопрос
Скажем, у меня есть 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!
Решение
Вместо того, чтобы модифицировать / переопределить ткань, вы можете заменить stdout (или любой iostream) с фильтром.
Вот пример переопределения Stdout для цензура определенного пароля. Получает пароль из ткани 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]]
Другие советы
Может быть лучше поставить пароль в пользователя ~ / .my.cnf под раздел [Client]. Таким образом, вам не нужно ставить пароль в файл Python.
[client]
password=TheActualPassword
Когда вы используете команду ткани run
, Ткань не знает о том, находится ли команда, которую вы используете, содержит пароль для простого текста или нет. Не модифицируя / переопределение исходного кода ткани, я не думаю, что вы можете получить вывод, который вы хотите, где отображается команда запуска, но пароль заменен звездочками.
Однако вы можете изменить уровень выходной ткани, либо для всего сценария ткани или части, чтобы запущенная команда не отображается. Хотя это будет скрывать пароль, недостаток в том, что вы вообще не увидите команду.
Посмотрите на тканевую документацию на Управление выходом.
Напишите скрипт оболочки, который вызывает заданную команду с соответствующим паролем, но без эхипона о том, что пароль. Вы можете иметь сценарий Shell найдите пароль из более безопасного местоположения, чем из ваших файлов .py.
Затем у ткани вызовите сценарий оболочки.
Это решает обе проблемы с использованием ткани, не отображаю пароль и убедившись, что у вас нет учетных данных в вашем исходном коде.
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))