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

StackOverflow https://stackoverflow.com/questions/3654559

  •  01-10-2019
  •  | 
  •  

Вопрос

Скажем, у меня есть 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))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top