'Cd ’कमांड के साथ एक निर्देशिका कैसे दर्ज करें अगर इसकी 700 अनुमति है और मेरे पास नहीं है?


86

मैंने उपयोग करने की कोशिश की sudo cd name_of_dirलेकिन मुझे त्रुटि संदेश मिल रहा है:

sudo: cd: command not found

क्या किसी अन्य उपयोगकर्ता के स्वामित्व वाली निर्देशिका में प्रवेश करने का कोई अन्य तरीका है जिसकी 700 अनुमति है?


2
कृपया ls -lखुद निर्देशिका जोड़ें ।
Rinzwind

7
और कृपया स्पष्ट करें कि आप यहां मान्य उत्तरों के खिलाफ नकारात्मक टिप्पणी क्यों छोड़ रहे हैं। यदि आपको लगता है कि एक बेहतर तरीका है (या होना चाहिए), तो कृपया हमें बताएं कि यह क्या हो सकता है।
ओली

1
sudo chmod 0755 name_of_dir; do you business; cd ../; sudo chmod 0700 name_of_dirलगता है कि केवल वही उत्तर होगा जिससे आप खुश होंगे।
मार्को Ceppi

3
यहां दिए गए उत्तर सही हैं, लेकिन आप उन्हें वोट दे रहे हैं और कह रहे हैं कि वे गलत हैं। जो कुछ आप देख चुके हैं, उसे सिर्फ इसलिए खारिज न करें कि क्या कहा जा रहा है।
रिचर्ड होलोवे

3
यह मजेदार है ... वह sudo cdकाम करना चाहता है, लेकिन वह सूडो या सु का उपयोग करके समाधानों को वोट करता है। वह कहता है कि वह रूट के रूप में काम नहीं करना चाहता है, लेकिन वह अभी भी सीधे खुद को एक्सेस नहीं करना चाहता है। मेरे लिए एक ट्रोल की तरह लगता है ...
MestreLion

जवाबों:


110

sudo cdकाम नहीं करेगा क्योंकि cdकमांड शेल में बनाया गया है। तो आप कह रहे हैं कि जड़ बनें और फिर इस कमांड को चलाएं। आप रूट हो जाते हैं और फिर sudo के बाद कमांड की खोज की जाती है लेकिन cdखोजने के लिए कोई कमांड नहीं है ।

उपयोग करने की विधि निर्देशिका के स्वामी के लिए स्विच करना है। अनुमति 700का अर्थ है "मालिक पढ़, लिख और निष्पादित कर सकता है"।

इसलिए यदि रूट डायरेक्टरी sudo -i, पासवर्ड का मालिक है और फिर cd {dir}एकमात्र सही तरीका है। यदि कोई और निर्देशिका का मालिक है, तो आप अभी भी 1 विधि का उपयोग कर सकते हैं, लेकिन उस उपयोगकर्ता के साथ बदल सकते हैं su {username}और फिर cdउस उपयोगकर्ता के रूप में उपयोग कर सकते हैं।


साइड सवाल: क्या रूट 700 dir में प्रवेश कर पाएगा, भले ही वह मालिक न हो?
MestreLion

3
हाँ MestreLion, 700 जड़ को घुसने से नहीं रोकेगा। अनुमतियाँ '000' उपयोगकर्ता को खुद को दर्ज करने से रोकेगी (हाँ, एक उपयोगकर्ता एक ऐसा डायर बना सकता है जिसे वह खुद दर्ज नहीं कर सकता ...) लेकिन फिर भी रूट उस एक में प्रवेश कर सकता है।
रिनजविंड

1
इको एक शेल बिल्ड-इन कमांड है, मैं "सुडो इको" क्यों चला सकता हूं लेकिन "सुडो सीडी" नहीं?
शोज

क्षमा करें, समान नियम लागू होते हैं sudo echo: आपको कुछ की आवश्यकता है जैसे echo 'deb {text}' | sudo tee --append {file}कि sudo के साथ इको का उपयोग करना और किसी फ़ाइल को बदलना।
रिनजविंड

