मैं एक स्क्रिप्ट में पासवर्ड के लिए पूछे बिना कमांड कैसे कर सकता हूं?


107

मैं हर दिन अपने सिस्टम को स्वचालित रूप से चालू करना चाहता हूं। इसलिए मैं अपनी पायथन स्क्रिप्ट में नीचे दिए गए कोड का उपयोग करता हूं, लेकिन sudoहर बार मुझसे पासवर्ड मांगता है:

os.system('sudo sh -c "echo date \'+%s\' -d \'+ \
       24 hours\' > /sys/class/rtc/rtc0/wakealarm"')

मैं sudoहर बार पासवर्ड मांगे बिना इस स्क्रिप्ट को कैसे चला सकता हूं ?


4
आपको अपने मदरबोर्ड मैनुअल या BIOS में देखना चाहिए कि क्या यह इस व्यवहार का समर्थन करता है। मुझे पता है कि यह सवाल चकमा देता है! =] लेकिन यह एक पर्याप्त समाधान हो सकता है।
एलेक्स हिरजेल

जवाबों:


149

कृपया ध्यान दें: कोई भी विधि जिसमें आपका लॉगिन पासवर्ड सादे पाठ में, एक कमांड में या एक फ़ाइल में शामिल है, असुरक्षित है और इसका उपयोग नहीं किया जाना चाहिए!

इसे सेटअप करने का सही तरीका है sudoकि आपको केवल एक विशिष्ट कमांड की आवश्यकता है, अर्थात echo date... > rtc..., पासवर्ड की आवश्यकता के बिना चलाने की अनुमति है।

चरण 1. उस कमांड के साथ एक शेल स्क्रिप्ट बनाएं

  • खोलें gedit(या अपने पसंदीदा संपादक), और स्क्रिप्ट बनाएँpydatertc.sh
  • केवल इस पंक्ति को सम्मिलित करें, और इसे अपने गृह निर्देशिका में सहेजें, जैसे:
    इको डेट \ '+% s \' -d \ ’+ २४ घंटे \"> / sys / वर्ग / rtc / rtc0 / wakealarm
  • संपादक से बाहर निकलें, और टर्मिनल से, स्क्रिप्ट को निष्पादन योग्य बनाएं और उसके स्वामित्व को रूट में बदलें , अन्यथा आपके सिस्टम तक पहुंच रखने वाला कोई अन्य उपयोगकर्ता संभवतः इसे संपादित कर सकता है और जो कुछ भी आदेश वे चाहते हैं उसे अपने पासवर्ड की आवश्यकता के बिना रूट के रूप में निष्पादित कर सकते हैं:
    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh

चरण 2. pydatertc.shएक पासवर्ड की आवश्यकता के बिना निष्पादित करने के लिए sudo सेट अप करें

  • sudo visudoSudo अनुमतियाँ ( sudoers) फ़ाइल खोलने के लिए टर्मिनल पर टाइप करें
  • लाइन 25 के आसपास, आप इस लाइन को देखेंगे: %sudo ALL=(ALL:ALL) ALL
  • उस पंक्ति के नीचे , निम्नलिखित पंक्ति डालें, जहां usernameआपका उपयोगकर्ता नाम है:
    उपयोगकर्ता नाम = (ALL) NOPASSWD: /home/username/pydatertc.sh
  • संपादक से बाहर निकलें ( Ctrl+ Xअगर नैनो )

चरण 3. कॉल करने के लिए अपने अजगर स्क्रिप्ट को संशोधित करें pydatertc.sh

  • लाइन को इसमें बदलें:
    os.system ('sudo /home/username/pydatertc.sh')

अब आपकी स्क्रिप्ट को पासवर्ड की आवश्यकता के बिना और आपके खाते, आपके डेटा या आपके सिस्टम की सुरक्षा से समझौता किए बिना चलना चाहिए !


केवल wakealarm(सामान्य उपयोग के लिए नहीं!) के लिए वैकल्पिक :

