कैसे सूडो के माध्यम से उर्फ ​​पारित करने के लिए


32

मेरा एक उपनाम है जो कुछ मापदंडों में एक उपकरण के लिए गुजरता है जो मैं अक्सर उपयोग करता हूं। कभी मैं खुद के रूप में चलाता हूं, कभी सूडो के नीचे। दुर्भाग्य से, बेशक, sudo उपनाम को नहीं पहचानता है।

क्या किसी को यह संकेत नहीं है कि कैसे उर्फ ​​से गुजरना है?

इस मामले में, मेरे पास डिबगिंग के दौरान पर्ल के लिए विकल्पों का एक गुच्छा है:

alias pd='perl -Ilib -I/home/myuser/lib -d'

कभी-कभी, मुझे अपने टूल को रूट के रूप में डीबग करना पड़ता है, इसलिए, चलने के बजाय:

pd ./mytool --some params

मुझे इसे सूडो के तहत चलाने की जरूरत है। मैंने कई तरीके आज़माए हैं:

sudo eval $(alias pd)\; pd ./mytool --some params
sudo $(alias pd)\; pd ./mytool --some params
sudo bash -c "$(alias pd)\; pd ./mytool --some params"
sudo bash -c "$(alias pd); pd ./mytool --some params"
sudo bash -c eval\ "$(alias pd)\; pd ./mytool --some params"
sudo bash -c eval\ "'$(alias pd)\; pd ./mytool --some params'"

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

जवाबों:


50

आर्चलिनक्स-विकी में एक बहुत ही सुंदर समाधान पाया जा सकता है:

alias sudo='sudo '
# whitespace ---^

करने के लिए सभी उपनाम पारित करने के लिए काम करता है sudo

स्रोत: http://wiki.archlinux.org/index.php/Sudo#Passing_aliases


16
यह एक महान चाल है! जिज्ञासु के लिए, बैश मैनपेज में उर्फ ​​खंड से स्पष्टीकरण:A trailing space in value causes the next word to be checked for alias substitution when the alias is expanded.
रसेल डेविस

1
यह वास्तव में स्वीकृत उत्तर होना चाहिए।
एड्रियन फ्रुविर्थ

यह शर्म की बात है कि यह कार्यों के लिए काम नहीं करता है।
सिरो सेंटिल्ली 新疆 改造 i i 事件 '

2
नोट: मान लें कि आप एक पारित करने के लिए की जरूरत है विकल्प के लिए sudo, फिर से कि रखना चाहते थे, जबकि sudoएक ही समय में -passthrough चाल। यहां तक ​​कि यह भी किया जा सकता है: फिर से विकल्पों का उपयोग करने के लिए, उपयोग करें \sudo। बैकस्लैश उर्फ को ओवरराइड करेगा । (कई के बारे में पता नहीं लगता है)। इस प्रकार, आप बिना किसी चेतावनी के फ़ाइलों को हटा सकते हैं ( खतरे! ) , आमतौर पर केवल टाइप करके निर्दिष्ट किया हुआ । alias rm='rm -i'.bash-aliases\rm file-to-delete
वाक्यविन्यास

11

मैं असली नहीं हूँ कि तुम क्या करने की कोशिश कर रहे हो। मैं दो तरीके देख सकता हूं:

सही तरीका

alias pd='sudo perl -Ilib -I/home/myuser/lib -d'

तब निष्पादन pd ./mytoolआपके डिबगिंग कमांड को रूट के रूप में निष्पादित करेगा लेकिन फिर भी sudo के लाभ को सुरक्षित रखेगा (ऑडिट ट्रेल, रूट शेल से बाहर संचालन नहीं)।

उदाहरण:

इंसीटे $ उर्फ ​​सिड = 'सुडो आईडी'
इंसीट $ फूट
uid = 0 (रूट) gid = 0 (रूट) समूह = 0 (रूट)

आसान तरीका

एलियट को रूट करने के लिए जोड़ें .bashrcऔर sudo -iजब भी आप रूट करने के लिए सूडो का उपयोग करें ।

root # इको ​​'उर्फ fb = "इको फू बार" >> >> /root/.bashrc
जड़ # निकास
बाहर जाएं
insyte $ सुडो -इ
रूट # एफबी
फू बार

4

बस दो उपनाम हैं और एक चर का उपयोग करें