1
हालाँकि, cdउपलब्ध आदेशों में क्यों नहीं बनाया गया है sudo?
एरोन फ्रेंके

44

sudo -i

"रूट कंसोल" खोलने के लिए और फिर

cd /path/to/directory

( cdशेल शेल कमांड है, इसलिए यह सुडो टारगेट नहीं हो सकता)


18

रूट डायरेक्टरी खोलने के लिए हम एक रूट शेल चला सकते हैं, जैसे:

sudo su
# cd /root

3
मैं जड़ के रूप में काम नहीं करना चाहूंगा। कभी नहीँ!!! और यह भी विशेषज्ञों का सुझाव है कि कभी भी रूट के रूप में लॉगिन न करें। -1
बख्तियार

8
खैर, यही कारण है कि आप रूट की निर्देशिकाओं को खोलने के लिए अनुमति नहीं चाहते हैं, है न?
तक्षक

10
रूट मोड में कुछ भी गलत नहीं है। जब यह -needed है - विशेषज्ञ हमेशा जड़ में जाने की सिफारिश करेंगे।
रिनजविंड

2
यदि आप रूट के स्वामित्व वाली चीजों के साथ काम कर रहे हैं, तो कभी-कभी sudo suआईएनजी (या अन्य विधि) एकमात्र व्यावहारिक या संभव तरीका है। "विशेषज्ञ" आपको केवल रूट को आदत के रूप में उपयोग नहीं करने के लिए कहते हैं - यह ठीक है जब आपको वास्तव में इसकी आवश्यकता होती है। और @Vojtech, कुछ भी असंभव है ...
ओली

2
@ बख्तियार: पूरे समय जड़ के रूप में काम करना वास्तव में अनुशंसित नहीं है। लेकिन एकल (या कुछ) कमांड के लिए इसे जारी करना स्वीकार्य है। विशेष रूप से यदि आप ऐसी निर्देशिका में प्रवेश करने का प्रयास कर रहे हैं जिसे आपके उपयोगकर्ता को अनुमति नहीं है । तो अगर आप की जरूरत है या तो मालिक या रूट किया जाना है।
MestreLion

10

जैसा कि अन्य ने बताया - यह शेल निर्मित है:

~ % which cd
cd: shell built-in command

तो, तुम खोल ही क्यों नहीं?

~ % sudo $SHELL -c "cd name_of_dir"

5
S sudo bash -c विचार के लिए +1 ... और एक सुझाव: उपयोग करने से बचें which। इसकी केवल एक स्क्रिप्ट है, और यह सभी संभावनाओं (बाइनरी, बिलिन, अलायस, आदि) को संभाल नहीं पाएगा। typeइसके बजाय उपयोग करें । ज्यादा सुरक्षित, शक्तिशाली और पोर्टेबल। और type -pएक निष्पादन योग्य के मार्ग के लिए।
MestreLion

1
खैर, निर्भर करता है ;-) type [ -wfpams ] name ... Equivalent to whence -v., which [ -wpams ] name ... Equivalent to whence -c.(आदमी zshbuiltins)
डैनियल

1
यह निर्भर नहीं करता है। whenceis zsh-lyly ... यह bash में काम नहीं करता है , यह ubuntu में डिफ़ॉल्ट रूप से भी स्थापित नहीं है। जबकि typeहै POSIX , जिसका अर्थ यह में काम करेंगे किसी भी आधुनिक खोल ... बैश, csh, ksh .. और यहां तक कि zsh।
MestreLion

निश्चित रूप से, यह है और इसीलिए मैंने आपकी टिप्पणी को तब प्रकट किया, जब वह प्रकट हुई थी, लेकिन जो मैंने उल्लेख किया था, वास्तव में वह एक लिपि नहीं थी और समान परिणाम देती है typeजैसे दोनों एक ही कमांड के लिए उपनाम हैं।
डैनियल बॉक

ओह अब मुझे समझ आ गया। ठीक है, लेकिन में zsh। उबास में, जो कि डिफ़ॉल्ट (और आमतौर पर केवल) उबुन्टु में टर्मिनल शेल है, whichएक बिलिन नहीं है ... इसलिए type(या type -p) पसंद किया जाता है।
MestreLion

