कैसे एक बार स्क्रिप्ट में केवल एक बार पासवर्ड दर्ज करने के लिए sudo की आवश्यकता होती है


21

डेटा

  • मैं चाहता हूं कि इस मशीन पर ऑपरेटर उपयोगकर्ता अपने स्वयं के सीआईएफ शेयरों को माउंट करें
  • sudoersफ़ाइल पहले से ही शामिल /bin/mount -t cifs //*/* /media/* -o username=*सभी ऑपरेटरों के लिए आदेश
  • मैं चाहता हूं कि उपयोगकर्ता cifsकेवल एक बार पासवर्ड टाइप करने वाली स्क्रिप्ट के माध्यम से एक शेयर को दो बार नहीं, माउंट करें।
  • Sudo पासवर्ड और cifs पासवर्ड समान हैं।

मेरे पास पहले से क्या है

यह स्क्रिप्ट काम करती है:

#!/bin/bash
sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

... लेकिन इसके लिए उपयोगकर्ताओं को एक ही पासवर्ड दो बार टाइप करना होगा!

  • एक बार के लिए sudo
  • एक बार खुद माउंट के लिए

यह भी काम करेगा:

#!/bin/bash
echo -n Password: 
read -s szPassword
echo $szPassword | sudo -S sh -c 'echo $szPassword | mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

... लेकिन इससे मुझे सभी ऑपरेटर उपयोगकर्ताओं को सक्षम करने की आवश्यकता होगीsudo sh (प्रमुख सुरक्षा समस्या)

सवाल

फ़ाइल में डाले बिना bash if में cifs शेयर कैसे माउंट करें और न ही स्थायी / अस्थायी फ़ाइल बनाएं ???shsudoers

नोट 1: कोई अजगर, पर्ल, सी, गो, ... कृपया?
नोट 2: मुझे पता है कि मैं केवल sudoersफ़ाइल के माध्यम से पासवर्ड निकाल सकता हूं , लेकिन मैं सुरक्षा को मजबूत करने की कोशिश कर रहा हूं, इसे ढीला नहीं कर रहा हूं, बिना किसी भी समस्या के ...


2
कैसे के बारे में printf "%s\n" "$szPassword" "$szPassword" | sudo -S mount -t cifs / ...?
मुरु

कोशिश है कि अब! @Muru
Fabby

जवाबों:


24

आपको इसके बजाय उपयोगकर्ता को sudo के उपयोग की कॉल करनी चाहिए sudo script। बस जाँच करें कि क्या स्क्रिप्ट को रूट के रूप में चलाया जा रहा है, अगर यह नहीं पूछा गया है

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root, use sudo "$0" instead" 1>&2
   exit 1
fi

अपने उपयोगकर्ताओं के पासवर्ड को पकड़ने का प्रयास न करें।


1
शायद मुझे कुछ याद आ रहा है, लेकिन क्या आप बता सकते हैं कि यह पासवर्ड की संख्या को दो से घटाकर एक कैसे कर देता है? अन्यथा मैं यह नहीं देखता कि यह सवाल का जवाब कैसे देता है।
ओलिपहंट -

@Oliphaunt मुझे दो पासवर्ड प्रॉम्प्ट नहीं दिख रहे हैं, क्या आप उसे समझा सकते हैं? इसके अलावा, यह जवाब नहीं है कि ओपी क्या चाहता है, लेकिन इसकी क्या जरूरत है। स्वच्छ और उचित समाधान है जब आपको कमांड को रूट के रूप में चलाने की आवश्यकता होती है, और अन्य उपयोगिताएं कैसे करती हैं (जांचें कि क्या जड़ है, अन्यथा बाहर जमानत करें)
Braiam

1
ओपी की समस्या (जैसा कि मैं इसे समझता हूं) यह है कि उपयोगकर्ता को उनके पासवर्ड के लिए संकेत दिया जाता है sudoऔर फिर ( द्वारा सफलतापूर्वक प्रमाणित करने पर) mount। उनके उपयोग के मामले में, ये पासवर्ड समान हैं इसलिए मैं देख सकता हूं कि क्यों ओपी उपयोगकर्ता को केवल एक बार इस पासवर्ड को दर्ज करना होगा। मुझे विश्वास नहीं है कि आपका समाधान इससे मदद करता है। मैं मानता हूं कि किसी को पासवर्ड नहीं पकड़ना चाहिए।
ओलिपहंट -

