คำตอบมีสองส่วน: !!
และsudo
!!
เป็นส่วนหนึ่งของการทำงานของเชลล์ (ในกรณีของ Ubuntu นี่อาจเป็นทุบตี แต่เชลล์อื่น ๆ เช่น zsh หรือ csh สนับสนุนสิ่งนี้เช่นกัน) เรียกว่า "การขยายประวัติ" มันทำงานในลักษณะเดียวกันกับการขยายตัวอื่น ๆ ที่เชลล์ขยาย 'ตัวยึด' เป็นชุดของคำ ขณะที่foo*
จะขยายไปยังรายการไฟล์ทั้งหมดที่เริ่มต้นด้วย 'foo' !!
จะได้รับการขยายไปยังเนื้อหาของบรรทัดคำสั่งก่อนหน้า
$ echo foobar
foobar
$ echo !!
echo foobar
$ !!
echo foobar
เช่นเดียวกับการขยายตัวอื่น ๆ สิ่งนี้ทำโดยเชลล์ทั้งหมดดังนั้นหากคุณพิมพ์!!
หลังจากคำสั่งอื่นคำสั่งนี้ไม่ทราบว่ามีคำสั่ง a !!
แต่จะเห็นบรรทัดคำสั่งก่อนหน้าเท่านั้น (ไม่เหมือนกับส่วนขยายอื่น ๆ การขยายประวัติเกิดขึ้นก่อนที่คำสั่งจะถูกบันทึกไว้ในประวัตินั่นคือแทนที่จะ!!
เป็นบรรทัดคำสั่งที่ถูกแทนที่จะถูกบันทึกไว้ในประวัติ)
sudo
คำสั่งอนุญาตให้รันคำสั่งเป็นผู้ใช้อื่นให้สิทธิ์ ar ที่ได้รับจากนโยบายการรักษาความปลอดภัย (ค่าเริ่มต้นการกำหนดค่าใน/etc/sudoers
)
โดยค่าเริ่มต้นรหัสผ่านรูทยังคงไม่ได้รับการตั้งค่าใน Ubuntu เพื่อดำเนินงานการบริหารระบบผู้ใช้ที่สร้างขึ้นระหว่างการติดตั้งจะได้รับสิทธิ์ sudo ขณะนี้ผู้ใช้นี้สามารถดำเนินการคำสั่งใด ๆ บนเปลือกรากเป็นเพียงโดย sudo
prepending โปรแกรม GUI บางโปรแกรมใช้กลไก sudo เช่นกันเช่นการจัดการแพ็คเกจ
เหตุผลที่sudo
สามารถรันคำสั่งอื่น ๆ ในฐานะ root (หรือผู้ใช้อื่น) คือ sudo binary ( /usr/bin/sudo
) มี setuid bit set ที่ได้รับอนุญาตและเป็นของ root สามารถดำเนินการใด ๆ (ไบนารี) กับชุด setuid บิตด้วยสิทธิ์ของเจ้าของ ซึ่งหมายความว่า sudo ทำงานได้อย่างมีประสิทธิภาพด้วยการอนุญาตรูทไม่ว่าผู้ใช้รายใดจะเรียกมันว่าอะไรก็ตาม มีเพียงเขาเท่านั้นที่นโยบายความปลอดภัยภายในของ sudo จัดการผู้ใช้คนใดที่ได้รับอนุญาตให้ทำอะไรและป้องกันผู้ใช้รายใดก็ตาม
ดังนั้นในกรณีsudo !!
นี้หมายถึง
$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo !!
เป็นพื้นเหมือนกันกับ
$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo mount /dev/sdb1 /mnt
พิมพ์น้อยลง ในทั้งสองกรณี sudo เพิ่งเห็นmount /dev/sdb1 /mnt
และรันด้วยการอนุญาตรูท