เปลี่ยนเส้นทางการส่งออกจะกระทำโดยเปลือกจากการที่คำสั่งที่ได้รับการเรียก ดังนั้นแบ่งทุกอย่างออกเป็นชิ้น ๆ นี่คือสิ่งที่เกิดขึ้น *:
เชลล์เรียกใช้sudo echo "options drm_kms_helper poll=N"
ซึ่งรันsudo
คำสั่งด้วยecho "options drm_kms_helper poll=N"
บรรทัดรับคำสั่ง
sudo ขอรหัสผ่านเปิดเชลล์ superuser และเรียกใช้echo "options drm_kms_helper poll=N"
ซึ่งเรียกใช้echo
คำสั่งผ่านมัน"options drm_kms_helper poll=N"
echo รันด้วยroot
สิทธิพิเศษพิมพ์สตริงไปยังเอาต์พุตมาตรฐาน
echo
คำสั่งสิ้นสุด, superuser shell exits, sudo
terminates
เชลล์ที่คำสั่งถูกเรียกใช้รวบรวมเอาต์พุตและพยายามเปลี่ยนทิศทางไป/etc/modprobe.d/local.conf
ที่ซึ่งสามารถเขียนได้โดย root เท่านั้น ได้รับข้อผิดพลาด "สิทธิ์ถูกปฏิเสธ"
สำหรับวิธีแก้ไขนี้ให้ดูที่ @shantanu answer
(*) - ในขณะที่ลำดับข้างต้นช่วยให้เข้าใจว่าทำไมคำสั่งล้มเหลวในความเป็นจริงสิ่งที่เกิดขึ้นค่อนข้างออกคำสั่ง: เปลือกเดิมสังเกตเห็นการเปลี่ยนเส้นทางและพยายามที่จะเปิดไฟล์สำหรับการเขียนก่อนที่จะเรียกsudo ...
คำสั่ง เมื่อเปิดไฟล์ล้มเหลวเชลล์ไม่ได้เรียกใช้คำสั่งที่ควรจะเขียนไปยังไฟล์ (ขอบคุณ @PanosRontogiannis เพื่อชี้ให้เห็นสิ่งนี้)
นี่คือการทดสอบอย่างรวดเร็ว:
$ touch ./onlyroot.txt
$ sudo chown root:root ./onlyroot.txt
$ sudo bash -c "whoami | tee who.txt" > onlyroot.txt
bash: onlyroot.txt: Permission denied
ในการทดสอบด้านบนwhoami | tee who.txt
กำลังจะสร้างไฟล์ชื่อwho.txt
ที่มีคำว่า "root" อย่างไรก็ตามเมื่อการเปลี่ยนเส้นทางเอาต์พุตล้มเหลวในเชลล์การเรียกไฟล์ "who.txt" ก็หายไปเช่นกันเพราะคำสั่งไม่ได้ถูกเรียกใช้
saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi