2011-02-01 6 views
26

मैं एक यूनिक्स शैल फ़ंक्शन लिख रहा हूं जो एक आदेश निष्पादित करने जा रहा है जो उपयोगकर्ता को पासवर्ड के लिए संकेत देगा। मैं स्क्रिप्ट में पासवर्ड को हार्ड-कोड करना चाहता हूं और इसे कमांड में प्रदान करना चाहता हूं। मैं इस तरह आदेश में पासवर्ड पाइप की कोशिश की है:एक आदेश के लिए पासवर्ड कैसे प्रदान करें जो एक में बैश के लिए संकेत देता है?

function() { 
    echo "password" | command 
} 

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

मैं भी इस तरह पासवर्ड वाली फ़ाइल को मानक इनपुट पुनः निर्देशित की कोशिश की है, लेकिन है कि या तो काम नहीं करता:

function() { 
    echo "password" > pass.tmp 
    command < pass.tmp 
    rm pass.tmp 
} 

मुझे पता है कि कुछ आदेश पासवर्ड के लिए अनुमति देने के लिए एक के रूप में प्रदान किया जाना तर्क, लेकिन मैं मानक इनपुट के माध्यम से जाना होगा।

मैं बैश में कमांड में पासवर्ड पाइप करने का एक त्वरित और गंदा तरीका ढूंढ रहा हूं।

+3

क्या आपने 'autoexpect' देखा है? इससे उससे ज्यादा आसान नहीं होता है। आप बस इसे कमांड पास कर दें और यह आपके द्वारा किए गए सभी कार्यों को रिकॉर्ड करेगा और आपके लिए अपेक्षित फ़ाइल बनाएगा। – SiegeX

उत्तर

19

पर autoexpect (सभ्य ट्यूटोरियल HERE) एक नजर डालें। यह जल्दी और गंदे के बारे में है क्योंकि आप चालबाजी का उपयोग किए बिना प्राप्त कर सकते हैं।

+0

आश्चर्यजनक - यह देखने के रूप में कि मेरा असली इरादा कुछ त्वरित-गंदे करने में सक्षम होना है, यह वही है जो मुझे चाहिए! –

+0