4

आप अपने आप को उपयोगकर्ता द्वारा रूट करने के लिए ऊपर उठा सकते हैं:

sudo -s

फिर आप किसी भी निर्देशिका में सीडी कर सकते हैं जो सामान्य उपयोगकर्ता को इसकी अनुमति नहीं देता है:

cd /root

या

cd /var/lib/

इसके बाद आप वहाँ टाइप कर रहे हैं:

exit

उपयोगकर्ता के विशेषाधिकारों को लॉगआउट करने के लिए।

अपने आप को जड़ के रूप में ऊंचा करने के लिए, आप &&नीचे दिए अनुसार ऑपरेटर द्वारा दो आदेशों को भी जोड़ सकते हैं, यह ऑपरेटर अपने निष्पादन अनुक्रम को भी बनाए रखता है, यदि वर्तमान कमांड सफलतापूर्वक निष्पादित होता है और उसके बाद ही अगले कमांड को निष्पादित करने की अनुमति मिलती है:

sudo -s && cd /var/lib

या

sudo -s && cd /root

2

यदि आप वास्तव में काम करना चाहते हैं, तो आप शेल फ़ंक्शन को परिभाषित कर सकते हैं , जो उस तरह से चलने पर एक नया रूट शेल चलाता है, और बस नियमित कमांड को अन्यथा चलाता है ।sudo cd directorybashsudosudo

जैसा कि अन्य उत्तरों में प्रस्तुत किया गया है, अधिकांश उपयोगकर्ता ऐसा करने से परेशान नहीं होना चाहते हैं, बल्कि इसके बजाय:

  1. दौड़ें sudo -s, या sudo -iयदि आप एक लॉगिन शेल चाहते हैं (याद रखें कि इसका एक प्रभाव sudo -iआपको रूट के होम डायरेक्टरी में शुरू करने के लिए है), या sudo bashयदि आप फोर्स करना चाहते हैं bashया शेल के विकल्पों को पास करने में सक्षम हैं।
  2. नए शेल में चलाएं ।cd directory
  3. नए शेल में रूट के रूप में जो भी (अन्य) क्रियाएं की जानी हैं, उन्हें करें।
  4. एक बार exitहो जाने के बाद, नया शेल छोड़ने के लिए दौड़ें । यह महत्वपूर्ण है कि आप इसे भूल न जाएं, क्योंकि आप जड़ से अधिक कार्य नहीं करना चाहते हैं।

इसलिए, यदि आप चाहते हैं, तो आप एक शेल फ़ंक्शन (या एक स्क्रिप्ट) लिख सकते हैं जो उन दो क्रियाओं में से पहला प्रदर्शन करता है जब sudoउसके बाद होता है cd, और बस sudoसामान्य रूप से चलता है अन्यथा। कृपया इसे सीखने के विकल्प के रूप में उपयोग न करें sudo cd , अन्यथा सफल क्यों नहीं होता है , क्योंकि यदि आप यह नहीं समझते हैं कि क्या चल रहा है, तो आप संभवतः एक नए शेल में होने से बहुत भ्रमित होंगे (और आप किसी त्रुटि संदेश को नहीं समझ सकते हैं पाए जाते हैं)।

इस तरह के एक शेल फ़ंक्शन को लिखने का एक तरीका है, जो आपको यह भी याद दिलाता है कि आप एक नए शेल में हैं और exitजब आप समाप्त कर लें तो आपको इससे बाहर होना चाहिए । (यह याद दिलाने के उपयोगकर्ताओं के लिए उपयोगी होने की संभावना है किसी भी , क्योंकि एक नहीं आम तौर पर आदी एक नया खोल में किया जा रहा है जब एक चलाता है कौशल स्तर sudoके बिना -s, -iया एक तर्क के रूप में एक वास्तविक खोल के नाम।)

# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
    if [ "$#" -eq 2 ] && [ "$1" = 'cd' ]; then
        sudo bash -c '
                if cd -- "$2"; then # When cd fails, its own message is enough.
                    printf "%s: Running %s shell in %s\n" "$0" "$USER" "$2" >&2
                    printf "%s: Type \"exit\" once you are done!\n" "$0" >&2
                    exec bash # Replace this bash shell with an interactive one.
                fi
            ' bash _ "$2" # Use $2 as the dir in the intermediate shell, too.
    else
        command sudo "$@"
    fi
}

आप इसे अपने में डाल सकते हैं ~/.bashrc, हालांकि यह उपयोग करने के लिए एक अजीब पर्याप्त तरीका है sudoजिसे आप केवल कभी-कभी सक्षम करना चाहते हैं। उस स्थिति में, इसे अपनी फ़ाइल में रखना बेहतर है। यदि आप sudo.bashउन सामग्रियों के साथ अपने घर निर्देशिका में नामक एक फ़ाइल बनाते हैं, तो आप sudoफ़ंक्शन को उपलब्ध करा सकते हैं - ताकि यह नियमित sudoकमांड के बजाय - रन करके . ~/sudo.bash। यह वर्तमान शेल और उसके बच्चे के गोले में प्रभावी होता है, लेकिन अन्य नहीं। उसी कारण से जैसे फाइलें .bashrcनिष्पादन योग्य नहीं हैं, sudo.bashनिष्पादन योग्य को चिह्नित नहीं करते हैं chmod। यह वास्तव में एक लाइब्रेरी है, बजाय एक स्टैंडअलोन शेल स्क्रिप्ट के। अगर तुमने कियाइसे शेल स्क्रिप्ट के रूप में चलाएं, यह फ़ंक्शन को परिभाषित करेगा ... लेकिन केवल शेल में जो स्क्रिप्ट को चलाता है, आपके लिए कॉलर के रूप में नहीं। (निश्चित रूप से, आप इसके लिए एक स्क्रिप्ट लिख सकते हैं , कि मेरे द्वारा यहाँ लिया गया दृष्टिकोण नहीं है।)

यह देखने और देखने के लिए कि sudoक्या वर्तमान में शेल फ़ंक्शन के रूप में परिभाषित किया गया है, और इसकी वर्तमान परिभाषा देखने के लिए यदि यह एक है, तो चलाएं type sudo। एक बार इसे परिभाषित करने के लिए फ़ंक्शन (यानी, अपरिभाषित) को अक्षम करें, चलाएं unset -f sudo। मैन्युअल रूप से नियमित sudoकमांड चलाने के लिए भले ही शेल फ़ंक्शन परिभाषित हो, चलाएं command sudo। हालांकि, ध्यान रखें कि आप नहीं है कि है , ऐसा करने के लिए इस वजह से sudoसमारोह वास्तव में अधिक या कम से कम दो तर्क यह या पहले तर्क के लिए पारित पारित कर दिया है जो अपने आप जब भी देखते हैं यह लेकिन कुछ भी है के लिए करता है cdइसलिए आप इसे अभी भी सामान्य तरीके से लोगों द्वारा उपयोग में ला सकते हैं sudo

ध्यान दें कि ऊपर दिखाया गया शेल फ़ंक्शन अभी भी आपको अन्य तर्कों को पारित करने देता है sudo, लेकिन यह cdविशेष रूप से इलाज करने से रोक देगा । विशेष रूप से चलाना समर्थित नहीं है, हालांकि आप उस मामले का समर्थन करने के लिए शेल फ़ंक्शन का विस्तार कर सकते हैं। और न ही है । यह जो शेल बनाता है वह आपके साथ मिलने वाले समान है । कोड वास्तव में नहीं चलता है , लेकिन उपयोग करता है , इसलिए विकल्प ठीक से काम करता है। यह वास्तव में दो बार चलता है जब आप पास होते हैं और एक निर्देशिका तर्क (और शून्य बार अन्यथा)। जब आप दौड़ते हैं , तो सबसे पहले यह एक अलग बैश शेल को बंद करता है, जिस पर आप फंक्शन चला रहे हैं और डायरेक्टरी को बदलते हैं। यदि वह सफल होता है, तो वह बदल देता हैsudo -u user cd directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo एक नया, इंटरैक्टिव एक है कि आप उपयोग कर सकते हैं के साथ खोल मार।