धन्यवाद, लेकिन मैंने सवाल को थोड़ा बढ़ाया हो सकता है: यह एक स्क्रिप्ट है जो पहले से ही है, पहले से ही उस टेस्ट (को छोड़कर 1>&2) में शामिल है, ऑटोस्टार्ट में है और यह सिर्फ एक cifs शेयर हुआ करता था, लेकिन अब यह तीन है, इसलिए वास्तव में एक पासवर्ड जरूरत है। (यह पहले से ही उस परीक्षण में होता है जब कोई और नहीं, ऑपरेटर समूह का सदस्य नहीं होता है, इसे चलाने की कोशिश करता है)
Fabby

@ अब भी मुझे लगता है कि आप समस्या को गलत तरीके से समझ रहे हैं। इन मामलों के लिए एक CIFS / SMB शेयर का पासवर्ड सुरक्षित रूप से "याद रखने" के लिए सहायक होता है ( ~/.smbcredentialsउदाहरण के लिए संपादन ), और यहां तक ​​कि sudo की आवश्यकता के बिना (यदि आप gvfs, umount या polkit का उपयोग करते हैं)।
ब्रिअम

7

मैं गूंगा हूँ!

निम्नलिखित स्क्रिप्ट:

#!/bin/bash
read -p "Password: " -s szPassword
printf "%s\n" "$szPassword" | sudo --stdin mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER,password="$szPassword"

बस काम करता है और:

  1. पासवर्ड वाली कोई भी फाइल नहीं बनाता है
  2. उपयोगकर्ता को कई शेयरों (विंडोज वाले सहित) के लिए केवल एक पासवर्ड टाइप करने की अनुमति देता है
  3. अतिरिक्त विशेषाधिकार प्रदान करने की कोई आवश्यकता नहीं है। :-)

1
1 प्रश्न: क्या प्रक्रिया सूची में यह कमांड गूंजती है?
रिनजविंड

3
@ रिनविंड बिल्ट-इन के रूप में, यह बाश या zsh में नहीं होना चाहिए। माउंट कमांड, हालांकि कर सकता है।
मूरू

<<<के बजाय भी इस्तेमाल किया जा सकता है printf , लेकिन बेहतर तरीका यह होगा कि readपूरी तरह से छोड़ दिया जाए और sudo --stdinसभी को खुद से इस्तेमाल किया जाए। $ printf "Type out your password\n" && sudo --stdin apt-get update उपयोगकर्ता जैसा कुछ अभी भी sudo पासवर्ड में टाइप कर सकता है। और वह इसे प्रक्रिया सूची में नहीं डालेगा। लेकिन निश्चित रूप से इसमें संभावित अन्य सुरक्षा मुद्दों की अनंत मात्रा है, जैसे कि keyloggers, में संभावित कमजोरियाँ sudo, और blah, और blah, और blah इनफिनिटी
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy: संपादित करने के लिए स्वतंत्र महसूस करो , यार!
फाबबी

3

sudoइस कमांड को निष्पादित करने के लिए कोई पासवर्ड की आवश्यकता नहीं है ; पासवर्ड प्रॉम्प्ट mountरहता है।

में sudoers, कुछ इस तरह शामिल करें

ALL        ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*

इसे शामिल करने के बाद, sudoअब इस विशिष्ट कमांड के लिए पासवर्ड नहीं मांगेगा; उपयोगकर्ता को अभी भी mountकमांड को पासवर्ड प्रदान करने की आवश्यकता है ।

नोट : मैंने कमांड वर्बटीम से लिया था जिसमें आपने प्रश्न शामिल किया था; मैंने यह नहीं जांचा कि क्या इसके वाइल्डकार्ड उपयोगकर्ताओं को कुछ बुरा करने की अनुमति देंगे। sudoersउदासीनता के उदाहरणों के लिए मैनपेज पढ़ें । विशेष रूप से, ध्यान दें कि यह लाइन sudoersउपयोगकर्ता को किसी भी -oस्विच या अन्य तर्कों को जोड़ने की अनुमति देती है mount आप अपने दृष्टिकोण पर पुनर्विचार करना चाह सकते हैं, जैसे @Braiam प्रस्ताव के साथ एक स्क्रिप्ट जोड़कर और sudoबिना अतिरिक्त प्रमाणीकरण के माध्यम से चलाने की अनुमति देना । स्क्रिप्ट तब यह सुनिश्चित करती है कि उपयोगकर्ता केवल उस विशिष्ट रूप mountको चला सकते हैं जिसे आप उन्हें चलाना चाहते हैं।

इसके अलावा, सभी उपयोगकर्ताओं के लिए यह अनुमति देने के बजाय, आप इसे एक निश्चित समूह के सदस्यों तक सीमित कर सकते हैं, जैसे आप एक समूह बना सकते हैं cifsmountऔर फिर कर सकते हैं

%cifsmount ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*

