सुडो: स्रोत: कमांड नहीं मिला


54

मैं बैश के लिए कुछ डिफॉल्ट प्रोफाइल को अपडेट कर रहा हूं, और मैंने जिन ट्यूटोरियल्स का अनुसरण कर रहा था, उनसे देखा कि मैं नए प्रोफाइल को नई एनवायरनमेंट सेटिंग्स के साथ उपयोग करके पुनः लोड कर सकता हूं:

source /etc/bash.bashrc

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

जब मैं उपयोग करने की कोशिश करता हूं:

sudo source /etc/bash.bashrc

मुझे त्रुटि मिली:

sudo: source: command not found

वहाँ टर्मिनल और पुनः आरंभ करने के लिए बिना sudo के लिए नए bash प्रोफ़ाइल सेटिंग्स में लोड करने का एक सरल तरीका है?

- शुरू में, मैं कुछ इंस्टॉलर स्क्रिप्ट्स का उपयोग कर रहा था, जो चरों को संदर्भित करती थीं। मैंने पाया कि जब वे स्क्रिप्ट्स को सीधे एक्सेस कर सकते हैं, जब मैं स्क्रिप्ट्स को सीधे कॉल करता हूं (हालांकि, यह निर्देशिका बनाने के साथ बाद की समस्या पैदा करेगा क्योंकि मुझे रूट करने की आवश्यकता है), sudo का उपयोग करके स्क्रिप्ट स्थापित न करें।

मैंने इन सरल आदेशों के साथ परीक्षण करके यह साबित कर दिया:

echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE

पहला वेरिएबल के वैल्यू को आउटपुट करेगा, लेकिन दूसरा कुछ भी आउटपुट नहीं करेगा।


आपने सूडो से चर का उपयोग करने की कोशिश कैसे की? कृपया ध्यान दें कि यदि आप "sudo कमांड $ चर" का उपयोग करते हैं, तो यह आपके शेल से वेरिएबल को बदलेगा, न कि sudo के वातावरण से।
जोओ पिंटो

जवाबों:


72

समस्या यह है कि sourceएक बैश बिल्ड-इन कमांड (प्रोग्राम नहीं है - जैसे lsया grep)। मुझे लगता है कि एक दृष्टिकोण रूट के रूप में लॉगिन करना है और फिर स्रोत कमांड निष्पादित करना है।

sudo -s
source /etc/bash.bashrc

3
आप सही हैं कि समस्या यह है कि sourceशेल बिलिन है। sudo suयह कहने का एक अजीब तरीका है - यह कहने के लिए बेहतर है sudo -sजो सूडो के कहने का अपना तरीका है "इस उपयोगकर्ता के रूप में एक शेल शुरू करें।" आपका एक-पंक्ति संस्करण काम नहीं करेगा क्योंकि इसमें से प्रत्येक कमांड मुख्य उपयोगकर्ता के शेल द्वारा एक अलग उपप्रकार में चलाया जाता है।
पूली

1
सही। प्लस BASH लॉगिन समय पर पढ़ता है / आदि / bashrc। तो आप उस उपयोगकर्ता का वातावरण प्राप्त करने के लिए -, -l, या --login स्विच के साथ-साथ 'su' का उपयोग कर सकते हैं: 'सुडो su -' रूट या 'su - $ उपयोगकर्ता नाम' बनने के लिए दूसरा उपयोगकर्ता बनने के लिए।

"एक पंक्ति" उदाहरण काम नहीं करेगा क्योंकि suएक नया शेल शुरू होता है और "स्रोत" समाप्त होने के बाद ही चलाया जाता है। पहला उदाहरण केवल तभी काम करता है जब रूट शेल के अंदर दूसरी लाइन का उपयोग किया जाता है
लोवेबर्ग

sudo -sसे बेहतर कोई नहीं है sudo su। इसका कोई प्रभाव नहीं होगा।
लोवबॉर्ग

1
sudo -sएक शेल शुरू करने का एक समान प्रभाव पड़ता है, लेकिन मुझे लगता है कि दो "एक और उपयोगकर्ता" कमांड बनने के लिए जब कोई ऐसा करेगा, तो यह असंगत लगता है।
पूलि

14

समस्या यह नहीं है कि sourceशेल शेल कमांड है। तथ्य यह है कि यह वही है जो वास्तव में आपको command not foundत्रुटि फेंक रहा है , लेकिन इसका मतलब यह नहीं है कि अगर यह होता तो यह काम करता।

वास्तविक समस्या यह है कि पर्यावरण चर कैसे काम करते हैं। और वे इस तरह काम करते हैं: हर बार एक नई प्रक्रिया शुरू की जाती है, अगर कुछ भी नहीं होता है, तो यह अपने माता-पिता के पर्यावरण को विरासत में मिला है। इसके कारण, एक सबशेल का उपयोग करना (जैसे bashकि बैश उदाहरण के अंदर टाइप करना ) और इसके आउटपुट को देखते envहुए इसके माता-पिता के समान परिणाम देना चाहिए।

