मैं /root/.bashrc में सेटिंग्स का उपयोग करने के लिए sudo कमांड कैसे प्राप्त कर सकता हूं


9

मैंने .bashrcविशेष रूप से llऔर कई उपनामों के साथ अनुकूलित किया हैexport LS_OPTIONS='--color=auto'

दुर्भाग्य से यह तब काम नहीं करता है जब इसके साथ प्रयोग किया जाता है sudo, इसलिए मैंने भी संशोधित किया है /root/.bashrc, लेकिन इससे कोई फर्क नहीं पड़ता है।

sudo envदिखाता है HOME=/rootऔरSHELL=/bin/bash

मैं sudoसेटिंग्स का उपयोग करने के लिए कमांड कैसे प्राप्त कर सकता हूं /root/.bashrc?

मैं समझता हूं कि यह केवल तब होता है जब bashअंतःक्रियात्मक रूप से निष्पादित किया जाता है, इसलिए मैं किसी अन्य सुझाव के लिए खुला हूं कि कैसे अनुकूलित किया जाए।


@ daniel-gelling - मैंने हमेशा महसूस किया है कि यह Q एक XY समस्या है - meta.stackexchange.com/questions/66377/what-is-the-xy-problem । तात्पर्य यह है कि वे कुछ भी चाहते हैं, /root/.bashrcलेकिन वास्तव में क्यू क्या है इस फाइल से उपनाम है - यह प्रति संभव नहीं है - unix.stackexchange.com/questions/1496/…
स्लम

@slm मैं कर रहा हूँ के बाद bashrc के लिए एक विधि जोड़ रहा है क्या - के रूप में मैं अपने निजी .bashrc फाइल के साथ-साथ "अक्षम" के लिए रूट के लिए Bashrc फाइल में किया है -rके लिए विकल्प crontab: crontab () { [[ $@ =~ -[iel]*r ]] && echo '"r" not allowed' || command crontab "$@" ;}। यह तब काम करता है जब उपयोगकर्ता के रूप में लॉग इन किया जाता है, हालांकि जब मैं निष्पादित sudo crontab -rकरता हूं तब भी यह निष्पादित होता है।
डैनियल गेलिंग

@DanielGelling - देखें कि क्या मेरा उत्तर आपके परिदृश्य के लिए काम करता है।
स्लम

जवाबों:


6

sudoएक निष्पादन योग्य चलाता है, शेल कमांड नहीं। तो यह उपनाम के बारे में नहीं जानता है। यदि आप दौड़ते sudo lsहैं sudo /bin/ls, तो यह आपके जैसे किसी lsअन्य उपनाम का उपयोग नहीं करता है।

आप sudo lsनिम्न को अपने में डालकर उपनाम का विस्तार कर सकते हैं .bashrc:

alias sudo='sudo '

ट्रेलिंग स्पेस पर ध्यान दें - जो शेल को बाद में आने वाले शब्द के साथ उर्फ ​​विस्तार जारी रखने के लिए कहता है sudo। खबरदार है कि सुडो के बाद एलियास का विस्तार हमेशा एक अच्छा विचार नहीं हो सकता है, यह निर्भर करता है कि आपके पास किस प्रकार के उपनाम हैं।

इसके अलावा sudo पर्यावरण से अधिकांश चर हटाता है। यह एक उपनाम की तरह प्रभावित नहीं करेगा alias ls='ls $LS_OPTIONS', क्योंकि यह शेल का उपयोग शेल चर है, जबकि यह कमांड का विस्तार कर रहा है (और इसे .bashrcबिना किसी उद्देश्य के निर्यात करता है)। लेकिन यह उन चर को प्रभावित करेगा जो कमांड द्वारा उपयोग किए जाते हैं, जैसे कि LS_COLORS। आप अपने कॉन्फ़िगरेशन को संपादित करके कुछ पर्यावरणीय चर रखने के लिए sudo को कॉन्फ़िगर कर सकते हैं: visudoलाइन को चलाएं और जोड़ें

Defaults env_keep += "LS_COLORS"

