सूद का उपयोग करते समय उपनाम उपलब्ध नहीं है


159

मैं आज उपनामों के साथ खेल रहा था और मैंने देखा कि उपनामों का उपयोग करते हुए उपलब्ध नहीं लगता है sudo:

danny@kaon:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

danny@kaon:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //

danny@kaon:~$ sudo -i
root@kaon:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
root@kaon:~# exit
logout

danny@kaon:~$ sudo ll -d /
sudo: ll: command not found

क्या कोई कारण है कि आप उपयोग करते हुए उपनाम का उपयोग नहीं कर सकते हैं sudo?


क्या आपने उन उर्फ ​​को .bashrc ऑन / रूट /
लुसियानो फेशिंकेली

2
@LucianoFacchinelli: /root/.bashrcsudo के माध्यम से कमांड चलाने पर पढ़ने को नहीं मिलता है।
फ्लिम


@ फिलम: इसके बारे में क्या sudo -i?
Evi1M4chine

जवाबों:


250

निम्नलिखित पंक्ति को अपने में जोड़ें ~/.bashrc:

alias sudo='sudo '

से बैश मैनुअल :

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

प्रत्येक साधारण कमांड का पहला शब्द, यदि अयोग्य है, तो यह देखने के लिए जाँच की जाती है कि उसमें एक उपनाम है या नहीं । यदि हां, तो उस शब्द को उपनाम के पाठ से बदल दिया जाता है। वर्ण '/', '$', '`', '=' और ऊपर उल्लिखित वर्णों में से कोई भी शेल मेटाचेचर या उद्धृत वर्ण किसी अन्य नाम में प्रकट नहीं हो सकता है। प्रतिस्थापन पाठ में शेल मेटाचैकर सहित कोई भी मान्य शेल इनपुट हो सकते हैं। प्रतिस्थापन पाठ का पहला शब्द उपनामों के लिए परीक्षण किया गया है, लेकिन एक शब्द जो कि उपनाम के समान है, का विस्तार दूसरी बार नहीं किया जाता है। इसका मतलब यह है कि कोई भी उर्फ ​​ls को "ls -F" कह सकता है, उदाहरण के लिए, और बैश रिप्लेसमेंट टेक्स्ट का पुनरावर्ती विस्तार करने का प्रयास नहीं करता है। यदि उपनाम के मान का अंतिम वर्ण एक स्थान या टैब वर्ण है, तो उपनाम के बाद अगले कमांड शब्द को उपनाम के विस्तार के लिए भी जांचा जाता है

(जोर मेरा)।
बैश केवल एक उपनाम के लिए एक कमांड का पहला शब्द चेक करता है, उसके बाद कोई भी शब्द चेक नहीं किया जाता है। इसका मतलब है कि एक कमांड में sudo ll, केवल पहले शब्द ( sudo) को एक उपनाम के लिए बैश द्वारा चेक किया जाता है, llपर ध्यान नहीं दिया जाता है। हम उपनाम (यानी sudo) के बाद अगले शब्द की जांच करने के लिए bash को अलियास मान के अंत में एक स्थान जोड़कर बता सकते हैं ।


18
बहुत अच्छा समाधान है।
ulidtko

तो मूल रूप से यह मुद्दा इस तथ्य पर उबलता है कि सूडो को केवल इस तरह से प्रोग्राम किया जाता है कि यह उर्फ ​​की जाँच नहीं करता है इसलिए ll नहीं मिला?
केमरा 102

2
दस्तावेज़ीकरण को पढ़ने से जाहिर है कि बहुत सारे :-)
biocyberman

4
अगर मैं एक सूडो फ्लैग का उपयोग करता हूं, तो क्या यह टूट जाएगा sudo -H ll?
मार्क ई। हासे

1
@mehaase हाँ, मैंने कोशिश की और यह टूट गया।
user31389

5

मैंने इसके लिए एक बैश फंक्शन लिखा था जो शैडो था sudo

यह जाँच करता है कि क्या मेरे पास दिए गए कमांड के लिए एक उपनाम है और sudoउस मामले में शाब्दिक एक के बजाय अन्य कमांड को चलाता है या नहीं।

यहाँ एक लाइनर के रूप में मेरा कार्य है:

sudo() { if alias "$1" &> /dev/null ; then $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}" ; else command sudo $@ ; fi }

या अच्छी तरह से स्वरूपित:

sudo() { 
    if alias "$1" &> /dev/null ; then 
        $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}"
    else 
        command sudo "$@"
    fi 
}

आप इसे अपनी .bashrcफ़ाइल में संलग्न कर सकते हैं , इसे स्रोत के लिए मत भूलना या फिर परिवर्तनों को लागू करने के लिए अपने टर्मिनल सत्र को फिर से शुरू करें।


यह अद्भुत होगा अगर यह sudo -H ll के लिए भी काम करेगा।
19

3

उपनाम उपयोगकर्ता विशिष्ट हैं - आपको उन्हें परिभाषित करने की आवश्यकता है /root/.bashrc


3
वे पहले से ही /root/.bashrc के अधीन हैं, इसलिए यह एक मुद्दा नहीं है
kemra102

1
यह उत्तर केवल उस स्थिति के लिए सही होगा जब आप शेल को रूट के रूप में चला रहे हों, जैसे कि ( sudo -sया केवल तभी रूट शेल प्राप्त करने के लिए स्वयं द्वारा चलाया जा रहा है, या रूपों के साथ नहीं ) या या , या स्थिति जहां आप सक्षम रूट लॉगिन है और इस तरह से एक रूट शेल है। जब एक गैर-रूट उपयोगकर्ता अपने स्वयं के शेल से चलता है, तो उपनाम अपने स्वयं के गैर-रूट शेल द्वारा किया जाता है। स्वयं उपनामों का विस्तार नहीं करता है, इसलिए प्रश्न में वर्णित स्थिति पर लागू होने पर , यह उत्तर गलत है। sudo -isudo -s command...sudo -i command...sudo bashsudo susudo command...sudo
एलिया कागन

3

@ एल्विन्स का उत्तर सबसे छोटा है। इसमें कोई शक नहीं! :-)

हालाँकि मैंने एक कमांड लाइन सॉल्यूशन के बारे में सोचा था कि सूडो में एक अलियास कमांड निष्पादित करता है जहाँ कमांड के sudoसाथ पुनर्परिभाषित करने की कोई आवश्यकता नहीं है alias

यहां उन लोगों के लिए मेरा प्रस्ताव है, जिनके लिए यह ब्याज हो सकता है:

उपाय

type -a <YOUR COMMAND HERE> | grep -o -P "(?<=\`).*(?=')" | xargs sudo

उदाहरण

llकमांड के मामले में

type -a ll | grep -o -P "(?<=\`).*(?=')" | xargs sudo

व्याख्या

जब आपके पास एक उपनाम (जैसे :) llकमांड अलियास type -aअभिव्यक्ति देता है:

$type -a ll
ll is aliased to `ls -l'

साथ grepआप लहजे `और उस मामले में apostrophe 'के बीच पाठ का चयन करेंls -l

और xargsचयनित पाठ ls -lको पैरामीटर के रूप में निष्पादित करता है sudo

हां, थोड़ा लंबा लेकिन पूरी तरह से साफ ;-) sudoउपनाम के रूप में पुनर्परिभाषित करने की आवश्यकता नहीं है ।


3
अगर आपने aliasबिल्टिन का उपयोग किया है तो सरल हो सकता है , क्योंकि इसका आउटपुट क्लीनर है। alias llआउटपुट alias ll='ls -ahlF'
मुरु

यहाँ @ muru के सुझाव को शामिल करने वाला संस्करण है alias ll | sed "s/.*'\(.*\)'.*/\1/g" | xargs sudo:।
ACK_stoverflow

मुझे लगता है कि मूल प्रश्न का बिंदु sudo -iपहले नहीं होने से काम को बचाना था , अलियास कमांड चलाना, लेकिन इसे सीधे करना। इस तरह के एक जटिल आदेश को हराने के बाद। आप बस पूर्व कर सकते हैं, और बहुत जल्दी हो सकता है।
Evi1M4chine

1

मेरे पास एक और अच्छा उपाय है, जो थोड़ा विश्वास भी बढ़ाता है:

sudoटैब दबाते समय अपने उपनाम के साथ शब्दों को स्वचालित रूप से बदलने के लिए बैश समाप्ति का उपयोग करें ।

/etc/bash_completion.d/sudo-alias.bashcompइसे इस रूप में सहेजें , और इसे स्वचालित रूप से इंटरेक्टिव शेल स्टार्टअप पर लोड किया जाना चाहिए:

