จะเข้าสู่ไดเรกทอรีด้วยคำสั่ง 'cd' ได้อย่างไรหากมี 700 สิทธิ์และฉันไม่ได้เป็นเจ้าของ


86

ฉันพยายามใช้sudo cd name_of_dirแต่ได้รับข้อความแสดงข้อผิดพลาด:

sudo: cd: command not found

มีวิธีอื่นในการป้อนไดเรกทอรีที่เป็นของผู้ใช้รายอื่นซึ่งมี 700 สิทธิ์หรือไม่?


2
กรุณาเพิ่มls -lไดเรกทอรีของตัวเอง
Rinzwind

7
และโปรดอธิบายว่าทำไมคุณแสดงความคิดเห็นเชิงลบกับคำตอบที่ถูกต้องที่นี่ หากคุณคิดว่ามี (หรือควร) วิธีที่ดีกว่าโปรดแจ้งให้เราทราบว่ามันอาจจะเป็นอะไร
Oli

1
sudo chmod 0755 name_of_dir; do you business; cd ../; sudo chmod 0700 name_of_dirดูเหมือนจะเป็นคำตอบเดียวที่คุณจะพอใจ
Marco Ceppi

3
คำตอบที่ให้ไว้ที่นี่ถูกต้อง แต่คุณลงคะแนนพวกเขาและบอกว่าพวกเขาผิด อย่าเพียงเพิกเฉยสิ่งที่พูดเพราะสิ่งอื่นที่คุณเห็น
Richard Holloway

3
นั่นเป็นเรื่องตลก ... เขาต้องการที่sudo cdจะทำงาน แต่เขาก็ลงคะแนนแก้ปัญหาโดยใช้ sudo หรือ su เขาบอกว่าเขาไม่ต้องการทำงานในฐานะรูท แต่เขาก็ยังต้องการเข้าถึงเขาโดยตรงที่เขาไม่ได้เป็นเจ้าของ เสียงเหมือนโทรลล์กับผม ...
MestreLion

คำตอบ:


110

sudo cdจะไม่ทำงานเพราะcdคำสั่งถูกสร้างขึ้นในเปลือก ดังนั้นคุณกำลังพูดว่ากลายเป็นรากแล้วเรียกใช้คำสั่งนี้ คุณกลายเป็นรูทแล้วคำสั่งหลังจากค้นหา sudo แล้ว แต่ไม่มีcdคำสั่งให้ค้นหา

วิธีการใช้คือการสลับไปยังผู้ใช้ที่เป็นเจ้าของไดเรกทอรี การอนุญาต700มีความหมายว่า "เจ้าของสามารถอ่านเขียนและดำเนินการ"

ดังนั้นหากรูทเป็นเจ้าของไดเรกทอรีsudo -iรหัสผ่านและcd {dir}เป็นวิธีที่ถูกต้อง หากมีคนอื่นเป็นเจ้าของไดเรกทอรีคุณยังคงสามารถใช้วิธีที่ 1 แต่ยังสามารถเปลี่ยนเป็นผู้ใช้su {username}นั้นและใช้cdเป็นผู้ใช้นั้นได้


คำถามข้างเคียง: รูทจะสามารถป้อน 700 dir ได้แม้ว่าเขาจะไม่ใช่เจ้าของหรือไม่
MestreLion

3
ใช่ MestreLion 700 จะไม่หยุดการรูท การอนุญาต '000' จะหยุดผู้ใช้จากการป้อนตัวเอง (ใช่ผู้ใช้สามารถสร้าง dir ที่เขาเองไม่สามารถป้อน ... ) แต่ยังคงสามารถรูทสามารถป้อนที่หนึ่ง
Rinzwind

1
echo เป็นคำสั่ง build-in ของเชลล์ทำไมฉันถึงสามารถรัน "sudo echo" แต่ไม่ใช่ "sudo cd"?
shoujs

ขออภัยกฎเดียวกันนี้นำไปใช้กับsudo echo: คุณต้องการสิ่งที่ต้องการecho 'deb {text}' | sudo tee --append {file}ใช้ echo ด้วย sudo และเพื่อเปลี่ยนไฟล์
Rinzwind

1
ทำไมไม่ได้cdสร้างไว้ในคำสั่งที่มีให้sudoแต่?
Aaron Franke

44

sudo -i

เพื่อเปิด "รูทคอนโซล" จากนั้น

cd /path/to/directory

( cdเป็นคำสั่ง shell builtin ดังนั้นจึงไม่สามารถเป็นเป้าหมาย sudo ได้)


18

ในการเปิดรูทไดเร็กทอรีเราอาจใช้รูทเชลล์เช่น:

sudo su
# cd /root

3
ฉันไม่ต้องการทำงานเป็นราก ไม่เคย !!! และผู้เชี่ยวชาญแนะนำไม่เคยเข้าสู่ระบบในฐานะที่เป็นราก -1
Bakhtiyor

