एक sudo के साथ कमांड की एक पंक्ति निष्पादित करें


21

उदाहरण के लिए यदि मैं एक फ़ाइल बनाना चाहता हूं और एक पंक्ति में पाठ दर्ज करना चाहता हूं, तो मैं >ऑपरेटर के उपयोग के साथ आउटपुट को फ़ाइल में पुनर्निर्देशित कर सकता हूं :

echo "something" > /path/foobar

लेकिन अगर मेरे पास फ़ोल्डर नहीं है /path/और sudo के निजीकरण की आवश्यकता है, तो मैं sudo अधिकारों के साथ एक सामान्य उपयोगकर्ता के रूप में एक ही कमांड कैसे प्राप्त कर सकता हूं?

मैंने कोशिश की

sudo echo "something" > /path/foobar

लेकिन वह काम नहीं करता है, क्योंकि sudo केवल के लिए मायने रखता है editलेकिन के दाहिने हिस्से
के लिए नहीं>

इसके बजाय , मैं इसके साथ sudo suया उपयोग teeकरने से पहले रूट हो सकता है :

echo "something" | sudo tee /path/foobar

लेकिन मैं एक समाधान खोजना चाहूंगा जहां मैं अंतिम पंक्ति के साथ प्रतिस्थापन के रूप में काम कर सकता हूं

sudo !!

क्या अंतिम पंक्ति को "रीसायकल" करने और sudoसामने जोड़ने का कोई तरीका नहीं है ?



यह कोई डुप्लिकेट नहीं है। मैंने असली क्यूबर्न निकाला और शीर्षक बदल दिया। अब यह वही है जो मैं वास्तव में देख रहा हूँ
rubo77

यह निश्चित रूप से एक डुप्लिकेट था , लेकिन यह अब कुछ अलग है। यह मुझे ऐसा लगता है जैसे आपने Boogy के उत्तर के प्रकाश में प्रश्न को फिर से लिखा, जो कि ठीक है - यह एक अच्छा उत्तर है। मैंने अपने करीबी वोट को वापस ले लिया है, लेकिन यह अभी भी अपरिहार्य है (लोग अक्सर इस मुद्दे पर ध्यान दिए बिना एक प्रश्न एक बार स्वचालित रूप से वोट देते हैं): एक टिप्पणी @goldilocks को संबोधित करें जब यह बंद हो जाता है और मैं फिर से खोलने के लिए मतदान करूंगा । ऐसा होने पर आप चैट में भी अपना मामला दर्ज कर सकते हैं ।
गोल्डीलॉक्स

जवाबों:


13

आप केवल sudoशेल कमांड के सामने नहीं टिक सकते हैं , आपको उस कमांड का फिर से मूल्यांकन करने के लिए एक शेल इनवॉइस करना होगा (वैरिएबल का विस्तार करना, रीडायरेक्ट ऑपरेटर्स के लिए फाइल खोलना, जैसी चीजें करना)। तो यह है

sudo bash -c !!

सिवाय इसके कि यह काफी काम नहीं करता है, क्योंकि !!पिछले कमांड, विशेष वर्णों और सभी के पाठ को इंटरपोल करता है। आपको कमांड के पाठ को एक स्ट्रिंग के रूप में पुनः प्राप्त करने और तर्क के रूप में पास करने की आवश्यकता है sh। सौभाग्य से, पार्टी के fcbuiltin आप that¹ काम करने दिया।

sudo bash -c "$(fc -ln -1)"

या फिर, बैश के उसी संस्करण को लागू करना सुनिश्चित करें जो वर्तमान में चल रहा है:

sudo "$BASH" -c "$(fc -ln -1)"

ध्यान दें कि चूंकि कमांड को एक अलग शेल प्रक्रिया में निष्पादित किया जाता है, इसलिए इसमें पर्यावरण चर (केवल वे ही होते हैं जो sudoसंरक्षित करते हैं, मन), लेकिन आंतरिक चर नहीं खोलते हैं। शेल विकल्प (जैसे kshglob) और अन्य सेटिंग्स या तो डिफ़ॉल्ट से शुरू होंगी।

एक ही कमांडो zsh और ksh में काम करता है, हालाँकि ATT ksh93 को to firstऔर lastनंबर दोनों को पास करने की आवश्यकता होती है fc(जो कि bash, zsh और pdksh / mksh में भी काम करता है):

sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"

$0रनिंग शेल के निष्पादन योग्य को नामित करने के लिए उपयोग करना केवल तभी होता है जब शेल को $ PATH और $ PATH द्वारा परिवर्तित नहीं किया गया हो या निरपेक्ष पथ के माध्यम से किया गया हो।

यहाँ zsh में एक और तरीका है जो थोड़ा स्पष्ट है लेकिन अधिक लंबा है:

sudo zsh -c $history[$[HISTCMD-1]]

चेतावनी का एक अंतिम शब्द: sudoसंभावित खतरनाक आदेशों के लिए है। इसे उपयोग करने के लिए बहुत आसान मत बनाओ!

