Как скрыть пароль в ткани, когда команда распечатана? - PullRequest
9 голосов
/ 07 сентября 2010

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

8 голосов
/ 07 сентября 2010

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

Вот пример переопределения стандартного вывода для цензуры определенного пароля.Он получает пароль из переменной env.password Fabric, установленной аргументом -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]]
1 голос
/ 07 сентября 2010

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

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

Посмотрите документацию Fabric на Управление выводом .

1 голос
/ 07 сентября 2010

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

[client]
password=TheActualPassword
0 голосов
/ 23 ноября 2016
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))
0 голосов
/ 28 августа 2012

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

Тогда вместо этого вам придется вызывать скрипт оболочки из сценария.

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

...