Как скрыть пароль в ткани при выводе команды?

Скажем, у меня есть 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!


person gak    schedule 06.09.2010    source источник


Ответы (5)


Вместо того, чтобы изменять/переопределять Fabric, вы можете заменить stdout (или любой iostream) фильтром.

Вот пример переопределения стандартного вывода для цензуры определенного пароля. Он получает пароль из переменной Fabric 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]]
person synthesizerpatel    schedule 07.09.2010
comment
Я предполагаю, что если ОП не хочет, чтобы его пароль был в журналах его терминала, то он, вероятно, не хочет, чтобы его пароль хранился в файле .py. - person Chris W.; 19.05.2012
comment
он также мог бы использовать регулярное выражение для запроса пароля до конца строки ... у вас есть идея получше или вы просто хотите придраться? :) - person synthesizerpatel; 21.05.2012
comment
В Fabric вы можете получить пароль с помощью env.password, поэтому он вам не нужен в файле .py, но, похоже, он установлен только в задаче, а не в глобальной среде. Также я обнаружил, что мне нужно также реализовать flush в StreamFilter. - person Mark Butler; 21.01.2016
comment
Чтобы иметь возможность использовать подсказки ввода оболочки ткани (например, когда не было указано имя хоста), мне пришлось добавить в класс метод def __getattr__(self, attr_name): return getattr(self.stream, attr_name), чтобы не столкнуться с ошибками, когда ткань запрашивала некоторые другие свойства потока. - person Dirk; 08.02.2017

Может быть лучше поместить пароль в ~/.my.cnf пользователя в разделе [client]. Таким образом, вам не нужно указывать пароль в файле python.

[client]
password=TheActualPassword
person Rob Olmos    schedule 06.09.2010
comment
Я уточнил вопрос. Я использую mysql только в качестве примера, так как команда, которую я использую, не имеет альтернативы командной строке. - person gak; 07.09.2010

Когда вы используете команду Fabric run, Fabric не знает, содержит ли выполняемая вами команда текстовый пароль или нет. Без изменения/переопределения исходного кода Fabric я не думаю, что вы сможете получить желаемый результат, когда отображается выполняемая команда, но пароль заменяется звездочками.

Однако вы можете изменить уровень вывода Fabric либо для всего скрипта Fabric, либо для его части, чтобы выполняемая команда не отображалась. Хотя это скроет пароль, недостатком является то, что вы вообще не увидите команду.

Ознакомьтесь с документацией по Fabric в разделе Управление выводом< /а>.

person Matthew Rankin    schedule 06.09.2010

Напишите сценарий оболочки, который вызывает рассматриваемую команду с соответствующим паролем, но без повторения этого пароля. Вы можете заставить сценарий оболочки искать пароль из более безопасного места, чем из ваших файлов .py.

Затем попросите ткань вызвать сценарий оболочки.

Это решает как проблему отсутствия отображения пароля тканью, так и отсутствие учетных данных в исходном коде.

person numbsafari    schedule 28.08.2012

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))
person James Soubry    schedule 23.11.2016