यहाँ एक उदाहरण है कि कैसे शेल फ़ंक्शन स्वचालित रूप से "सही काम करता है।" सूचना जो sudo ls -A /rootसामान्य रूप से व्यवहार करती है। केवल जब मैं cdएक निर्देशिका के साथ sudoएक नया शेल बनाने का प्रयास करता हूं, और मुझे स्पष्ट रूप से याद दिलाया जाता है कि क्या चल रहा है।

ek@Io:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude      .bashrc  .config  .emacs.d  .nano     .rpmdb
.bash_history  .cache   .dbus    .local    .profile
ek@Io:~$ sudo -k  # invalidates my current timestamp... like I left for a while
ek@Io:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
root@Io:/root/.local#
root@Io:/root/.local#
root@Io:/root/.local# exit
exit
ek@Io:~$

यदि आप sudo cdएक निर्देशिका के लिए प्रयास करते हैं जिसे आप रूट के रूप में भी नहीं बदल सकते हैं, तो आपको बस एक त्रुटि संदेश मिलेगा:

ek@Io:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
ek@Io:~$ sudo -k
ek@Io:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
ek@Io:~$

मैंने sudo -kउपरोक्त उदाहरणों में इनवोकेशन के बीच यह दिखाने के लिए उपयोग किया है कि यह निर्देशिका बदलने के प्रयास से पहले आपको रूट के रूप में प्रमाणित करता है । लेकिन आपको वास्तव में sudo -kखुद को चलाने की जरूरत नहीं है । क्योंकि शेल फ़ंक्शन वास्तविक sudoकमांड के लिए सिर्फ एक पतला आवरण है , आपके क्रेडेंशियल्स और अन्य सामान्य sudoव्यवहार का कैशिंग अभी भी सामान्य रूप से काम करता है।

हालांकि यह अच्छी तरह से काम करता है और साफ-सुथरा होता है, लेकिन मैं मानता हूं कि असली sudoकमांड को उसी नाम के फंक्शन में छाया देना सुपर अजीब है। अधिकांश उपयोगकर्ताओं को शायद सिर्फ चरणों को पूरा करना चाहते हैं sudo -s, खुद को। लेकिन अगर कोई ऐसा चाहता है - और यह भी प्रदर्शित करने के लिए कि यह संभव है - वहाँ यह है।cd directory


0

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


1
"बैश के संस्करणों में और sudoमेरे पास कुबंटू ल्यूसिड है, sudo cdअब काम करता है - बिना किसी वर्कआर्ड के।" के लघु ऐसा ही कुछ है, जो मैं यकीन है कि डिफ़ॉल्ट रूप से उबंटू में कभी नहीं रहा हूँ, मैं कैसे नहीं दिख रहा। (इसके अलावा, मैंने १०.०४ का उपयोग किया है; ऐसा नहीं किया।) आपको इसे पोस्ट किए कई साल हो गए हैं, लेकिन क्या आपको विवरण याद है? क्या sudo cdअब भी आपके लिए काम करता है ? type -a sudoएक शेल में आउटपुट क्या है जहां यह काम करता है? मैं समझता हूं कि आप नहीं जानते होंगे - और आपके उत्तर का दूसरा भाग प्रासंगिक बना हुआ है - लेकिन यदि आप ऐसा करते हैं, तो आप इसके बारे में संपादित कर सकते हैं ।
एलियाह कगन

@ एलियाकगन यह निश्चित रूप से मेरे लिए अब 16.10 में काम नहीं करता है और मुझे याद नहीं है कि मैंने तब क्या किया था। यह मौजूदा आधार आदेशों को संशोधित करने के लिए मेरे धर्म के खिलाफ है, इसलिए यह संभव नहीं है कि मैंने ऐसा किया। किसी भी मामले में, भले ही यह काम किया हो, हर कोई इसे सिर्फ एक बुरी आदत कहेगा क्योंकि यह आम तौर पर काम नहीं करेगा।
जो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.