@ फैबी सॉरी, लेकिन इसमें इतना खतरनाक क्या है? इसके अलावा, मैं व्यंग्य के एक संकेत का पता लगा सकता हूं, निश्चित नहीं।
ओलिपहंट -

भले ही sudo को पासवर्ड की आवश्यकता न हो, फिर भी माउंट को अभी भी पासवर्ड की आवश्यकता हो सकती है। / Etc / sudoers फ़ाइल का उपयोग सिर्फ sudo को पासवर्ड की आवश्यकता नहीं करने के लिए किया जा सकता है। यह प्रभावित नहीं करेगा कि माउंट पासवर्ड मांगता है या नहीं। यदि कोई व्यक्ति माउंट करने में विफल रहा है, तो सूडो बस एक कमांड चलाने में समाप्त हो जाएगा जो विफल हो जाता है, जो संभवतः एक समस्या नहीं है।
TOOGAM

@TOOGAM यही मेरा इरादा था। दो के बजाय एक पासवर्ड।
ओलिपहंट -

मेरा इरादा सुडोर्स फ़ाइल में एक "ऑपरेटर" समूह रखने का है, इसलिए यदि कोई ऑपरेटर अपना सामान माउंट करने की कोशिश करता है, तो उन्हें अभी भी एक पासवर्ड टाइप करना है, लेकिन "मानक" ऑपरेटर माउंट करने के लिए, उन्हें केवल पासवर्ड टाइप करना होगा 5 बार के बजाय एक बार ... लेकिन आपका समाधान दूसरों के लिए काम कर सकता है, इसलिए उकता गया ... (और मूल टिप्पणियां हटा दी
गईं

1

इन मुद्दों का एक सामान्य समाधान निम्नलिखित सूडबल को आपके सुडो के लिए आवश्यक स्क्रिप्ट के शीर्ष पर रखना है:

#!/bin/bash
case $EUID in
   0) : cool we are already root - fall through ;;
   *) # not root, become root for the rest of this session
      # (and ask for the sudo password only once)
      sudo $0 "$@" ;;
esac
# now the present process is effective-UID  (root)
# so there's no need to put sudo in front of commands

any more commands here will run as superuser ...

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

वैसे भी, मुझे लगा कि मैं इस छोटी सी टिप को साझा करूंगा। इसके बारे में सबसे अच्छी बात यह है कि यदि आप पहले से ही प्रभावी-यूआईडी रूट हैं (जैसे कि यदि आपने पहले से ही इसे सूडो के तहत कहा है) तो यह इनायत से सही काम करता है। इसके अलावा एक त्रुटि देने और आपको फिर से टाइप करने के लिए मजबूर करना / फिर से दौड़ना (सूडो के साथ) कम अनुकूल है।

आप उस timestamp_timeoutचर की भी जांच कर सकते हैं man 5 sudoersजिसमें sudoसीमित संख्या में मिनटों के लिए उपयोगकर्ता क्रेडेंशियल्स याद रखना बताता है (और यह आंशिक भी हो सकता है)।


मैंने एक आसान उत्तर प्राप्त करने के लिए स्क्रिप्ट की देखरेख की: स्क्रिप्ट में पहले से ही शामिल है: #test if root: if not: bail out if [[ $EUID -ne 0 ]]; then echo "This script must be run as root, use sudo "$0" instead" 1>&2 exit 1 fi मुद्दा यह है कि इसमें एक ही पासवर्ड (फिर से हटाए गए) के साथ कई आरोह भी शामिल हैं, लेकिन फिर भी धन्यवाद ...
Fabby

1
मुद्दा यह है कि ऊपर दिए गए समाधान में पासवर्ड के केवल एक टाइपिंग (sudo के लिए) की आवश्यकता होगी। इसे किसी अन्य की आवश्यकता नहीं होनी चाहिए। साथ ही यह एक सामान्य (और एक त्रुटि देने से अधिक सुरुचिपूर्ण है और सभी समान मुद्दों के लिए सूडो के साथ कमांड को फिर से टाइप करना है), तब भी जब उन्हें कई (दो से अधिक) विशेषाधिकार प्राप्त कमांडों की आवश्यकता होती है।
arielf

यह चाहिए, लेकिन यह नहीं है ! ;-) ऐसा इसलिए है क्योंकि प्रत्येक cifs शेयर माउंट के लिए एक पासवर्ड भी आवश्यक है। (जैसा कि यह उबंटू पासवर्ड से अलग हो सकता है, लेकिन इस मामले में जैसा कि ऑपरेटरों ने अपने विंडोज और उबंटू पासवर्ड को सिंक्रनाइज़ नहीं रखा है)
Fabby
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.