में केवल इस विशेष मामले के बाद से /sys/class/rtc/rtc0/wakealarmफ़ाइल केवल प्रणाली के लिए वेक-अप अलार्म को नियंत्रित करता है और अन्यथा हानिरहित है, एक और विकल्प पासवर्ड से बचने के लिए किसी के साथ उस फ़ाइल का स्वामित्व लेने के लिए है chown(यदि आप केवल अलार्म की स्थापना उपयोगकर्ता कर रहे हैं) , या इसे विश्व-लेखन योग्य बना सकते हैं chmod +666; उस स्थिति में, sudoअपने पाइथन कॉल से बस हटा दें , जो sh -c "...."बरकरार है।


1
बहुत बढ़िया, यह करने का सही तरीका है।
रोड

1
इस तरह के एक विस्तृत, उपयोगी उत्तर और वास्तव में यह कैसे किया जाना चाहिए।
आर्टऑफकोड

@RobertRosati, आपके सुझाए गए संपादन के लिए बहुत धन्यवाद - मुझे पहली बार में यह नहीं भूलना चाहिए था!
ish

1
@ m-ric क्या आपने इन पंक्तियों के ऊपर कमांड पढ़ी है? "अन्यथा आपके सिस्टम तक पहुंच रखने वाला कोई अन्य उपयोगकर्ता संभवतः इसे संपादित कर सकता है और आपके पासवर्ड की आवश्यकता के बिना जो भी कमांड को रूट करना चाहता है उसे निष्पादित कर सकता है"
टोबियास किंजलर 18'13

2
मुझे एहसास है कि यह उत्तर पुराना है - लेकिन यहाँ अभी भी एक समस्या है: यदि फ़ाइल / होम / उपयोगकर्ता नाम में स्थित है , तो सिस्टम से समझौता किया जा सकता है यदि वह निर्देशिका दुर्भावनापूर्ण उपयोगकर्ता (या एक गैर-रूट लॉगिन द्वारा गलत है) समझौता किया हुआ) । वे फ़ाइल को हटा सकते हैं या उसका नाम बदल सकते हैं, एक अन्य स्क्रिप्ट को उसके स्थान पर रख सकते हैं, और उस स्क्रिप्ट को sudoबिना पासवर्ड के चला सकते हैं। इसलिए, स्क्रिप्ट को एक निर्देशिका में रखना ज्यादा सुरक्षित है, जो केवल रूट को बदल सकती है, जैसे: / usr / sbin या / root । अन्यथा, यह LGTM।
एनवीआरएएम

30

चेतावनी!

अपने लॉगिन पासवर्ड को सादे पाठ में, एक कमांड या फ़ाइल में रखना , बेहद असुरक्षित है और आपके निजी डेटा और आपके सिस्टम से समझौता कर सकता है। यह अत्यधिक अनुशंसा की जाती है कि ऐसा न करें, भले ही आपको लगता है कि आपका सिस्टम "व्यक्तिगत" है या "सुरक्षित स्थान" में है!

यदि स्क्रिप्ट केवल व्यक्तिगत उपयोग के लिए है और आपने इसे एक सुरक्षित स्थान पर रख दिया है और आप अपने खाते के चोरी होने और इस तरह से डरने से नहीं डरते हैं, तो यहाँ एक सरल उपाय है:

echo LOGINPASSWD | sudo -S COMMAND HERE

जहाँ LOGINPASSWD आपका लॉगिन पासवर्ड है (उदाहरण: iloveponies) और COMMAND HERE आपका कमांड है जो sudo के बाद आता है, जैसे sh -c "echo da .. etc।


13
@ विस्वा, कृपया ध्यान दें, सादे पाठ में पासवर्ड प्रकट करने के लिए यह बहुत खतरनाक है। आपको अत्यधिक सलाह दी जाती है कि ऐसा न करें
अनवर

3
-1 यदि यह एक अच्छे विचार की तरह लगता है, तो आप अपने रूट अकाउंट पर पासवर्ड सेट करना और z7sg के समाधान का उपयोग करना बेहतर समझेंगे; यह उतना ही आसान है, और यह बहुत खतरनाक सुरक्षा समस्या पैदा नहीं करता है।
ब्रायस

4
हा! मेरे जवाब पर मेरे पास ६ अपवोट्स और ४ डाउनवोट्स थे। लेकिन क्यों लोग, मैं 'पर्सनल यूज़ ’,' सेफ प्लेस’ आदि को स्पष्ट नहीं कर रहा था? जब तक आप इस फ़ाइल को नहीं देते हैं और आपके पास एक ssh सर्वर नहीं है तब तक कोई सुरक्षा समस्या नहीं है! आप सुरक्षा मुद्दे को कहां देखते हैं, बशर्ते कि स्क्रिप्ट व्यक्तिगत उपयोग और सुरक्षित स्थान पर हो?
hytromo

