यदि आप वास्तव में काम करना चाहते हैं, तो आप शेल फ़ंक्शन को परिभाषित कर सकते हैं , जो उस तरह से चलने पर एक नया रूट शेल चलाता है, और बस नियमित कमांड को अन्यथा चलाता है ।sudo cd directory
bash
sudo
sudo
जैसा कि अन्य उत्तरों में प्रस्तुत किया गया है, अधिकांश उपयोगकर्ता ऐसा करने से परेशान नहीं होना चाहते हैं, बल्कि इसके बजाय:
- दौड़ें
sudo -s
, या sudo -i
यदि आप एक लॉगिन शेल चाहते हैं (याद रखें कि इसका एक प्रभाव sudo -i
आपको रूट के होम डायरेक्टरी में शुरू करने के लिए है), या sudo bash
यदि आप फोर्स करना चाहते हैं bash
या शेल के विकल्पों को पास करने में सक्षम हैं।
- नए शेल में चलाएं ।
cd directory
- नए शेल में रूट के रूप में जो भी (अन्य) क्रियाएं की जानी हैं, उन्हें करें।
- एक बार
exit
हो जाने के बाद, नया शेल छोड़ने के लिए दौड़ें । यह महत्वपूर्ण है कि आप इसे भूल न जाएं, क्योंकि आप जड़ से अधिक कार्य नहीं करना चाहते हैं।
इसलिए, यदि आप चाहते हैं, तो आप एक शेल फ़ंक्शन (या एक स्क्रिप्ट) लिख सकते हैं जो उन दो क्रियाओं में से पहला प्रदर्शन करता है जब sudo
उसके बाद होता है cd
, और बस sudo
सामान्य रूप से चलता है अन्यथा। कृपया इसे सीखने के विकल्प के रूप में उपयोग न करें sudo cd
, अन्यथा सफल क्यों नहीं होता है , क्योंकि यदि आप यह नहीं समझते हैं कि क्या चल रहा है, तो आप संभवतः एक नए शेल में होने से बहुत भ्रमित होंगे (और आप किसी त्रुटि संदेश को नहीं समझ सकते हैं पाए जाते हैं)।
इस तरह के एक शेल फ़ंक्शन को लिखने का एक तरीका है, जो आपको यह भी याद दिलाता है कि आप एक नए शेल में हैं और exit
जब आप समाप्त कर लें तो आपको इससे बाहर होना चाहिए । (यह याद दिलाने के उपयोगकर्ताओं के लिए उपयोगी होने की संभावना है किसी भी , क्योंकि एक नहीं आम तौर पर आदी एक नया खोल में किया जा रहा है जब एक चलाता है कौशल स्तर sudo
के बिना -s
, -i
या एक तर्क के रूप में एक वास्तविक खोल के नाम।)
# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
if [ "$#" -eq 2 ] && [ "$1" = 'cd' ]; then
sudo bash -c '
if cd -- "$2"; then # When cd fails, its own message is enough.
printf "%s: Running %s shell in %s\n" "$0" "$USER" "$2" >&2
printf "%s: Type \"exit\" once you are done!\n" "$0" >&2
exec bash # Replace this bash shell with an interactive one.
fi
' bash _ "$2" # Use $2 as the dir in the intermediate shell, too.
else
command sudo "$@"
fi
}
आप इसे अपने में डाल सकते हैं ~/.bashrc
, हालांकि यह उपयोग करने के लिए एक अजीब पर्याप्त तरीका है sudo
जिसे आप केवल कभी-कभी सक्षम करना चाहते हैं। उस स्थिति में, इसे अपनी फ़ाइल में रखना बेहतर है। यदि आप sudo.bash
उन सामग्रियों के साथ अपने घर निर्देशिका में नामक एक फ़ाइल बनाते हैं, तो आप sudo
फ़ंक्शन को उपलब्ध करा सकते हैं - ताकि यह नियमित sudo
कमांड के बजाय - रन करके . ~/sudo.bash
। यह वर्तमान शेल और उसके बच्चे के गोले में प्रभावी होता है, लेकिन अन्य नहीं। उसी कारण से जैसे फाइलें .bashrc
निष्पादन योग्य नहीं हैं, sudo.bash
निष्पादन योग्य को चिह्नित नहीं करते हैं chmod
। यह वास्तव में एक लाइब्रेरी है, बजाय एक स्टैंडअलोन शेल स्क्रिप्ट के। अगर तुमने कियाइसे शेल स्क्रिप्ट के रूप में चलाएं, यह फ़ंक्शन को परिभाषित करेगा ... लेकिन केवल शेल में जो स्क्रिप्ट को चलाता है, आपके लिए कॉलर के रूप में नहीं। (निश्चित रूप से, आप इसके लिए एक स्क्रिप्ट लिख सकते हैं , कि मेरे द्वारा यहाँ लिया गया दृष्टिकोण नहीं है।)
यह देखने और देखने के लिए कि sudo
क्या वर्तमान में शेल फ़ंक्शन के रूप में परिभाषित किया गया है, और इसकी वर्तमान परिभाषा देखने के लिए यदि यह एक है, तो चलाएं type sudo
। एक बार इसे परिभाषित करने के लिए फ़ंक्शन (यानी, अपरिभाषित) को अक्षम करें, चलाएं unset -f sudo
। मैन्युअल रूप से नियमित sudo
कमांड चलाने के लिए भले ही शेल फ़ंक्शन परिभाषित हो, चलाएं command sudo
। हालांकि, ध्यान रखें कि आप नहीं है कि है , ऐसा करने के लिए इस वजह से sudo
समारोह वास्तव में अधिक या कम से कम दो तर्क यह या पहले तर्क के लिए पारित पारित कर दिया है जो अपने आप जब भी देखते हैं यह लेकिन कुछ भी है के लिए करता है cd
। इसलिए आप इसे अभी भी सामान्य तरीके से लोगों द्वारा उपयोग में ला सकते हैं sudo
।
ध्यान दें कि ऊपर दिखाया गया शेल फ़ंक्शन अभी भी आपको अन्य तर्कों को पारित करने देता है sudo
, लेकिन यह cd
विशेष रूप से इलाज करने से रोक देगा । विशेष रूप से चलाना समर्थित नहीं है, हालांकि आप उस मामले का समर्थन करने के लिए शेल फ़ंक्शन का विस्तार कर सकते हैं। और न ही है । यह जो शेल बनाता है वह आपके साथ मिलने वाले समान है । कोड वास्तव में नहीं चलता है , लेकिन उपयोग करता है , इसलिए विकल्प ठीक से काम करता है। यह वास्तव में दो बार चलता है जब आप पास होते हैं और एक निर्देशिका तर्क (और शून्य बार अन्यथा)। जब आप दौड़ते हैं , तो सबसे पहले यह एक अलग बैश शेल को बंद करता है, जिस पर आप फंक्शन चला रहे हैं और डायरेक्टरी को बदलते हैं। यदि वह सफल होता है, तो वह बदल देता हैsudo -u user cd directory
sudo -i cd directory
sudo -s
sudo -s
sudo bash
-c
bash
cd
sudo cd directory
sudo
एक नया, इंटरैक्टिव एक है कि आप उपयोग कर सकते हैं के साथ खोल मार।
यहाँ एक उदाहरण है कि कैसे शेल फ़ंक्शन स्वचालित रूप से "सही काम करता है।" सूचना जो sudo ls -A /root
सामान्य रूप से व्यवहार करती है। केवल जब मैं cd
एक निर्देशिका के साथ sudo
एक नया शेल बनाने का प्रयास करता हूं, और मुझे स्पष्ट रूप से याद दिलाया जाता है कि क्या चल रहा है।
ek@Io:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude .bashrc .config .emacs.d .nano .rpmdb
.bash_history .cache .dbus .local .profile
ek@Io:~$ sudo -k # invalidates my current timestamp... like I left for a while
ek@Io:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
root@Io:/root/.local#
root@Io:/root/.local#
root@Io:/root/.local# exit
exit
ek@Io:~$
यदि आप sudo cd
एक निर्देशिका के लिए प्रयास करते हैं जिसे आप रूट के रूप में भी नहीं बदल सकते हैं, तो आपको बस एक त्रुटि संदेश मिलेगा:
ek@Io:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
ek@Io:~$ sudo -k
ek@Io:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
ek@Io:~$
मैंने sudo -k
उपरोक्त उदाहरणों में इनवोकेशन के बीच यह दिखाने के लिए उपयोग किया है कि यह निर्देशिका बदलने के प्रयास से पहले आपको रूट के रूप में प्रमाणित करता है । लेकिन आपको वास्तव में sudo -k
खुद को चलाने की जरूरत नहीं है । क्योंकि शेल फ़ंक्शन वास्तविक sudo
कमांड के लिए सिर्फ एक पतला आवरण है , आपके क्रेडेंशियल्स और अन्य सामान्य sudo
व्यवहार का कैशिंग अभी भी सामान्य रूप से काम करता है।
हालांकि यह अच्छी तरह से काम करता है और साफ-सुथरा होता है, लेकिन मैं मानता हूं कि असली sudo
कमांड को उसी नाम के फंक्शन में छाया देना सुपर अजीब है। अधिकांश उपयोगकर्ताओं को शायद सिर्फ चरणों को पूरा करना चाहते हैं sudo -s
, खुद को। लेकिन अगर कोई ऐसा चाहता है - और यह भी प्रदर्शित करने के लिए कि यह संभव है - वहाँ यह है।cd directory
ls -l
खुद निर्देशिका जोड़ें ।