¹ शुरुआत में कुछ अतिरिक्त व्हाट्सएप है और कमांड प्रतिस्थापन अंत में newlines से स्ट्रिप्स करता है, लेकिन शेल का सिंटैक्स इसकी परवाह नहीं करता है।
B मुझे नहीं लगता कि zsh या ksh के पास बैश जैसा कुछ भी है $BASH; $0केवल तभी काम करता है जब यह एक निरपेक्ष पथ हो, या जब इसमें कोई स्लैश न हो और कमांड खोज पथ परिवर्तित नहीं हुआ हो।
AT ATT ksh में एक उपनाम है लेकिन यह उतना ही अच्छा है। fchist


9

यदि आप sudo के साथ एक ही कमांड को फिर से करना चाहते हैं !! इस तरह एक कमांड करने के बाद:

echo "something">/path/file

कमांड को याद करने के लिए आप वैश्विक प्रतिस्थापित सिंटैक्स का उपयोग करते हैं:

!!:gs/>/|sudo tee -a /

-A पैरामीटर के बाद किसी स्थान का उपयोग करें ।

यह सूदो के बराबर है !! लेकिन आपको <और> के लिए sudo प्रतिबंधों को बायपास करने में मदद करता है। क्योंकि sudo आपको [<,>] का उपयोग करने की अनुमति नहीं देता है।


पुनर्निर्देशन के लिए सामान्य तौर पर सुडोल प्रतिबंधों को दरकिनार करने के लिए आप इसे इस तरह से उपयोग कर सकते हैं:

echo "something" | sudo tee myfile

टी कमांड आपको मानक इनपुट से पढ़ने और मानक आउटपुट और फ़ाइलों को लिखने की अनुमति देगा

यदि आप कमांड को दोहराना चाहते हैं और फाइल में एक टेक्स्ट जोड़ना चाहते हैं, तो टी कमांड को अप्लाई करने के लिए -a विकल्प है। इसलिए आप कमांड को वापस बुला सकते हैं

sudo !!

और पाठ फ़ाइल में जोड़ा जाएगा

उदाहरण:

echo "something" | sudo tee -a /path/file
sudo !!

अच्छा समाधान है, लेकिन याद रखना थोड़ा कठिन है। मैं कैसे एक कमांड का उपयोग कर के लिए एक उपनाम बना सकते हैं !! पिछले आदेश को याद करने ?
rubo77

क्या -aवास्तव में जरूरत है? >एक फाइल को अधिलेखित tee -aकरेगा, जो करेगा, जो होगा>>
rubo77

3

यह उतना ही सरल लगता है sudo sh -c "!!":

$ cd /
$ echo hello > foo
bash: foo: Permission denied
$ sudo sh -c "!!"
sudo sh -c "echo hello > foo"
$ ls -l foo
-rw-r--r-- 1 root root 6 Jun 20 16:21 foo

3
यदि कमांड उद्धरण का उपयोग करता है, तो यह जरूरी नहीं है कि समकक्ष है। विचार करें echo "foo bar"कि कौन सा ऐसा हो जाएगा sh -c "echo "foo bar""जो केवल के fooबजाय मुद्रित करेगा foo bar
गॉडलीजेक

मैंने sudo sh -c '!!'इसके बजाय अगर आपकी आज्ञा की कोशिश की, लेकिन यह भी काम नहीं करता है
rubo77

फिर क्या होगा यदि आपकी कमांड ने सिंगल और डबल कोट्स दोनों का इस्तेमाल किया हो? या दोहरे उद्धरण और चर विस्तार? उपयोगकर्ता किया है: a=bऔर फिर echo "$a" >fileऔर फिर sudo sh -c '!!'इसे करने के लिए विस्तार होगा sudo sh -c 'echo $a >file'जो के बजाय एक खाली पंक्ति मुद्रित होगा bमें file
गॉडलीजेक

तो शायद वहाँ भी एक बेहतर समाधान है?
Rubo77

1
मुझे नहीं लगता कि कोई भी समाधान है जो 100% समय के बिना काम करेगा और आपको कभी भी कमांड को संशोधित करने की आवश्यकता नहीं होगी। sudoरूट शेल प्राप्त करने के लिए उपयोग करना और फिर कमांड को उसमें चिपकाना और चिपकाना निकटतम होगा, लेकिन यदि कमांड को आपके गैर-रूट शेल में सेट किए गए चर का उपयोग करने की अपेक्षा की जाती है, तो यह विफल हो जाता है। का उपयोग करना sudo sh -c "!!"सरल आदेश के लिए काम करता है ठीक है, लेकिन जटिल लोगों के लिए भरा है। मुझे लगता है कि सबसे अच्छी सलाह यह है कि यह उम्मीद न करें कि कुछ कमांड है जो समय के 100% काम करेगा - कुछ संभव समाधान सीखें और जब यह सबसे उपयुक्त हो तो प्रत्येक को लागू करें।
गॉडलीजेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.