5
डाउनवोट, यह अंधेरे पक्ष के लिए सड़क है, और सुडो विधि के साथ इसकी आवश्यकता नहीं है।
फ्लोयड

4
ठीक है, बस मुझे बताओ, भले ही हैकर ने आपके खाते में सरल उपयोगकर्ता के रूप में लॉग इन किया हो, कैसे बिल्ली को वह आपके पासवर्ड के साथ / usr / share / help / lv / ubuntu-help के तहत स्क्रिप्ट मिलेगा?
hytromo

21

यदि आप घंटे (या दिन के दौरान) पर एक विशेष समय पर चलने वाली स्क्रिप्ट से बुरा नहीं मानते हैं, तो इसे रूट के होम डायरेक्टरी ( /root) के अंदर रखें , और सिस्टम क्रॉस्टैब ( /etc/crontab) से स्क्रिप्ट को रूट के रूप में चलाएं । तब आपको अपनी सुरक्षा से समझौता नहीं करना पड़ेगा।

Crontab पर स्क्रिप्ट कैसे जोड़ें, इसके लिए https://help.ubuntu.com/community/CronHowto देखें ।


4
आप शायद उपयोग करना चाहते हैं anacronअगर वह एक डेस्कटॉप / लैपटॉप है जो 24x7
बाल्की

यह एक उपयोगी उत्तर है, उदाहरण के लिए यदि आप अद्यतनों की जांच के लिए स्क्रिप्ट लिख रहे हैं, तो उस जानकारी के साथ कुछ करें, और आवश्यक अद्यतन के बारे में व्यवस्थापक को ईमेल करें। व्यक्तिगत रूप से, मेरी कई स्क्रिप्ट्स का उपयोग सर्वर स्वचालन के लिए किया जाता है, इसलिए सिर्फ sudo crontab -e का उपयोग करते हुए मैं क्या करना चाहूंगा। +1
रब

11

सुडो की एक और संबंधित अच्छी विशेषता जिसका उल्लेख ऊपर दिए गए उत्कृष्ट उत्तरों में नहीं किया गया है वह है 'टाइमस्टैम्प_टाइमआउट' चर। यह एक sudo वैरिएबल है जिसे आप इंटरेक्टिव पासवर्ड टाइपिंग पर सेव करने के लिए बढ़ा सकते हैं।

उदाहरण, in / etc / sudoers (या इसमें से किसी एक फ़ाइल को) आप डिफ़ॉल्ट को संशोधित कर सकते हैं:

# only require a password once every 60 minutes
Defaults timestamp_timeout=60

'मैन सूडर्स' से पूरा विवरण:

timestamp_timeout

        Number of minutes that can elapse before sudo will ask for
        a passwd again.  The default is 5, set this to 0 to always
        prompt for a password.

बेशक, यह क्रोन से कमांड चलाने के विशिष्ट मामले में मदद नहीं कर सकता है। लेकिन इसके बारे में जागरूक होना अच्छी बात है।


0
export MY_SUDO_PASS="user_password_here"

परीक्षण करने के लिए कि क्या यह काम कर रहा है:

echo $MY_SUDO_PASS
> user_password_here

"Sudo apt-get update" चलाने के लिए, और पर्यावरण चर से पासवर्ड स्वीकार करें जो हमने पहले बनाया था:

echo $MY_SUDO_PASS | sudo -S apt-get update

अजगर से चलाएँ (उदाहरण के लिए स्वामित्व निर्देशिका को पुनर्संरचना में बदलकर username_here):

python
>> import subprocess
>> subprocess.call('echo $MY_SUDO_PASS | sudo -S chown -R username_here /home/username_here/folder_to_change_ownership_recursivley', shell=True)

इको $ MY_SUDO_PASS का पासवर्ड मिलता है -S स्विच को पकड़ने और पासवर्ड को sudo को पास करने के लिए


मुझे यकीन नहीं है कि यह मौजूदा जवाबों को अलार्म पर सबसे मौजूदा BIOS समर्थन जगा देता है ...
एल्डर गीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.