इन सेटिंग्स के साथ, sudo llआपके द्वारा उपयोग किए जाने वाले रंग दे देंगे।

वैकल्पिक रूप से, आप के साथ एक रूट शेल चला सकते हैं sudo -s। यह शेल इसकी कॉन्फ़िगरेशन फ़ाइल ( ~/.bashrcbash के लिए) लोड करेगा । सूडो को कैसे कॉन्फ़िगर किया गया है, इसके आधार पर, यह HOMEआपके होम डायरेक्टरी में सेट हो सकता है या इसे बदल सकता है /root। आप होम डाइरेक्टरी को रूट के साथ सेट करने के लिए बाध्य कर सकते हैं sudo -Hs; इसके अलावा, मूल घर निर्देशिका रखने के लिए, चलाएँ sudo env HOME="$HOME" bash


3

उत्तर देने वालों का धन्यवाद, जिन्होंने मुझे और man sudoअधिक ध्यान से पढ़ने के लिए प्रेरित किया ।

sudo -s यदि कोई कमांड निर्दिष्ट नहीं है, तो एक इंटरैक्टिव शेल निष्पादित किया जाता है।

यह इंटरेक्टिव शेल उपयोग करता है /root/.bashrcऔर इस प्रकार मेरे अनुकूलन शामिल हैं।

यह आवश्यक है कि कमांड को अलग से दर्ज किया जाए, लेकिन यह ठीक है।


2

पृष्ठभूमि

मुझे हमेशा ऐसा लगा है कि यह सवाल एक XY समस्या है । तात्पर्य यह है कि वे कुछ भी चाहते हैं, /root/.bashrcलेकिन वास्तव में सवाल यह है कि इस फाइल से उपनाम क्या है - यह व्यापक रूप से माना जाता है कि यह प्रति संभव नहीं है - मेरी बैश स्क्रिप्ट एलियंस को क्यों नहीं पहचानती है?

यह मूल रूप से डिजाइन द्वारा है कि आपके उपनामों को sudoअन्य स्थानों पर नहीं उठाया जाएगा क्योंकि वे पोर्टेबल नहीं हैं, और यह उन पर मेरी राय भी है।

उपयोगकर्ता के वातावरण में जो कुछ भी है, उसे स्क्रिप्ट और किसी भी सॉफ़्टवेयर को नहीं मानना ​​चाहिए जो किसी दिए गए बॉक्स पर चल सकता है। लेकिन मुझे लगता है कि ऐसे परिदृश्य हैं जहां किसी दिए गए उपयोगकर्ता खाते में कुछ उपनाम $HOME/.bashrcहो सकते हैं जो अन्य लोग इंटरैक्टिव परिदृश्यों में लाभ उठाना चाहते हैं।

उस अंत तक आप बस किसी भी उपनाम का विस्तार करने के लिए बैश दुभाषिया को बता सकते हैं जो इसे सामान्य शेल व्यवहार के बाहर लॉगिन प्रक्रिया के दौरान मिलता है जिसे आप उपयोग करते समय चलाते हैं sudo

उदाहरण

सेट अप

चीजों को सेट करने के लिए मैंने अपने मूल उपयोगकर्ता /root/.bashrcऔर /root/.bash_profileफ़ाइलों के लिए निम्न उपनाम, पर्यावरण चर और फ़ंक्शन जोड़े हैं ।

$ grep smurf ~/.bashrc
alias brc_smurf='echo "ran alias from /root/.bashrc"'
export brc_smurf_env='var from /root/.bashrc'
bpf_smurf_func() { echo 'ran func from /root/.bash_profile'; }

$ grep smurf ~/.bash_profile
alias bpf_smurf='echo "ran alias from /root/.bash_profile"'
export bpf_smurf_env='var from /root/.bash_profile'
brc_smurf_func() { echo 'ran func from /root/.bashrc'; }

इन कामों के न तो कुछ किए बिना (कोई आश्चर्य नहीं):

$ sudo brc_smurf
sudo: brc_smurf: command not found

$ sudo bpf_smurf
sudo: bpf_smurf: command not found