मैं इसका उपयोग करने का कारण नहीं देखता awkया cutजब तक कि इसे संशोधित करने में आसान बनाने के लिए केवल एक बार कोर उर्फ ​​परिभाषित नहीं किया गया है। अगर ऐसा है, तो यह काम करता है:

# ... in .bashrc ...
pd='perl -Ilib -I/home/myuser/lib -d'
alias pd="$pd"
alias spd="sudo $pd"

यहाँ उपरोक्त के रूप में उपनाम जोड़े बनाने के लिए एक सरलीकृत कार्य किया गया है:

mkap () {
    alias $1=$2
    alias s$1="sudo $2"
}

काम में लाना:

mkap pd 'perl -Ilib -I/home/myuser/lib -d'
mkap ct 'cat'

अब आपके पास pdऔर spdप्लस ctऔर है sct

$ ct /etc/shadow
cat: /etc/shadow: Permission denied
$ sct /etc/shadow
[sudo] password for dennis:
root:[censored]...
$ alias
alias ct='cat'
alias pd='perl -Ilib -I/home/myuser/lib -d'
alias sct='sudo cat'
alias spd='sudo perl -Ilib -I/home/myuser/lib -d'

4

काश मैं दो उत्तरों को "सही" के रूप में चिह्नित कर सकता। Insyte , um, असंवेदनशील पोस्ट से राइट वे का संयोजन , बिल वेइस से awk (या कट) समाधान के साथ, मैं इस के साथ आया हूं:

alias spd="sudo $(alias pd | cut -d\' -f2)"

अब मैं बस जाऊंगा और इसे मेरे .bashrc या कुछ में एक शेल फ़ंक्शन में डालूंगा, और फिर अपने सभी उपनामों के "s" संस्करण बनाऊंगा जिन्हें मैं रूट के रूप में चलाने की इच्छा रखता हूं।

अपडेट : डेनिस विलियमसन के सरलीकृत समारोह का मामूली संशोधन इसे उपयोग करने के लिए थोड़ा आसान बनाता है:

 salias()
 {
   local a c
   a=$(echo "$1" | cut -f1 -d=)
   c=$(echo "$1" | cut -f2- -d=)
   alias $a="$c"
   alias s$a="sudo $c"
 }

इसका मतलब है कि मुझे पूरी कमांड के सामने "एस" रखना होगा। के बजाय:

alias pd='perl -Ilib -I/home/myuser/lib -d'

मैं अभी सामने से एस जोड़ता हूं।

salias pd='perl -Ilib -I/home/myuser/lib -d'

और मैं कर रहा हूँ। निश्चित रूप से, कंप्यूटर कुछ अधिक काम करता है, लेकिन यह एक कंप्यूटर के लिए है। :-)

धन्यवाद!


आप स्वीकार की गई चीज़ों को चिह्नित कर सकते हैं (या करने में सक्षम होना चाहिए), जो उन्हें सही तरीके से चिह्नित करने की तरह है :)
बिल वीस

सही - मैं दो उत्तरों को सही के रूप में चिह्नित करना चाहता हूं :-P
टंकटालस

3
स्लीजर्ड का जवाब क्यों नहीं? alias sudo="sudo "सही काम करता है।
22 अक्टूबर को त्रुक्त्र


3

क्या यह आसान नहीं होगा कि आप किसी ऐसी स्क्रिप्ट को हैक करें जिसमें आपके विकल्प शामिल हों, फिर उसे कहीं एक फ़ोल्डर में रखें जो नियमित खाते और रूट के लिए एक रास्ता है? यह वास्तव में एक स्क्रिप्ट का ज्यादा हिस्सा नहीं लेगा।

#!/bin/bash
exec perl -Ilib -I/home/myuser/lib -d $*

यह वास्तव में $ * के बजाय "$ @" होना है, और यही कारण है कि मैं आमतौर पर इससे बचने की कोशिश करता हूं। ;-) यह काम करता है, यह सिर्फ डिस्क स्पेस का एक गुच्छा बर्बाद करता है जो इसमें शामिल है।
टैंटलैटस

3

यह मोटा है, लेकिन यह यहाँ काम करता है:

houdini@clanspum:~/ > alias fb
fb='echo foo bar'
houdini@clanspum:~/ > alias fb | awk -F\' '{print $2}'
echo foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}')"
foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}') a b c"
foo bar a b c
houdini@clanspum:~/ > fb
foo bar
houdini@clanspum:~/ > fb a b c
foo bar a b c

