TL; DR: आप परिभाषित फ़ंक्शनsudo -i
को चलाने के लिए उपयोग कर सकते हैं (लेकिन उर्फ नहीं) और उस फ़ाइल से निर्यात किए गए चर तक भी पहुंच सकते हैं:/root/.bashrc
sudo -i कमांड तर्क
उपनाम वहाँ काम नहीं करते हैं, यद्यपि, लेकिन यदि आप उन्हें उपलब्ध कराना चाहते हैं तो आप उन्हें आसानी से कार्यों में बदल सकते हैं sudo -i
।
पूर्ण विश्लेषण और अधिक विवरण के लिए आगे पढ़ें।
यहाँ कुछ समस्याएं हैं, कुछ सूडो कैसे काम करती हैं और कुछ कैसे स्वयं काम करती हैं ...
डिफ़ॉल्ट रूप से, sudo
केवल कमांड की तलाश करेगा और शेल को बायपास करेगा, इसलिए केवल रनिंग sudo ll
केवल तभी काम करेगी जब इसमें ll
मौजूद किसी निर्देशिका में निष्पादन योग्य हो $PATH
। तो, उपनाम (या फ़ंक्शंस) का उपयोग करने के लिए आपको यह सुनिश्चित करने की आवश्यकता है कि प्रक्रिया के हिस्से के रूप में एक शेल लागू किया गया है।
एक तरह से कुछ चलाने के लिए होगा sudo sh
या sudo bash
, हालांकि आधुनिक sudo
(मैं sudo 1.8.19p1 पर यह परीक्षण कर रहा हूं) विकल्प हैं -s
और -i
उस उद्देश्य के लिए।
तो एक कोशिश कुछ इस तरह की होगी sudo -s ll
(जो sudo bash -c 'll'
आपके समकक्ष है , मान $SHELL
लेना बश है, जो rcfile
आपके द्वारा बताए गए मामले के आधार पर प्रतीत होता है ।) लेकिन यह या तो काम नहीं करता है, क्योंकि यह एक गैर-संवादात्मक रूप से शेल को शुरू करता है। गैर-लॉगिन मोड, जो अपनी किसी भी स्टार्टअप फ़ाइल को नहीं पढ़ता है। यह अनिवार्य रूप से एक ही है जैसे कि आप एक शेल स्क्रिप्ट लिखते हैं और #!/bin/bash
इसे चलाने के लिए उपयोग करते हैं। आपके पास जो उपनाम (कार्य) हैं, वे ~/.bashrc
उस स्क्रिप्ट से सुलभ नहीं होंगे ...
तो अगला -i
विकल्प है, जो एक लॉगिन शेल बनाता है। यही कारण है कि अधिक का वादा है, क्योंकि यह होगा अपने स्टार्टअप फ़ाइलों को पढ़ने! और फिर भी, sudo -i ll
(समतुल्य sudo bash -l -c 'll'
) अभी भी काम नहीं करेगा। तो कैसे कि संभव है, यह देखते हुए यह था की परिभाषा पढ़ा ll
उर्फ?
खैर, यहां अगला स्पष्टीकरण यह है कि डिफ़ॉल्ट रूप से, बैश एलियास का विस्तार नहीं करेगा, सिवाय इसके कि जब शेल इंटरैक्टिव हो ... यह शेल sudo -i
(या bash -l
) द्वारा शुरू किया गया एक लॉगिन शेल है, लेकिन अभी भी इंटरैक्टिव नहीं है।
तो अगला कदम एक इंटरैक्टिव शेल प्राप्त करना है , जो तब काम करता है :
sudo bash -i -c 'll'
( लॉगिन और इंटरेक्टिव दोनों होना भी ठीक है, निश्चित रूप से, bash -l -i -c ...
काम करेगा।)
एक अन्य विकल्प लॉगिन शेल (गैर-संवादात्मक) का उपयोग करना है, लेकिन इसे स्पष्ट रूप से उपनामों का विस्तार करने के लिए कहें, इसलिए यह भी काम करेगा:
sudo bash -l -O expand_aliases -c 'll'
(वह मामला जहां बैश इंटरैक्टिव था , उसे लॉगिन शेल की आवश्यकता नहीं थी , क्योंकि यह आरंभिक फ़ाइलों को पढ़ने के लिए पर्याप्त है, लेकिन इसे -l
पढ़ने के लिए किसी को भी पढ़ने की आवश्यकता नहीं है।)
ये काफी लंबी कमांड लाइनें हैं ... और उन्हें यह भी आवश्यकता होती है कि आप पूरे शेल कमांड को उद्धृत करते हैं, इसलिए यदि आप किसी उर्फ को तर्कों के साथ बुला रहे हैं, तो आपको उस सब को एक स्ट्रिंग में बदलना होगा ... तो यह एक तरह से है अनाड़ी उपयोग करने के लिए ...
ध्यान दें कि पहले मैं उपनाम और कार्यों के बारे में बात कर रहा था ... यह उद्देश्य पर था, क्योंकि फ़ंक्शन वास्तव में यहां बहुत अधिक सुविधाजनक हैं। जब तक आप उनकी परिभाषा का उपयोग कर रहे हैं, तब तक किसी कार्य को करने के लिए आपको कुछ विशेष (जैसे कि एक इंटरैक्टिव शेल होने या किसी विशिष्ट विकल्प को सेट करने) की आवश्यकता नहीं है।
इसलिए यदि आप एक उपनाम के बजाय ll
एक फ़ंक्शन के रूप में परिभाषित करते हैं , तो आप इसे सीधे sudo के -i
शॉर्टकट के साथ उपयोग कर पाएंगे :
sudo -i ll
और यदि आपके पास एक लंबी कमांड-लाइन है, तो तर्कों के साथ, आप उन्हें सीधे यहाँ भी पास कर सकते हैं:
sudo -i ll -C -R /etc
(तुलना करें sudo bash -i -c 'll -C -R /etc'
)
फ़ंक्शंस भी बहुत अधिक लचीले होते हैं और आमतौर पर बनाए रखने में आसान होते हैं ... आमतौर पर एक उपनाम को एक फ़ंक्शन में बदलना आसान होता है, केवल कैविएट हमेशा उपयोग होता है "$@"
जहां आप अतिरिक्त तर्क लेने की उम्मीद करेंगे (आमतौर पर अंत में) उर्फ।)
उदाहरण के लिए, यह उपनाम:
alias ll='ls $LS_OPTIONS -l'
इस फंक्शन में बदल सकते हैं:
ll () {
ls $LS_OPTIONS -l "$@"
}
वे, अधिकांश उद्देश्यों के लिए, समतुल्य हैं। और, जैसा कि पहले उल्लेख किया गया है, फ़ंक्शन सीधे से सुलभ होना चाहिए sudo -i
, ताकि एक अतिरिक्त बोनस हो।
मुझे आशा है कि आपको यह उत्तर और स्पष्टीकरण सहायक होगा!
/root/.bashrc
लेकिन वास्तव में क्यू क्या है इस फाइल से उपनाम है - यह प्रति संभव नहीं है - unix.stackexchange.com/questions/1496/… ।