हम देखते हैं कि aliasजब कोई कमांड नहीं चलती है तो एलियास दिखाता है sudo:

$ sudo alias
$

यह व्यवहार आपका संकेत है कि आपको उम्मीद नहीं की जा सकती कि यह सुलभ होगा। लेकिन हम पर ले ...

चरण # 1 - दिखाई देने वाले उपनाम

यदि हम चलाते हैं bash -ciतो हम बैश को कम से कम हमारे पढ़ने के लिए प्रेरित कर सकते हैं $HOME/.bashrc:

$ sudo bash -ci 'alias' | grep smurf
alias brc_smurf='echo "ran alias from /root/.bashrc"'

कूल, तो शायद हम इसे चला सकते हैं?

$ sudo bash -ci 'alias; brc_smurf'
bash: alias; brc_smurf: No such file or directory

चरण 2 - shopt -s expand_aliases

नहीं। फिर से यह डिज़ाइन द्वारा है, हम ऐसा कुछ कर रहे हैं जिसे हम करने के लिए नहीं मान रहे हैं, इसलिए "सफारी" की एक संख्या है जिसे हमें अक्षम करना होगा। अन्य "सुरक्षा" बैश है।

$ sudo bash -ci 'shopt -s expand_aliases; alias; brc_smurf'
alias brc_smurf='echo "ran alias from /root/.bashrc"'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
ran alias from /root/.bashrc

यहां हम अपना संदेश देख सकते हैं /root/.bashrc, हमने रूट उपयोगकर्ता के उपनाम को सफलतापूर्वक निष्पादित किया है brc_smurf

चरण # 3 - एनवी संस्करण के बारे में क्या?

यदि आप ऊपर दिखाए गए विधि का उपयोग कर रहे हैं, तो उन्हें अब भी काम करना चाहिए।

$ sudo bash -ci 'shopt -s expand_aliases; brc_smurf; echo $brc_smurf_env'
ran alias from /root/.bashrc
var from /root/.bashrc

चरण # 4 - कार्यों के बारे में क्या?

ये उम्मीद के मुताबिक काम करते हैं:

$ sudo bash -ci 'shopt -s expand_aliases; brc_smurf; echo $brc_smurf_env;brc_smurf_func'
ran alias from /root/.bashrc
var from /root/.bashrc
ran func from /root/.bashrc

TLDR;

आप पर्यावरण चर + उपनामों की पहुँच प्राप्त करने के लिए ऐसा कर सकते हैं /root/.bashrc:

$ sudo bash -ci 'shopt -s expand_aliases; <cmds>'

रास्ते ले लो

यह विधि की सामग्री को सक्षम करती है /root/.bashrc, यह सामग्री को नहीं उठाती है /root/.bash_profile

संदर्भ


हां, भले ही उनके बीच कुछ मामूली अंतर हैं, चलो यहां विस्तार से नहीं जाना; ;-) वैसे भी, क्या आप मुझे उस स्थिति में मदद कर सकते हैं जो मैंने सवाल की टिप्पणियों में कहा था: .bashrcसुडो के साथ कार्यों का उपयोग करना ; विशेष रूप से -rविकल्प को हटाने से crontab?
डेनियल गेलिंग

ठीक है, लेकिन इसका मतलब यह होगा कि मुझे दौड़ना होगा: sudo bash -ci 'alias; shopt -s expand_aliases; echo $brc_smurf_env'एक साधारण के बजाय sudo echo $brc_smurf_env?
डैनियल गेलिंग

आप निकाल सकते हैं alias, कि बस उन्हें दिखाने के लिए किया गया था, आपको बस इतना करना चाहते हैंsudo bash -ci 'shopt -s expand_aliases; <cmds>'
SLM

यह सिर्फ रूट के लिए मेरे crontab को संपादित करने के लिए बहुत कुछ होगा। मुझे इसके लिए एक उपनाम बनाने दें :-P
डैनियल गेलिंग

@ डैनियलगेलिंग - हाँ, शेल बॉल में नीचे सभी मौज-मस्ती में आपका स्वागत है।
स्लम

