2010-09-06 11 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) की जगह सकता है।

यहां एक विशिष्ट पासवर्ड सेंसर करने के लिए स्ट्राउट ओवरराइड करने का एक उदाहरण दिया गया है। यह फैब्रिक के 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

यह एक बहुत अच्छा विचार है! –

+0

मुझे कल्पना है कि यदि ओपी अपने टर्मिनल लॉग में अपना पासवर्ड नहीं चाहता है तो शायद वह नहीं चाहता कि उसका पासवर्ड '.py' फ़ाइल में बैठे। –

+1

वह लाइन के अंत में पासवर्ड प्रॉम्प्ट पर रेगेक्स का भी उपयोग कर सकता है .. क्या आपके पास बेहतर विचार है या बस नाइटपिक करना पसंद है? :) – synthesizerpatel

1

यह पासवर्ड डाल करने के लिए बेहतर हो सकता है उपयोगकर्ता के ~/.my.cnf [ग्राहक] खंड के अंतर्गत। इस तरह आपको पासवर्ड को पायथन फ़ाइल में रखना नहीं है।

[client] 
password=TheActualPassword 
+0

मैं सवाल स्पष्ट किया। मैं केवल उदाहरण के रूप में mysql का उपयोग कर रहा हूं, क्योंकि जिस कमांड का उपयोग मैं कर रहा हूं उसके पास कमांड लाइन के लिए वैकल्पिक विकल्प नहीं है। –

1

आप फैब्रिक आदेश run उपयोग करते हैं, कपड़ा या नहीं, आदेश आप चल रहे हैं एक सादे-पाठ पासवर्ड या नहीं होता है के बारे में पता नहीं है। फैब्रिक सोर्स कोड को संशोधित/ओवरराइड किए बिना, मुझे नहीं लगता कि आप आउटपुट प्राप्त कर सकते हैं, जहां आप चाहते हैं कि कमांड चलाया जा रहा है लेकिन पासवर्ड को तारों से बदल दिया गया है।

हालांकि, आप फैब्रिक उत्पादन स्तर, या तो पूरा कपड़ा स्क्रिप्ट या एक हिस्से के लिए, ताकि आदेश जा रहा रन प्रदर्शित नहीं किया जाता बदल सकता है। हालांकि यह पासवर्ड छुपाएगा, नकारात्मकता यह है कि आप कमांड को बिल्कुल नहीं देख पाएंगे।

Managing Output पर फैब्रिक प्रलेखन पर नज़र डालें।

0

एक खोल स्क्रिप्ट है कि उचित पासवर्ड के साथ सवाल में आदेश का आह्वान लिखें, लेकिन गूंज पासवर्ड कि बिना। आप अपनी .py फ़ाइलों की तुलना में शेल स्क्रिप्ट को अधिक सुरक्षित स्थान से पासवर्ड देख सकते हैं।

फिर कपड़े के बजाय शेल स्क्रिप्ट को कॉल करें।

यह हल करती है दोनों कपड़े पासवर्ड प्रदर्शित नहीं होने और सुनिश्चित करें कि आप अपने स्रोत कोड में क्रेडेंशियल नहीं हैं बनाने की समस्या।

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)) 
संबंधित मुद्दे