เมื่อใช้ && และ sudo ในคำสั่งแรกคำสั่งที่สองจะเรียกใช้เป็น sudo ด้วยหรือไม่


64

ถ้าฉันเรียกใช้คำสั่ง

sudo some-command && some-other-command

คำสั่งที่สองถูกเรียกใช้ด้วยsudoprevilege ด้วยหรือไม่

คำตอบ:


110

TL; DR: ไม่


คำสั่งแรกคือ

sudo some-command

คำสั่งที่สองคือ

some-other-command

คำสั่งsudoใช้คำสั่งต่อไปนี้และดำเนินการด้วยสิทธิพิเศษที่ยกระดับ &&แต่ไม่ได้อยู่ในคำสั่งและมีการตีความโดยเปลือกก่อนที่จะดำเนินการคำสั่งแรก มันบอกทุบตีเพื่อรันคำสั่งแรกก่อนและประสบความสำเร็จในคำสั่งที่สอง

ดังนั้นไม่ทราบเกี่ยวกับsudo && some-other commandเมื่อกระบวนการที่ยกระดับยุติลง bash จะรับค่าส่งคืนจากนั้นดำเนินการคำสั่งอื่นซึ่งอีกครั้งจะไม่รู้จักกระบวนการแรก

สิ่งนี้สามารถแสดงให้เห็นได้อย่างง่ายดาย:

$ sudo whoami && whoami
root
username

ในการเข้าถึงสิ่งที่คุณต้องการคุณสามารถเริ่มทุบตีที่สูงขึ้นและปล่อยให้มันรันทั้งสองคำสั่ง:

$ sudo bash -c 'whoami && whoami'
root
root

ดังนั้นตอนนี้คำสั่งทั้งสองจะถูกดำเนินการในฐานะรูทเนื่องจากกระบวนการทั้งหมดที่อธิบายไว้ข้างต้นถูกดำเนินการในกระบวนการยกระดับเช่นเซสชัน bash เริ่มต้นด้วยคำสั่งนี้ซึ่งออกทันทีหลังจากเสร็จสิ้น แต่ถึงกระนั้นทั้งคู่ก็whoamiยังไม่รู้จักการดำรงอยู่ของกันและกัน

สิ่งนี้ไม่เหมาะกับวัตถุประสงค์ใด ๆ แต่สำหรับการสาธิตนี้วิธีที่ง่ายกว่าคือการทำ

sudo some-command && sudo some-other-command

29
+1 สำหรับwhoamiตัวอย่าง
Carl H


การสาธิตนี้เจ๋งจริงๆ! ต้องคิดให้ดีเมื่อพยายามสอน sudo กับผู้อื่นในครั้งต่อไป!
กระจายตัวจำเป็นต้องมี

20

ไม่ตัวอย่างบางส่วนที่ทำเช่นนี้คือ:

sudo some-command && sudo some-other-command 
sudo sh -c "some-command && some-other-command"

หรือถ้าคุณต้องการคำสั่งซ้อนคุณสามารถทำได้:

sudo bash <<"EOF"
some-command
some-other-command
sudo bash <<"EOF2"
    some-command2
    some-other-command2
EOF2
EOF
  • ที่สองใช้เชลล์อื่น
  • โปรดทราบว่าเมื่อคุณใช้ 'หรือ' ในรุ่นที่ 2 คุณจะต้องหลีกเลี่ยงคำสั่งหรือพารามิเตอร์ของคำสั่งนั้น (เช่น. \ 'หรือ \ ") เพื่อให้ซับซ้อนได้อย่างรวดเร็ว

วิธีที่สามใช้งานไม่ได้: $ sudo -s -- whoami && whoamiมอบให้root username
BartekChom

@BartekChom ขอโทษฉันพลาดคำพูดในนั้น
Rinzwind

sudo -s -- "whoami && whoami""whoami && whoami"ดูเหมือนว่าจะให้คำสั่งไม่พบมากขึ้นหรือน้อยเช่นเดียวกับคำสั่ง วิธีใช้สิ่งก่อสร้างนี้ด้วย && ผมเห็นว่า จะช่วยให้ไม่มีข้อผิดพลาดเมื่อเทียบกับsudo -s cd .. sudo cd ..
BartekChom

ฉันได้เรียนรู้สิ่งใหม่วันนี้: sudo bash <<"EOF"! ขอบคุณ! :-)
Fabby


2

&&หมายความว่าสิทธิที่เข้าข้าง (สอง) คำสั่งเพียง แต่จะทำงานเฉพาะถ้าเกรงว่าเข้าข้าง (ตอนแรก) คำสั่งเป็นรหัสที่ประสบความสำเร็จคือทางออกคือ$?0

คำสั่งทั้งสองนั้นแตกต่างกันและจะทำงานในสภาพแวดล้อมของตนเองดังนั้นคำสั่งที่สองจะไม่ทำงานโดยมีsudoสิทธิ์

สิ่งนี้จะทำให้คุณชัดเจน:

$ sudo whoami && whoami 
root
foobar

1

ไม่และต่อไปนี้เคยเป็นมาโครที่พบเห็นได้ทั่วไป

sudo reboot && exit

ทุกคนควรทำอย่างน้อยหนึ่งครั้ง

sudo apt-get update && sudo apt-get upgrade

ดังนั้นจึงเป็นคำถามสัมภาษณ์ "มิกกี้เมาส์" ที่ดี

นี่คือการทดสอบอย่างง่ายดายว่าคำถามอาจถูกสงสัยว่าเป็นแบบฝึกหัดการเติมเต็ม


0

บนบรรทัดคำสั่งเมื่อคุณเห็น

$ command one && command two

ความตั้งใจโดยทั่วไปคือการดำเนินการคำสั่งที่ตามหลัง && เฉพาะในกรณีที่คำสั่งแรกสำเร็จ

คำสั่งอื่นทำงานเป็น sudo ด้วยหรือไม่

ไม่อย่างแน่นอนนี่เป็นเพียงการเขียนคำสั่งที่ต่อเนื่องกันสองคำสั่ง && นี้ไม่ให้สิทธิ์เพิ่มเติมแก่คำสั่ง มันเป็นเพียง seperator

เพื่อพิสูจน์ว่าให้เรายกตัวอย่าง

touch fileA fileB 

ฉันสร้างสองไฟล์ fileA และ fileB ตอนนี้ฉันจะเรียกใช้คำสั่ง

sudo chown test:test fileA && chown test:test fileB

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

ผลลัพธ์คือ:

chown: changing ownership of `fileB': Operation not permitted

ดังนั้นคำสั่งจึงไม่ทำงานเนื่องจากต้องการsudoและแม้ว่าเราสามารถสรุปได้ว่า && ไม่ได้เป็นการแทนที่คำสั่งที่สองsudo

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.