मैंने यहां एक अधूरा समाधान चिपकाया, फिर ठीक करने के लिए संपादित किया। वर्तमान एक सही है। पहले व्यक्ति को यह बताने के लिए कि क्या यहाँ चल रहा है, टिप्पणी करने के लिए एक नि: शुल्क अपवित्र :)
बिल वीस

मैं जागने की तुलना में सरल तरीके से उम्मीद कर रहा था, लेकिन आशा! = वास्तविकता कभी-कभी ;-) स्पष्ट रूप से, "कट -f2 -d \ '" बस के रूप में अच्छी तरह से काम करेगा, और वह थोड़ा छोटा होगा।
टंकटालस 22

हाँ, कट काम करेगा, मैं हमेशा इसके बारे में भूल जाता हूं।
बिल वीस

3

चुने हुए उपनामों और आदेशों में एक "sudo" उपसर्ग अपने ~/.bashrcजैसे से जोड़ें:

#a regular alias
alias pd='perl -Ilib -I/home/myuser/lib -d'

#sudofy (command id, alias pd - add others to this list)
for cmd in id pd;
      do alias "s$cmd"="sudo $cmd";
done;

यह काम नहीं करता है - यही वह जगह है जहाँ से मैंने शुरुआत की थी। क्या तुमने कोशिश की?
टंकटालस

अच्छी अवधारणा है। मुझे लगता alias sudo="sudo "है कि हालांकि आसान है।
trusktr

3

कुछ समय के बाद, '.bashrc' में करें:

उर्फ सुडो = 'सुडो'

'मैन बैश' और 'हेल्प अलायस' में इसका कारण क्यों बताया गया है:

उपनाम: उर्फ ​​[-पी] [नाम [मूल्य] ...] उपनामों को परिभाषित या प्रदर्शित करें।

Without arguments, `alias' prints the list of aliases in the reusable
form `alias NAME=VALUE' on standard output.

Otherwise, an alias is defined for each NAME whose VALUE is given.
**A trailing space in VALUE causes the next word to be checked for
alias substitution when the alias is expanded.**

1

आप कुछ इस तरह चाहते हैं:

(alias; echo "exec < /dev/tty") | sudo bash  -i

मैं गलत हो सकता हूं, लेकिन ISTR कि bash -i(i = इंटरैक्टिव) केवल v4.0 है। इसलिए पुराने सर्वर पर जो अभी भी bashv3 चल रहा है, यह सबसे अधिक संभावना है। लेकिन मुझे गलत साबित करो, किसी को भी, आगे बढ़ो;)
वाक्यविन्यास

@syntaxerror - आपको गलत याद है। -iबोर्न शेल है, देखें: pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html
17

वाह, उम्मीद नहीं थी कि इतनी जल्दी 6-वर्षीय पोस्ट के लिए उत्तर मिलेगा ... हां, मैंने इसे #!/bin/bash -iशेबंग के बाद भ्रमित कर दिया होगा , जो कि स्पष्ट रूप से समान नहीं है (?)। एक लंबी कहानी को छोटा करने के लिए, historyएक bashस्क्रिप्ट में (और "लाइव" कमांड लाइन पर) का उपयोग करने के लिए विकल्प की आवश्यकता होगी-i , जिसे मैं "केवल" bashv3 स्थापित सर्वर के साथ काम करने में असमर्थ था । और यह एक तथ्य है।
वाक्यविन्यास

1

मुझे नहीं पता कि यह एक प्रोडक्शन बॉक्स पर करने वाली सबसे बुद्धिमानी है लेकिन स्थानीय स्तर पर मैं इसका उपयोग करता हूं

alias sudo="sudo -E"

-E ( संरक्षित पर्यावरण ) विकल्प sudoers (5) में env_reset विकल्प को ओवरराइड करेगा। यह केवल तब उपलब्ध होता है जब या तो मैचिंग कमांड में SETENV टैग होता है या सेटनोव विकल्प sudoers (5) में सेट होता है।


-1

आप अपने आदेश से पहले sudo के माध्यम से .bashrc या बस निष्पादित करने के लिए उपनाम जोड़ सकते हैं?

sudo (. ~yourlogin/.bashrc; pd ./mytool --some params)

1
उम, यह भी लगभग काम नहीं किया, या तो। यह वास्तव में कुछ चीजों के काफी करीब है जो मैंने ऊपर की कोशिश की थी, लेकिन वास्तविक शेल / सुडो सिंटैक्स से दूर है।
टैंकालुस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.