10

私が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の質問ではありません!

4

5 に答える 5

9

Fabricを変更/オーバーライドするのではなく、stdout(または任意のiostream)をフィルターに置き換えることができます。

これは、特定のパスワードを検閲するためにstdoutをオーバーライドする例です。引数で設定されたenv.passwordFabricの変数からパスワードを取得します。フィルタでパスワードを指定する必要がないように、正規表現でも同じことができることに注意してください。-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]]
于 2010-09-07T04:39:20.393 に答える
1

[client]セクションの下のユーザーの〜/.my.cnfにパスワードを入力する方がよい場合があります。このようにして、Pythonファイルにパスワードを入力する必要はありません。

[client]
password=TheActualPassword
于 2010-09-06T22:15:04.783 に答える
1

Fabricコマンドを使用するとrun、Fabricは、実行しているコマンドにプレーンテキストのパスワードが含まれているかどうかを認識しません。ファブリックのソースコードを変更/オーバーライドしないと、実行中のコマンドが表示されている場所で目的の出力を取得できないと思いますが、パスワードはアスタリスクに置き換えられています。

ただし、実行中のコマンドが表示されないように、Fabricスクリプト全体または一部のFabric出力レベルを変更することはできます。これによりパスワードが非表示になりますが、欠点はコマンドがまったく表示されないことです。

出力の管理に関するFabricのドキュメントを参照してください。

于 2010-09-06T22:50:43.170 に答える
0

適切なパスワードを使用して、そのパスワードをエコーせずに、問題のコマンドを呼び出すシェルスクリプトを記述します。シェルスクリプトで、.pyファイルよりも安全な場所からパスワードを検索することができます。

次に、代わりにファブリックにシェルスクリプトを呼び出させます。

これにより、ファブリックにパスワードが表示されないという問題と、ソースコードにクレデンシャルが含まれていないことの両方の問題が解決されます。

于 2012-08-28T14:32:38.427 に答える
0
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))
于 2016-11-23T18:32:59.963 に答える