यदि आप वास्तव में काम करना चाहते हैं, तो आप शेल फ़ंक्शन को परिभाषित कर सकते हैं , जो उस तरह से चलने पर एक नया रूट शेल चलाता है, और बस नियमित कमांड को अन्यथा चलाता है ।sudo cd directorybashsudosudo
जैसा कि अन्य उत्तरों में प्रस्तुत किया गया है, अधिकांश उपयोगकर्ता ऐसा करने से परेशान नहीं होना चाहते हैं, बल्कि इसके बजाय:
- दौड़ें
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 directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo एक नया, इंटरैक्टिव एक है कि आप उपयोग कर सकते हैं के साथ खोल मार।
यहाँ एक उदाहरण है कि कैसे शेल फ़ंक्शन स्वचालित रूप से "सही काम करता है।" सूचना जो 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खुद निर्देशिका जोड़ें ।