हालांकि, कैसे sudoकाम करता है (जैसा कि इसके मैनपेज में बताया गया है) के कारण, sudo उपयोगकर्ता के पर्यावरण को छीनने और दबाने वाले उपयोगकर्ता के लिए "डिफ़ॉल्ट" वातावरण बनाने की कोशिश करता है, ताकि कमांड रन ऐसे चलाए जाए जैसे कि उपयोगकर्ता ने इसे लागू किया था कॉलिंग उपयोगकर्ता (जो अपेक्षित व्यवहार है) किया गया है, और इस प्रकार nautilus चल रहा है जैसा कि sudo nautilusफ़ोल्डर में एक फ़ोल्डर खोलना चाहिए /root, और नहीं /home/yourusername

इसलिए:

कुछ करना sudo source script.shऔर फिर sudo command, भले ही यह काम किया हो, यह बाद में किसी भी चर को स्थापित करने में सफल नहीं होगा sudo command

पर्यावरण चर को पास करने के लिए, आप या तो वातावरण को संरक्षित करने के लिए sudo को बता सकते हैं ( -Eस्विच के माध्यम से ; और अपने sudoers फ़ाइल में उपयुक्त अनुमति होने के बाद) और / या इसे कमांड के रूप में सेट करने के लिए sudo VAR1=VALUE1 VAR2=VALUE2 command


4

बाश प्रक्रिया प्रतिस्थापन का उपयोग कर आप कर सकते हैं:

source <(sudo cat /etc/bash.bashrc)

1
यह नई सेटिंग्स के साथ एक रूट शेल शुरू करने में कैसे मदद करेगा, जो कि ओपी क्या करना चाहता है?
मुरु

1
ओपी वास्तव में पूछ रहा था कि एक शेल से "... नई प्रोफ़ाइल को कैसे पुनः लोड करें ..." प्रोफ़ाइल sudoको एक्सेस करने के लिए उपयोग करने की आवश्यकता है । ऊपर sudo: source: command not foundबताए गए मुद्दे से बचने के दौरान प्रोफ़ाइल को आयात करने का एक साधन प्रदान करता है ।
टॉमडॉटकॉम

"केवल एक चीज है - नया पर्यावरण चर केवल मेरे वर्तमान उपयोगकर्ता के लिए उपलब्ध था - और जब मुझे sudo का उपयोग किया गया था तो उसे अनदेखा कर दिया गया था।"
मूरू

3

जैसा कि मार्कोस कहते हैं , यहां आपकी मुख्य समस्या sourceशेल बिलिन कमांड है जो केवल शेल प्रक्रिया को प्रभावित करती है जिसमें यह चलता है।

आसान उपाय यह है कि बस एक नया खोल जड़ के रूप में शुरू किया जाए, और /etc/bash.bashrcजब यह शुरू होता है तो स्वचालित रूप से बैश हो जाएगा । यह सिर्फ कहने के रूप में सरल है

sudo bash

2

टर्मिनल को बंद करने और फिर से खोलने से चीजों को नहीं बदलना चाहिए। डिफ़ॉल्ट रूप से, sudo पर्यावरण को स्ट्रिप्स करता है। अक्षम करने के लिए, sudo में -E जोड़ें।


2

त्रुटि इसलिए होती है क्योंकि आप जिस बाइनरी को कमांड लाइन से कॉल करने का प्रयास कर रहे हैं वह वर्तमान उपयोगकर्ता के PATH वैरिएबल का केवल एक हिस्सा है, लेकिन रूट उपयोगकर्ता के PATH का हिस्सा नहीं है।

आप जिस बाइनरी तक पहुँचने का प्रयास कर रहे हैं, उसका पता लगाकर आप इसे सत्यापित कर सकते हैं। मेरे मामले में मैं "बेटरकैप-एनजी" कॉल करने की कोशिश कर रहा था। तो मैं भागा,

$ which bettercap-ng
/home/user/work/bin/bettercap`

मैंने जाँच की कि क्या यह स्थान मेरे रूट उपयोगकर्ता के PATH का हिस्सा है।

$ sudo env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

इसलिए सूडो को बाइनरी नहीं मिल रही है जिसे मैं कमांडलाइन से कॉल करने की कोशिश कर रहा हूं। इसलिए त्रुटि कमांड नहीं मिला।

नीचे दिए गए बाइनरी को कॉल करते समय आप वर्तमान उपयोगकर्ता के पैट का उपयोग करने के लिए sudo को निर्देशित कर सकते हैं।

sudo -E env "PATH=$PATH" [command] [arguments]

वास्तव में, कोई इससे बाहर एक उपनाम बना सकता है:

alias mysudo='sudo -E env "PATH=$PATH"'

मूल सूडो के स्थान पर उर्फ ​​खुद सूडो का नाम देना भी संभव है।

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