8
นั่นเป็นเหตุผลที่คุณไม่ต้องการสิทธิ์ในการเปิดไดเรกทอรีของรูทใช่ไหม
Takkat

10
ไม่มีอะไรผิดปกติที่จะเข้าสู่โหมดรูท ผู้เชี่ยวชาญมักจะแนะนำให้เข้าไปสู่รูทเมื่อต้องการ -
Rinzwind

2
หากคุณกำลังทำงานกับสิ่งต่าง ๆ ที่รูทเป็นเจ้าของบางครั้งsudo suไอเอ็นจี (หรือวิธีอื่น) เป็นวิธีเดียวที่ใช้งานได้จริงหรือเป็นไปได้ "ผู้เชี่ยวชาญ" บอกให้คุณไม่ใช้รูทเป็นนิสัย - มันก็โอเคเมื่อคุณต้องการจริงๆ และ @Vojtech ไม่มีอะไรที่เป็นไปไม่ได้ ...
Oli

2
@Bakhtiyor: การทำงานตลอดเวลาเนื่องจากไม่แนะนำให้รูท แต่การออกคำสั่งสำหรับคำสั่งเดียว (หรือไม่กี่คำ) นั้นเป็นที่ยอมรับได้ พิเศษถ้าคุณกำลังพยายามที่จะเข้าสู่ไดเรกทอรีที่คุณผู้ใช้ของคุณไม่มีสิทธิ์ในการ ดังนั้นคุณต้องเป็นเจ้าของหรือรูท
MestreLion

10

อย่างที่คนอื่น ๆ ชี้ไป - มันคือเปลือกในตัว:

~ % which cd
cd: shell built-in command

ดังนั้นทำไมคุณไม่ sudo เปลือกเอง

~ % sudo $SHELL -c "cd name_of_dir"

5
+1 สำหรับความคิด -c sudo ทุบตี ... และข้อเสนอแนะ: whichหลีกเลี่ยงการใช้ มันเป็นเพียงสคริปต์และมันจะไม่จัดการกับความเป็นไปได้ทั้งหมด (ไบนารี่บิวด์อินนามแฝง ฯลฯ ) ใช้typeแทน ปลอดภัยกว่าพกพาสะดวก และtype -pสำหรับเส้นทางของการปฏิบัติการ
MestreLion

1
ก็ขึ้นอยู่กับ ;-) type [ -wfpams ] name ... Equivalent to whence -v., which [ -wpams ] name ... Equivalent to whence -c.(ผู้ชาย zshbuiltins)
Daniel Bauke

1
มันไม่ได้ขึ้นอยู่กับ whenceเป็นzsh- เพียง ... มันไม่ทำงานในทุบตีมันไม่ได้ติดตั้งโดยค่าเริ่มต้นใน Ubuntu ในขณะที่typeเป็นPOSIXซึ่งหมายความว่ามันจะทำงานในใด ๆที่ทันสมัยเปลือก ... ทุบตี csh, ksh .. และแม้กระทั่ง zsh
MestreLion

แน่นอนมันเป็นและนั่นคือเหตุผลที่ฉันยกระดับความคิดเห็นของคุณเมื่อมันปรากฏ แต่สิ่งที่ฉันพูดคือ zsh จริง ๆ แล้วมันไม่ใช่สคริปต์และให้ผลลัพธ์ที่คล้ายกันtypeเนื่องจากทั้งคู่เป็นนามแฝงในคำสั่งเดียวกัน
Daniel Bauke

โอ้ฉันเข้าใจแล้ว แต่นั่นเป็นสิ่งที่zshมา ใน bash ซึ่งเป็นค่าเริ่มต้น (และโดยปกติเท่านั้น) เทอร์มินัลเชลล์ใน Ubuntu whichไม่ใช่บิวด์อิน ... ดังนั้นจึงเป็นที่ต้องการtype(หรือtype -p)
MestreLion

4

คุณสามารถยกระดับตัวเองเป็นผู้ใช้รูทได้โดย:

sudo -s

จากนั้นคุณสามารถ cd ไปยังไดเรกทอรีใด ๆ ที่ไม่อนุญาตให้ผู้ใช้ทั่วไปชอบ

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การปิดใช้งาน (เช่น undefine) unset -f sudoฟังก์ชั่นเมื่อมีการกำหนดให้เรียกใช้ การทำงานด้วยตนเองปกติคำสั่งโดยตรงแม้ว่าฟังก์ชั่นเปลือกจะถูกกำหนดให้เรียกใช้sudo command sudoแต่โปรดทราบว่าคุณไม่ได้มีการทำอย่างนั้นเพราะsudoฟังก์ชั่นที่ไม่จริงว่าตัวเองเมื่อใดก็ตามที่มีมากขึ้นหรือน้อยกว่าสองข้อโต้แย้งผ่านไปหรืออาร์กิวเมนต์แรกผ่านไปคืออะไร cdแต่ นั่นเป็นเหตุผลที่คุณยังคงสามารถใช้งานได้ในรูปแบบปกติที่ผู้คนใช้sudo

