Pregunta

decir que tengo un fabfile.py que es similar al siguiente:

def setup():                                
    pwd = getpass('mysql password: ')
    run('mysql -umoo -p%s something' % pwd)

La salida de este es:

[host] run: mysql -umoo -pTheActualPassword

¿Hay una manera de hacer que el aspecto de salida así?

[host] run: mysql -umoo -p*******

Nota: Esta no es una cuestión de MySQL

¿Fue útil?

Solución

En lugar de modificar / anular Tela, que podría sustituir a la salida estándar (o cualquier iostream) con un filtro.

Este es un ejemplo de anular la salida estándar de censurar una contraseña específica. Se pone la contraseña de la variable env.password de Tela, por el argumento -I . Tenga en cuenta que usted podría hacer lo mismo con una expresión regular, de modo que usted no tiene que especificar la contraseña en el filtro.

También debería mencionar, este no es el código más eficiente del mundo, pero si usted está utilizando la tela es muy probable pegado un par de cosas juntos y se preocupan más por la manejabilidad que la velocidad.

#!/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 

Cuando ejecute:

fab -I can_you_see_the_password
Initial value for env.password:

esto producirá:

Hello there
My password is [[TOP SECRET]]

Otros consejos

Puede que sea mejor para poner la contraseña en la sección del usuario ~ / .my.cnf en [cliente]. De esta manera usted no tiene que poner la contraseña en el archivo de pitón.

[client]
password=TheActualPassword

Cuando se utiliza el comando run tela, la tela no tiene conocimiento de si el comando se ejecuta contiene una contraseña en texto plano o no. Sin modificar / anular el código fuente de la tela, no creo que pueda obtener el resultado que desea, donde se muestra el comando que se está ejecutando pero la contraseña es reemplazada por asteriscos.

Sin embargo, podría cambiar el nivel de salida de la tela, ya sea para todo el guión de tela o una parte, de modo que no se visualiza el comando que se ejecuta. Aunque esto va a ocultar la contraseña, el inconveniente es que no verá el comando en absoluto.

Tome un vistazo a la documentación sobre Tela Gestión de la salida .

Escribir un script de shell que invoca el comando en cuestión con la contraseña adecuada, pero sin reflejar esa contraseña. Usted puede tener la secuencia de comandos shell lookup la contraseña desde un lugar más seguro que el de sus archivos .py.

A continuación, tiene llamada tela de la secuencia de comandos shell en su lugar.

Esto resuelve tanto el problema de tener tela no muestra la contraseña y asegurarse de que no tiene las credenciales en su código fuente.

from fabric.api import run, settings
with settings(prompts={'Enter password: ': mysql_password}):
    run("mysql -u {} -p -e {}".format(mysql_user,mysql_query))

o si no hay pronta disponibles:

from fabric.api import run, hide
with hide('output','running','warnings'):
   run("mycommand --password {}".format(my_password))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top