เปลี่ยนเส้นทางการส่งออกจะกระทำโดยเปลือกจากการที่คำสั่งที่ได้รับการเรียก ดังนั้นแบ่งทุกอย่างออกเป็นชิ้น ๆ นี่คือสิ่งที่เกิดขึ้น *:
เชลล์เรียกใช้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, sudoterminates
เชลล์ที่คำสั่งถูกเรียกใช้รวบรวมเอาต์พุตและพยายามเปลี่ยนทิศทางไป/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