ยังทราบว่าการทำงานของเชลล์ที่แสดงข้างต้นไม่ยังคงช่วยให้คุณผ่านการขัดแย้งอื่น ๆ เพื่อsudo, แต่ที่จะป้องกันไม่ให้การรักษาcdเป็นพิเศษ ไม่รองรับการทำงานเป็นพิเศษแม้ว่าคุณจะสามารถขยายฟังก์ชั่นเชลล์เพื่อรองรับเคสได้ ไม่เป็น เชลล์ที่มันสร้างนั้นคล้ายกับที่คุณได้รับมา รหัสไม่ทำงานจริงแต่ใช้ดังนั้นตัวเลือกทำงานอย่างถูกต้อง จริง ๆ แล้วมันจะทำงานสองครั้งเมื่อคุณผ่านและอาร์กิวเมนต์ของไดเรกทอรีไป เมื่อคุณเรียกใช้ก่อนอื่นมันจะทำการแยก bash shell ที่แยกต่างหากจากอันที่คุณใช้งานฟังก์ชั่นและเปลี่ยนไดเรกทอรี หากสำเร็จก็จะแทนที่sudo -u user cd directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo bash shell นั้นใหม่ซึ่งเป็น interactive ที่คุณสามารถใช้ได้

นี่คือตัวอย่างของการที่เชลล์ทำงานโดยอัตโนมัติ "ทำสิ่งที่ถูกต้อง" สังเกตว่า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ด้วยตัวเอง เนื่องจากฟังก์ชั่นเชลล์เป็นเพียง wrapper ที่บางสำหรับsudoคำสั่งจริงการแคชข้อมูลประจำตัวของคุณและsudoพฤติกรรมทั่วไปอื่น ๆยังคงทำงานได้ตามปกติ

แม้ว่ามันจะทำงานได้ดีและเรียบร้อยดี แต่ฉันยอมรับว่าการแรเงาsudoคำสั่งจริงด้วยฟังก์ชั่นที่มีชื่อเดียวกันนั้นแปลกมาก ผู้ใช้ส่วนใหญ่อาจจะเพียงต้องการที่จะดำเนินการขั้นตอนsudo -s, ตัวเอง แต่ในกรณีที่ทุกคนต้องการ - และเพื่อแสดงให้เห็นว่าเป็นไปได้ - มีcd directory


0

เท่าที่จะทำได้suหรือไม่ที่จะsuอภิปรายฉันคิดว่ามันโง่ suขัดต่อศาสนาของ Ubuntu และไม่ใช่สิ่งที่ต้องทำอย่างประมาท มันวิเศษมากที่rm -rf *สามารถทำได้ถ้าคุณรูต แต่ถ้าคุณพอใจกับอินเตอร์เฟซบรรทัดคำสั่ง (CLI) suและมีงานระดับระบบที่จะทำมีเหตุผลที่จะไม่ใช้ไม่มี ผมเคยใช้หลาย distros sudoที่ไม่มีใครกล่าวถึงการใช้ เป็นเพียงเรื่องของงานที่คุณกำลังทำและวิธีการที่คุณพอใจที่สุด ฉันใช้ทั้งสองอย่าง


1
"ในเวอร์ชันของ bash และsudoฉันมีกับ kubuntu lucid sudo cdตอนนี้ใช้ได้ - โดยไม่มีวิธีแก้ไขปัญหาใด ๆ " สั้น ๆอย่างนั้นซึ่งฉันค่อนข้างมั่นใจว่าไม่เคยมีมาก่อนใน Ubuntu โดยไม่รู้ตัว (นอกจากนี้ฉันใช้ 10.04 แต่ไม่ได้ทำเช่นนั้น) เป็นเวลาหลายปีแล้วที่คุณโพสต์สิ่งนี้ แต่คุณจำรายละเอียดได้หรือไม่ ไม่sudo cdยังคงทำงานสำหรับคุณ? เอาต์พุตของtype -a sudoเชลล์ทำงานที่ไหน? ฉันเข้าใจว่าคุณอาจไม่รู้ - และส่วนที่สองของคำตอบของคุณยังคงเกี่ยวข้อง - แต่ถ้าคุณทำคุณสามารถแก้ไขได้
Eliah Kagan

@EliahKagan ตอนนี้มันไม่ทำงานสำหรับฉันใน 16.10 และฉันจำไม่ได้ว่าฉันทำอะไรไปแล้ว มันผิดกับศาสนาของฉันที่จะแก้ไขคำสั่งพื้นฐานที่มีอยู่ดังนั้นฉันจึงไม่ทำอย่างนั้น ไม่ว่าในกรณีใด ๆ แม้ว่ามันจะทำงานได้ทุกคนก็จะเรียกมันว่านิสัยที่ไม่ดีเพราะมันจะไม่ทำงานโดยทั่วไป
Joe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.