बैश स्क्रिप्ट में सूडो को अनदेखा करें


9

मेरे पास एक छोटी बैश स्क्रिप्ट है:

#!/bin/bash

touch dummy.txt

अगर मैं इस स्क्रिप्ट को निष्पादित करता हूं sudoतो यह सृजित dummy.txtहोगी जो रूट संरक्षित होगी ।

मुझे क्या करना है:

भले ही यह स्क्रिप्ट sudoएक सामान्य उपयोगकर्ता का उपयोग करके निष्पादित की गई हो , फ़ाइल dummy.txtको रूट संरक्षित नहीं किया जाना चाहिए ।


4
तुम जो भी द्वारा "रूट संरक्षित" मतलब है, आप उपयोग कर सकते हैं chownऔर chmodसेट स्वामित्व और अनुमतियाँ पर अपनी स्क्रिप्ट में के रूप में वांछित।
fkraiem

1
यह स्पष्ट नहीं है कि आप "मूल संरक्षित" से क्या मतलब है। क्या आपका मतलब है कि केवल रूट उपयोगकर्ता पढ़ सकता है / लिख सकता है (जैसे फ़ाइल अनुमतियाँ 700 की तरह कुछ पर सेट हैं), या यह कि रूट उपयोगकर्ता फ़ाइल का मालिक है?

1
@DoritoStyle भ्रम के लिए खेद है। रूट संरक्षित करके , मेरा मतलब है कि रूट उपयोगकर्ता फ़ाइल स्वामी है।
बेनामी

जवाबों:


22

आप परीक्षण कर सकते हैं कि क्या स्क्रिप्ट और चर sudoका उपयोग करके चलाया जा रहा है , और फिर निष्पादित करें जैसे कि सच है - कुछ ऐसाEUIDSUDO_USERtouchSUDO_USER

#!/bin/bash

if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
  sudo -u "$SUDO_USER" touch dummy.txt
else
  touch dummy.txt
fi

2
ध्यान दें कि ==स्ट्रिंग तुलना के लिए उपयोग किया जाता है। चूंकि $EUIDपूर्णांक मान वापस करना है, इसलिए मैं आपको -edतुलना का उपयोग करने की सलाह दूंगा। उपयोगकर्ता नाम में रिक्त स्थान की अनुमति है , इसलिए संभवतः $SUDO_USERचर को उद्धृत करें । अन्यथा, अच्छा जवाब - यह एक ऐसी चीज है जिसका मैं व्यक्तिगत रूप से उपयोग करूंगा।
सेर्गेई कोलोडियाज़नी

@steeldriver यह वही है जिसकी मुझे तलाश थी। धन्यवाद!!
अनाम

1
आप स्क्रिप्ट को फिर से चला सकते हैं sudo -uयदि यह पता लगाता है कि यह रूट के रूप में चल रहा है। ओपी ने एक स्क्रिप्ट में कई कमांड होने की बात की। लेकिन त्रुटियों पर एक अनंत लूप से बचने के लिए सावधान रहें।
पीटर कॉर्डेस

1
कोई शब्द बंटवारे के भीतर [[...]]नहीं है, तो कड़ाई से कथन के भीतर चर को उद्धृत करने के लिए आवश्यक नहीं है अगर @Serg और I gues के -edलिए एक टाइपो था-eq
Arronical

@ एरॉनिकल हाँ, यह टाइपो के लिए था -eq। पता [[नहीं था शब्द विभाजन नहीं है। धन्यवाद। व्यक्तिगत रूप से, मैं अभी भी अच्छी पटकथा की आदतों के लिए बोली
लगाऊँगा

9

यदि आपकी स्क्रिप्ट को चलाने के लिए नहीं है root, तो समस्या को हल करने का सबसे सुरक्षित तरीका स्क्रिप्ट के निष्पादन को बहुत ही कम समय में खत्म करना है:

if [ "$EUID" = 0 ]; then
   echo "This script must NOT be run as root" 
   exit 1
fi

वैकल्पिक रूप से, आप अपनी स्क्रिप्ट को एक कमबैक उपयोगकर्ता के रूप में फिर से निष्पादित कर सकते हैं (उदाहरण के लिए sudo -u FALLBACK_USER "$0") केवल गर्भपात करने के बजाय।

अलग-अलग आदेशों के प्रश्नों को ठीक करने की कोशिश करने से आपकी स्क्रिप्ट अनावश्यक रूप से जटिल और डीबग करने में कठिन हो जाएगी। हर बार जब आप इसे संशोधित करते हैं, तो आपको सभी परीक्षण दो बार (एक नियमित उपयोगकर्ता के रूप में, फिर root) के रूप में करने होंगे, और rootउत्पन्न होने वाले सभी संबंधित कीड़े को ठीक करना होगा । यह एक भविष्य-प्रूफ समाधान नहीं है, इसलिए कहने के लिए।


6

मूल एफ़ाउंड के साथ बनाई गई डिफ़ॉल्ट फ़ाइलों की अनुमति है जैसे:

-rw-r--r-- 1 root root 0 11 17 23:25 rootfile.txt

यहाँ फ़ाइल रूट उपयोगकर्ता और रूट समूह से संबंधित है, और रूट द्वारा पठनीय और लिखने योग्य है, लेकिन केवल दूसरों द्वारा पठनीय है।

सरलतम तरीका सिर्फ chownमूल उपयोगकर्ता के लिए फ़ाइल को वापस करना होगा।

chown username:group_name dummy.txt

आप $SUDO_USERवैरिएबल का उपयोग कर सकते हैं जो केवल तब ही एक्सेस किया जा सकता है जब sudoउसे कॉल किया जाता है, जैसे:

chown "$SUDO_USER":"$SUDO_USER" dummy.txt

यदि आप नियमित उपयोगकर्ता के रूप में स्क्रिप्ट चला रहे हैं, तो chownभाग की आवश्यकता नहीं है, इसलिए हो सकता है कि आप &&स्क्रिप्ट के रूट के रूप में केस के परीक्षण के लिए if-statement या परीक्षण का उपयोग कर विचार करना चाहें , और इन पंक्तियों के साथ कुछ करें:

#!/bin/bash
touch dummy.txt
[ $UID -eq 0 ] && chown "$SUDO_USER":"$SUDO_USER" dummy.txt

ऊपर दृष्टिकोण की सिफारिश की है। अन्य हैं, जैसे chmodकि उपयोगकर्ताओं और समूह के लिए पठन-लेखन-निष्पादन की अनुमति को बदलने के लिए उपयोग करना, लेकिन इसकी अनुशंसा नहीं की जाती है।


आपके जवाब के लिए धन्यवाद। लेकिन क्यूआई में केवल वास्तविक मामले में सरल परिदृश्य को समझाया गया है मूल स्क्रिप्ट कई फाइलें बना रही होगी। Linux में हम सिर्फ sudo को अनदेखा नहीं कर सकते?
बेनामी

1
@ अनाम यदि आप पूरी स्क्रिप्ट को निष्पादित कर रहे हैं sudo, तो नहीं - आप इसे अनदेखा नहीं कर सकते। आपका विकल्प या तो नियमित उपयोगकर्ता के रूप में स्क्रिप्ट चलाया जाता है (जो मुझे समझ में नहीं आता है कि आप ऐसा क्यों नहीं करते हैं, क्योंकि आप बस यहां अपने उपयोगकर्ता के लिए एक फ़ाइल बना रहे हैं) या मेरे जवाब में फ़ाइल स्वामित्व को बदल दें जैसे मैं दिखाता हूं।
सेर्गेई कोलोडियाज़नी

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