2010-09-06 27 views
9

Nói rằng tôi có một fabfile.py trông như thế này:Làm thế nào để ẩn mật khẩu trong vải khi lệnh được in ra?

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

Kết quả của việc này là:

[host] run: mysql -umoo -pTheActualPassword 

Có cách nào để làm cho giao diện đầu ra như thế này?

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

Lưu ý: Đây không phải là một câu hỏi mysql!

Trả lời

8

Thay vì sửa đổi/ghi đè Vải, bạn có thể thay thế thiết bị xuất chuẩn (hoặc bất kỳ iostream) nào bằng bộ lọc.

Dưới đây là ví dụ về giá trị ghi đè để kiểm duyệt mật khẩu cụ thể. Nó lấy mật khẩu từ biến số env.password của Fabric, set by the -I argument. Lưu ý rằng bạn có thể làm điều tương tự với biểu thức chính quy, để bạn không phải chỉ định mật khẩu trong bộ lọc.

Tôi cũng nên đề cập, đây không phải là mã hiệu quả nhất trên thế giới, nhưng nếu bạn đang sử dụng vải, bạn có thể dán một vài thứ lại với nhau và quan tâm nhiều hơn đến khả năng quản lý hơn tốc độ.

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

Khi chạy:

fab -I can_you_see_the_password 
Initial value for env.password: 

này sẽ sản xuất:

Hello there 
My password is [[TOP SECRET]] 
+0

Đó là một ý tưởng khá hay! –

+0

Tôi tưởng tượng rằng nếu OP không muốn mật khẩu của mình trong các bản ghi thiết bị đầu cuối của mình thì có lẽ anh ta không muốn mật khẩu của mình đang ngồi trong một tệp '.py'. –

+1

ông cũng có thể sử dụng một regex trên dấu nhắc mật khẩu để kết thúc của dòng .. bạn có một ý tưởng tốt hơn hoặc chỉ để nitpick? :) – synthesizerpatel

1

Tốt hơn nên đặt mật khẩu vào ~/.my.cnf của người dùng trong phần [khách hàng]. Bằng cách này bạn không cần phải đặt mật khẩu trong tệp python.

[client] 
password=TheActualPassword 
+0

tôi làm rõ câu hỏi. Tôi chỉ sử dụng mysql làm ví dụ, vì lệnh tôi đang sử dụng không có tùy chọn thay thế cho dòng lệnh. –

1

Khi bạn sử dụng lệnh Vải run, Vải không biết liệu lệnh bạn đang chạy có chứa mật khẩu thuần văn bản hay không. Nếu không sửa đổi/ghi đè mã nguồn Fabric, tôi không nghĩ rằng bạn có thể nhận được kết quả đầu ra mà bạn muốn nơi lệnh được chạy được hiển thị nhưng mật khẩu được thay thế bằng dấu hoa thị.

Tuy nhiên, bạn có thể thay đổi cấp sản lượng Vải, cho toàn bộ tập lệnh Fabric hoặc một phần, để lệnh đang chạy không được hiển thị. Trong khi điều này sẽ ẩn mật khẩu, nhược điểm là bạn sẽ không thấy lệnh nào cả.

Hãy xem tài liệu về Vải trên Managing Output.

0

Viết một kịch bản shell để gọi lệnh trong câu hỏi với mật khẩu thích hợp, nhưng không lặp lại rằng mật khẩu. Bạn có thể có kịch bản shell tra cứu mật khẩu từ một vị trí an toàn hơn so với các tệp .py của bạn.

Sau đó, có vải gọi tập lệnh shell thay thế.

Điều này giải quyết cả vấn đề có vải không hiển thị mật khẩu và đảm bảo bạn không có thông tin đăng nhập trong mã nguồn của mình.

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

hoặc nếu không kịp thời có sẵn:

from fabric.api import run, hide 
with hide('output','running','warnings'): 
    run("mycommand --password {}".format(my_password)) 
Các vấn đề liên quan