0

/ Etc / sudoers फ़ाइल में सेटिंग्स का एक गुच्छा होता है विशेष रूप से या जब sudo कमांड चलाए जाते हैं तो एक वातावरण सेट करते हैं (उदाहरण। यह सुनिश्चित करना कि केवल PATH के भरोसेमंद स्थान हैं), लेकिन इस बात पर निर्भर करता है कि आप क्या बाहर निकलने की उम्मीद कर रहे हैं। यदि आप पर्यावरण को स्थापित करने के लिए एक शेल में वास्तविक कमांड चलाना शामिल करते हैं, तो आप ऐसा करने में सक्षम नहीं हो सकते हैं। सूदिंग विशेष रूप से आपको रूट लॉगिन शेल नहीं देता है, इसलिए यह आपके लिए एक नियमित प्रोफ़ाइल सेट नहीं करेगा।


0

कहते हैं कि हम /root/.bashrc को संपादित करते हैं:

$ sudo su -
Password: ******
# cat ~/.bashrc

echo "root bashrc file was read"
PATH=~/bin:$PATH
echo "$PATH"
export USERVAR=set
echo "$USERVAR"

umask 022
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'

फ़ाइल को पढ़ने से रोकने के लिए लॉग आउट करें और वापस लॉग इन करें:

# exit
$ sudo su -
root bashrc file was read
/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
set
root@here:~# alias l
alias l='ls $LS_OPTIONS -lA'
root@here:~# 

जैसा कि आप देख सकते हैं, फ़ाइल पढ़ी गई थी, पैट को बदल दिया गया था और उपनाम सेट किए गए हैं। आपके अनुरोध के अनुसार सभी कार्यात्मक है।

हालाँकि, sudo अभी भी काम नहीं करेगा जैसा कि आप उम्मीद कर रहे हैं।

root@here:~# exit
$ sudo env | grep USERVAR              # no output 
$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

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

तो, बस लॉग इन करें, .bashrcफ़ाइल ऑटो लोड होगी और काम पर जाएगी।

आप इसे शुरू कर सकते हैं:

$ sudo bash
root bashrc file was read
/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
set
root@mail:/home/isaac/me/temp/clocks-master#

लेकिन जैसा कि आप ऊपर देखते हैं, pwd (वर्किंग डायरेक्टरी) नहीं बदला है, और, यदि आप थोड़ा और निरीक्षण करते हैं, तो कुछ अन्य सेटिंग्स भी नहीं बदली हैं। इसीलिए सही कमांड का उपयोग करना है:

$ sudo su -

यदि वह कमांड टाइप करने के लिए बहुत लंबा है, तो उपयोगकर्ता में एक उपनाम या फ़ंक्शन बनाएं (रूट नहीं) जहां उस कमांड का उपयोग किया जाएगा, कुछ इस प्रकार है:

$ alias mysu='sudo su -'
$ mysu
# 

0

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, ताकि एक अतिरिक्त बोनस हो।

मुझे आशा है कि आपको यह उत्तर और स्पष्टीकरण सहायक होगा!


DV - मुझे ऐसा नहीं लगता कि जो पहले से ही यहां है उससे कहीं ज्यादा स्थिति में सुधार हो रहा है।
स्लम

1
@ मुझे लगता है कि मेरा उत्तर कुछ जोड़ रहा है, क्योंकि किसी भी पिछले उत्तर ने इस फॉर्म sudo -i command argumentsका उल्लेख नहीं किया है जिससे कार्यों को चलाने में सक्षम होने /root/.bashrcऔर उपलब्ध वेरिएंट को निर्यात किया जा सके । लेकिन मैं देख रहा हूं कि मेरा जवाब शायद बहुत लंबा था और यह जानकारी कुछ हद तक वहां दब गई थी ... इसलिए मैंने एक टीएल जोड़ा; डीआर इसे संक्षेप में प्रस्तुत किया (जबकि अभी भी जांच के तकनीकी विवरण को ध्यान में रखते हुए।) कृपया एक और नज़र डालें।
फिल्मब्रांडेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.