_comp_sudo_alias() { from="$2"; COMPREPLY=()
  if [[ $COMP_CWORD == 1 ]]; then
    COMPREPLY=( "$( alias -p | grep "^ *alias $from=" | sed -r "s/^ *alias [^=]+='(.*)'$/\1/" )" )
    return 0
  fi
  return 1
}
complete -o bashdefault -o default -F _comp_sudo_alias sudo

फिर एक नए टर्मिनल में लॉग इन करें, और आपको जाने के लिए अच्छा होना चाहिए।


उपनामों की एक सूची प्राप्त करने का एक तरीका है, विशेष रूप से पूरा करने के लिए अभिप्रेत है:compgen -a
मुरु

@ मुरु: धन्यवाद, लेकिन इस मामले में मुझे मूल्यों की जरूरत है, चाबियों की नहीं। तो जो उपनाम दर्ज किया गया था, उसे बदल दिया जाएगा। आप उपनाम टाइप करते हैं, (जैसे sudo ll), [TAB and] दबाएं, और स्क्रिप्ट llअन्य उपनामों की सूची में मिलती है, जो इसे सौंपा गया है उसे काट देता है, और सम्मिलित करता है। (इसलिए आपको उदाहरण मिलेगा sudo ls -lahvF --color=auto --time-style=long-iso।)
Evi1M4chine

0

मेरे पास एक अलग समाधान है जिससे आपको sudoएक उपनाम के रूप में जोड़ने की आवश्यकता नहीं है । मैं लिनक्स मिंट 17.3 चलाता हूं, लेकिन यह उबंटू जैसा ही होना चाहिए।

जब आप रूट होते हैं, तो .profileइसके होम डायरेक्टरी से चलाया जाता है। यदि आपको नहीं पता है कि रूट के तहत होम डायरेक्टरी क्या है, तो आप इसके साथ देख सकते हैं:

sudo su
echo $HOME

जैसा कि आप देख सकते हैं, का घर rootहै /root/। इसकी सामग्री की जाँच करें:

cd $HOME
ls -al

एक .profileफाइल होनी चाहिए । फ़ाइल खोलें और निम्न पंक्तियाँ जोड़ें:

if [ "$BASH" ]; then
    if [ -f ~/.bash_aliases];then
        . ~/.bash_aliases 
    fi
fi

मूल रूप से, यह बैश स्क्रिप्ट क्या करती है, नामक फाइल की जांच करना .bash_aliases। यदि फ़ाइलें मौजूद हैं, तो यह फ़ाइल को निष्पादित करता है।

.profileफ़ाइल सहेजें और में अपने उपनाम बनाएँ .bash_aliases। यदि आपके पास पहले से ही एलियास फाइल तैयार है, तो फाइल को इस स्थान पर कॉपी करें

टर्मिनल को फिर से लॉन्च करें और आप जाने के लिए अच्छे हैं!


0

शीर्ष मतदान का जवाब शानदार है। हालाँकि अगर आप sudo -iएक sudo प्रॉम्प्ट ( #) को टाइप और एलीवेट करते हैं तो आपके पास वह एलियास नहीं होगा जिसका आप उपयोग करना चाहते हैं।

#प्रॉम्प्ट पर अपने उपनाम (और बाकी सब) का उपयोग करने के लिए:

sudo cp "$PWD"/.bashrc /root/.bashrc

जहाँ "$ PWD" का स्वचालित रूप से "/ home / у_USER_NAME" में विस्तार होता है


0

@ WinEunuuchs2Unix: $PWD"वर्तमान वर्किंग डाइरेक्टरी" में फैलता है। मुझे लगता है कि आप चाहते हैं $HOME

इसके अलावा, अधिकांश स्थितियों के लिए, संभवतः एक अलग रूट .bashrc फ़ाइल होना सबसे अच्छा है। वास्तव में, मैं इसे /rootउपयोगकर्ता की होम डाइरेक्टरी (उदा।, .bashrc_root) में एक वास्तविक फ़ाइल बनाता हूँ , और इसे उपयोगकर्ता की .bashrcफ़ाइल से स्रोत बनाता हूँ । यदि कुछ समय बाद यह विशेषाधिकार प्राप्त उपयोगकर्ता खाता अब मौजूद नहीं है, तो रूट .bashrcफ़ाइल अभी भी अन्य उपयोगकर्ताओं के लिए उपलब्ध है।

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