शेल स्क्रिप्ट चलाते समय उपयोगकर्ता को रूट के रूप में लॉगिन करने के लिए प्रेरित करें


17

मुझे जो समस्या आ रही है, जब मैं कमांड दर्ज करता हूं,

su - root

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

दूसरे शब्दों में, मैं स्क्रिप्ट को किसी भी उपयोगकर्ता के रूप में चलाना चाहता हूं, लेकिन जैसे ही स्क्रिप्ट निष्पादित करना शुरू करता है, उपयोगकर्ता को रूट में बदलना होगा और फिर बाकी स्क्रिप्ट के साथ रूट के रूप में तब तक जारी रखना चाहिए जब तक यह किया नहीं जाता है। क्या यह किया जा सकता है?

जवाबों:


34

यह पूरा करना बहुत आसान है:

#!/bin/sh
[ "$(whoami)" != "root" ] && exec sudo -- "$0" "$@"

जब वर्तमान उपयोगकर्ता रूट नहीं है, तो स्क्रिप्ट को फिर से निष्पादित करें sudo

ध्यान दें कि मैं sudoयहाँ के बजाय का उपयोग कर रहा हूँ su। ऐसा इसलिए है क्योंकि यह आपको तर्कों को संरक्षित करने की अनुमति देता है। यदि आप उपयोग करते हैं su, तो आपकी आज्ञा होगी कि su -c "$0 $@"यदि आपके पास रिक्त स्थान या विशेष शेल वर्ण हैं, तो वे आपके तर्कों को मानेंगे।

यदि आपका खोल बैश है, तो आप बाहरी कॉल से बच सकते हैं whoami:

(( EUID != 0 )) && exec sudo -- "$0" "$@"

क्षमा करें, मैंने स्पष्टीकरण में एक त्रुटि की है, ताकि इसकी गलत व्याख्या की गई हो। यहाँ एक और अधिक स्पष्ट व्याख्या है। सहायता के लिए धन्यवाद!
रेडसन

@ user68857 आपका प्रश्न स्पष्ट था। यह उत्तर वही करता है जो आप चाहते हैं।
पैट्रिक

मुझे यह त्रुटि मिलती रहती है: सुडो: को रूटाइड होना चाहिए
रेडसन

मैं टर्मिनल के माध्यम से स्क्रिप्ट को एक नियमित उपयोगकर्ता के रूप में चलाना चाहता हूं, लेकिन स्क्रिप्ट को उपयोगकर्ता को स्क्रिप्ट के अंत तक रूट करने के लिए स्विच करना चाहिए
Redson

@ बात करें अगर आप मिल रहे हैं sudo: must be setuid root, तो आपके सूडो के साथ कुछ हुआ है। इसे ठीक करने के लिए chmod u+s $(which sudo):। और हां, मैं अच्छी तरह से जानता हूं कि आप क्या करने की कोशिश कर रहे हैं, मैं अपनी स्क्रिप्ट्स में हर समय यही काम करता हूं।
पैट्रिक

7

आप यूआईडी की जांच कर सकते हैं:

 if [ $(id -u) != 0 ]; then
     echo "You're not root"
     # elevate script privileges
 fi

5

आप स्क्रिप्ट को स्वयं कॉल कर सकते हैं और देख सकते हैं:

#! /bin/bash

if [ "root" != "$USER" ]; then
  su -c "$0" root
  exit
fi

...

0

उस बिंदु पर जहां आप लॉगिन करना चाहते हैं, बस निम्नलिखित कमांड जोड़ें

sudo su

यह पूरी तरह से मेरे कोड के साथ काम कर रहा है

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