मुझे अपने दुखद रूप से कार्यान्वित वीपीएन में तीन बार एक ही पासवर्ड टाइप करने में सहेजा गया। (मैंने एक स्क्रिप्ट भी बनाई है जो 'vpn.sh'''' की अपेक्षा करता है) – Chazt3n

+1

यहां जवाब में कम से कम एक त्वरित स्निपेट शामिल होना बहुत अच्छा होगा। लिंक हमेशा छह साल बाद काम नहीं करते हैं। यह करता है, लेकिन :) – Unsigned

5

सुरक्षित आदेश इसकी अनुमति नहीं देंगे, और ठीक है, इसलिए मुझे डर है - यह एक सुरक्षा छेद है जिसके माध्यम से आप एक ट्रक चला सकते हैं।

यदि आपका आदेश इनपुट पुनर्निर्देशन, या कमांड लाइन पैरामीटर या कॉन्फ़िगरेशन फ़ाइल का उपयोग करने की अनुमति नहीं देता है, तो आपको गंभीर चालबाजी का सहारा लेना होगा।

कुछ एप्लिकेशन वास्तव में /dev/tty खोलेंगे ताकि यह सुनिश्चित किया जा सके कि आपको सुरक्षा को हर समय कठिन समय लगेगा। आप अस्थायी रूप से /dev/tty (उदाहरण के लिए पाइप के रूप में अपना स्वयं का बनाकर) ले कर उन्हें चारों ओर प्राप्त कर सकते हैं, लेकिन इसके लिए गंभीर विशेषाधिकारों की आवश्यकता है और इसे पराजित किया जा सकता है।

+1

आप सही हैं, मैं समझता हूं कि यह एक सुरक्षा छेद क्यों है, लेकिन मैं पहले से ही एक सुरक्षित वातावरण में हूं इसलिए मेरी प्राथमिक चिंता गंभीर चालबाजी का सहारा लेने के बिना कुछ जल्दी-गंदे है। जवाब के लिए धन्यवाद! –

2

पासवर्ड जो पासवर्ड के लिए संकेत देते हैं, आमतौर पर टीटी को "कच्चे" मोड में सेट करते हैं, और सीधे tty से इनपुट पढ़ते हैं। यदि आप एक पीटीआई में उपप्रोसेन पैदा करते हैं तो आप वह काम कर सकते हैं। यही कारण है कि क्या उम्मीद करता है है ...

+0

क्या आप कृपया इसका एक न्यूनतम उदाहरण दे सकते हैं? – dibyendu

22

कैसे एक आदेश में एक पासवर्ड पाइप को autoexpect उपयोग करने के लिए:

ये कदम एक उबंटू 12.10 डेस्कटॉप के साथ चित्रित किया गया है। आपके वितरण के लिए सटीक आदेश थोड़ा अलग हो सकते हैं।

यह खतरनाक है क्योंकि आप जो भी पासवर्ड किसी भी व्यक्ति को उपयोग करते हैं, वह ऑटोएक्सपेक्ट स्क्रिप्ट फ़ाइल को पढ़ सकता है।

इस तरह की उम्मीद के माध्यम से उन्हें पाइप करके अपने रूट पासवर्ड या पावर उपयोगकर्ता पासवर्ड का पर्दाफाश न करें। रूट किट इसे एक पल में मिल जाएगा और आपके बॉक्स का स्वामित्व है।

EXPECT एक प्रक्रिया को जन्म देता है, तब पाठ में पढ़ता है जो स्क्रिप्ट फ़ाइल में पूर्वनिर्धारित पाठ भेजता है।

  1. सुनिश्चित करें कि आप expect और autoexpect इंस्टॉल है:

    sudo apt-get install expect 
    sudo apt-get install expect-dev 
    
  2. यह के बारे में पढ़ें:

    man expect 
    man autoexpect 
    
  3. आपकी होम निर्देशिका पर जाएँ:

    cd /home/el 
    
  4. उपयोगकर्ता el जड़ के लिए एक फ़ाइल chown नहीं कर सकते और पासवर्ड दर्ज करना होगा:

    touch testfile.txt 
    sudo chown root:root testfile.txt 
        [enter password to authorize the changing of the owner] 
    
  5. यह पासवर्ड प्रविष्टि हम स्वचालित करना चाहते है। यह सुनिश्चित करने के लिए टर्मिनल को पुनरारंभ करें कि सुडो हमें फिर से पासवर्ड के लिए पूछता है। फिर/घर/एल पर जाएं और यह कार्य करें:

    touch myfile.txt 
    
    autoexpect -f my_test_expect.exp sudo chown root:root myfile.txt 
    
        [enter password which authorizes the chown to root] 
    
    autoexpect done, file is my_test_expect.exp 
    
  6. आप my_test_expect.exp फ़ाइल बनाया है। आपका सुपर गुप्त पासवर्ड इस फ़ाइल में सादे टेक्स्ट संग्रहित है। यह आपको बहुत असहज बनाना चाहिए। के रूप में ज्यादा अनुमति और स्वामित्व पर प्रतिबंध संभव के रूप में से कुछ परेशानी को कम:

    sudo chown el my_test_expect.exp  //make el the owner. 
    sudo chmod 700 my_test_expect.exp //make file only readable by el. 
    
  7. आप my_test_expect.exp के तल पर आदेशों की इन प्रकार देखें:

    set timeout -1 
    spawn sudo chown root:root myfile.txt 
    match_max 100000 
    expect -exact "\[sudo\] password for el: " 
    send -- "YourPasswordStoredInPlaintext\r" 
    expect eof 
    
  8. आप की पुष्टि है कि इसके बाद के संस्करण की उम्मीद की आवश्यकता होगी आदेश उचित हैं। यदि ऑटोएक्सपेक्ट स्क्रिप्ट अत्यधिक संवेदनशील है या पर्याप्त संवेदनशील नहीं है तो यह लटका होगा। इस मामले में यह स्वीकार्य है क्योंकि उम्मीद पाठ की प्रतीक्षा कर रही है जो हमेशा पहुंच जाएगी।

  9. उपयोगकर्ता एल के रूप में उम्मीद की स्क्रिप्ट चलाएं:

    expect my_test_expect.exp 
    spawn sudo chown root:root myfile.txt 
    [sudo] password for el: 
    
  10. पासवर्ड my_test_expect.exp में निहित उपयोगकर्ता एल द्वारा मार्ग पर एक chown में पहुंचाया गया था। यदि पासवर्ड स्वीकार कर लिया गया, myfile.txt को देखो देखने के लिए:

    ls -l 
    -rw-r--r-- 1 root root   0 Dec 2 14:48 myfile.txt 
    

यह काम किया है क्योंकि यह जड़ है, और एल कभी नहीं एक पासवर्ड में प्रवेश किया। यदि आप इस स्क्रिप्ट के साथ अपनी रूट, सूडो, या पावर उपयोगकर्ता पासवर्ड का पर्दाफाश करते हैं, तो अपने बॉक्स पर रूट प्राप्त करना आसान होगा। ऐसी सुरक्षा प्रणाली के लिए जुर्माना है जो सभी को किसी भी प्रश्न में पूछने की अनुमति नहीं देता है।

+1

यह पोस्ट उतना ही ऊपर नहीं होना चाहिए जितना है। पासवर्ड किसी कारण से बने होते हैं, और यह ज्यादातर उस उद्देश्य को हरा देता है। –

1

, बस का उपयोग करें:

echo "password" | sudo -S mount -t vfat /dev/sda1 /media/usb/; 
if [ $? -eq 0 ]; then 
    echo -e '[ ok ] Usb key mounted' 
else 
    echo -e '[warn] The USB key is not mounted' 
fi 

इस कोड मेरे लिए काम कर रहा है, और इसके /etc/init.d/myscriptbash.sh

5

में आप -S ध्वज का उपयोग कर सकते एसटीडी इनपुट से पढ़ने के लिए। उदाहरण के नीचे खोजें:

function shutd() 
{ 
    echo "mySuperSecurePassword" | sudo -S shutdown -h now 
}  
+0

कृपया धन्यवाद। यह पूरी तरह से त्वरित और गंदे, वेनिला कार्यान्वयन के रूप में काम करता है। –

संबंधित मुद्दे

 संबंधित मुद्दे