คำสั่งในสคริปต์ดำเนินการหนึ่งต่อหนึ่งโดยอิสระ สคริปต์เองเป็นพาเรนต์ของคำสั่งทั้งหมดในสคริปต์เป็นกระบวนการอิสระอื่นและคำสั่ง su ไม่สามารถและไม่สามารถเปลี่ยนเป็นรูทได้: คำสั่ง su สร้างกระบวนการใหม่ด้วยสิทธิ์พิเศษของรูท
หลังจากคำสั่ง su เสร็จสิ้นกระบวนการหลักซึ่งยังคงทำงานในฐานะผู้ใช้เดียวกันจะดำเนินการกับสคริปต์ที่เหลือ
สิ่งที่คุณต้องการทำคือเขียนสคริปต์ตัวคลุม คำสั่งที่มีสิทธิใช้งานจะเข้าสู่สคริปต์หลักตัวอย่างเช่น~/main.sh
#!/bin/sh
ls /root
สคริปต์ตัวตัดคำเรียกสคริปต์หลักพร้อมสิทธิ์รูทเช่นนี้
#!/bin/sh
su -c ~/main.sh root
เพื่อเปิดใช้งานกระบวนการนี้ให้คุณเรียกใช้ wrapper ซึ่งจะเปิดใช้งานสคริปต์หลักหลังจากเปลี่ยนผู้ใช้เป็นผู้ใช้รูท
เทคนิค wrapper นี้สามารถใช้เปลี่ยนสคริปต์เป็น wrapper ได้ โดยทั่วไปตรวจสอบเพื่อดูว่ามันทำงานเป็นรูทหรือไม่ถ้าไม่ใช้ "su" เพื่อเรียกใช้งานตัวเองอีกครั้ง
$ 0 เป็นวิธีที่สะดวกในการสร้างสคริปต์ที่อ้างถึงตัวมันเองและคำสั่ง whoami สามารถบอกเราได้ว่าเราเป็นใคร
ดังนั้นสคริปต์หลักที่มี wrapper ในตัวจึงกลายเป็น
#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root
หมายเหตุการใช้งานของ exec มันหมายถึง "แทนที่โปรแกรมนี้ด้วย" ซึ่งสิ้นสุดการดำเนินการอย่างมีประสิทธิภาพและเริ่มโปรแกรมใหม่ที่เปิดตัวโดย su ด้วยรูทเพื่อเรียกใช้จากด้านบน อินสแตนซ์การแทนที่คือ "รูท" ดังนั้นจึงไม่เรียกใช้ทางด้านขวาของ ||
sudo su
ทำให้ดวงตาของฉันเจ็บ