2010-09-06 51 views
9

說我有一個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的問題!

回答

8

而不是修改/覆蓋結構,你可以用過濾器替換stdout(或任何iostream)。

下面是覆蓋stdout來檢查特定密碼的示例。它從Fabric的env.password變量獲得密碼,set by the -I argument。請注意,您可以使用正則表達式執行相同的操作,以便您不必在過濾器中指定密碼。我還應該提到,這不是世界上最高效的代碼,但如果你使用結構,你可能會把幾件事粘在一起,關心可管理性而不是速度。

#!/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]] 
+0

這是一個不錯的主意! – 2010-09-08 01:18:14

+0

我想如果OP不想在他的終端日誌中輸入他的密碼,那麼他可能不希望他的密碼在'.py'文件中。 – 2012-05-19 00:28:56

+1

他也可以在密碼提示符的末尾使用正則表達式。你有更好的主意還是喜歡挑剔? :) – synthesizerpatel 2012-05-21 09:49:54

1

將密碼放在用戶的〜/ .my.cnf下的[client]部分下可能會更好。這樣你就不必把密碼放在python文件中。

[client] 
password=TheActualPassword 
+0

我澄清這個問題。我只使用mysql作爲例子,因爲我使用的命令沒有替代選項到命令行。 – 2010-09-06 22:31:17

1

當您使用的面料命令run,面料是不知道你正在運行的命令是否包含明文密碼或沒有。在不修改/覆蓋Fabric源代碼的情況下,我不認爲你可以在顯示正在運行的命令的地方得到你想要的輸出,但密碼被替換爲星號。

但是,您可以更改Fabric輸出級別,無論是整個Fabric腳本還是一部分,以便不會顯示正在運行的命令。雖然這會隱藏密碼,但缺點是您根本看不到該命令。

查看關於Managing Output的Fabric文檔。

0

編寫調用與相應的密碼問題命令shell腳本,但沒有呼應該密碼。您可以讓shell腳本從比您的.py文件更安全的位置查找密碼。

然後讓織物調用shell腳本。

這解決了面料不顯示密碼並確保您的源代碼中沒有憑據的問題。

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))