ทำไมเราต้องเป็นรูทในเครื่องเพื่อปิดและรีสตาร์ท?


65

เมื่อเราติดตั้ง / ลบ / อัปเดตแพคเกจหรือทำการเปลี่ยนแปลงใด ๆ ที่จำเป็นต้องมีสิทธิ์ระดับผู้ดูแลระบบเราจะขอให้คุณใส่รหัสผ่านของผู้ใช้ที่เป็นผู้ดูแลระบบซึ่งจะsudoเกิดขึ้นผ่าน GUI และเทอร์มินัล

พรอมต์ผ่าน GUI

อย่างไรก็ตามหากเราพยายามปิดและรีสตาร์ทผ่านเทอร์มินัลก็บ่นว่าเราต้องเป็นroot:

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

แต่เราจะไม่ถามรหัสผ่านเมื่อเราทำการกระทำเหล่านี้ผ่านทางล้อฟันเฟืองที่ด้านบนขวา

เมนูฟันเฟือง

ทำไมจึงมีความคลาดเคลื่อนนี้


5
คำถามที่ดี .. คุณรู้ว่าสิ่งที่ฉันจะถามเหมือนกัน สถานการณ์ของฉันคือการปิดอูบุนตูด้วยปุ่มลัด i, e เมื่อใดก็ตามที่ฉันกดคีย์ที่กำหนดบางอย่างเช่นctrl + super + sมันรันคำสั่งsudo shutdown -h nowแต่ปัญหาคือว่าโดยไม่ได้รับอนุญาตการเข้าถึงshutdownมันไม่ทำงาน .. เพราะมันจะขอรหัสผ่านเพื่อป้อนหลังจากที่ไหน / อย่างไร .. หวังว่าคุณจะเข้าใจสถานการณ์ของฉัน .. :)
Saurav Kumar

ดูเพิ่มเติมที่: askubuntu.com/questions/1190/…
Takkat

ดูเพิ่มเติมที่: unix.stackexchange.com/questions/18503/…
amyassin

คำตอบ:


50

การปิดระบบล้อเฟืองจะตรวจสอบว่าคุณได้รับอนุญาตให้ปิดเครื่องหรือไม่ สิ่งนี้ทำผ่าน PolicyKit ในกรณีที่ปิดคำสั่งนี้ในไฟล์/usr/share/polkit-1/actions/org.freedesktop.consolekit.policyจะถูกตรวจสอบ:

<action id="org.freedesktop.consolekit.system.stop">
  <description>Stop the system</description>
  <message>System policy prevents stopping the system</message>
  <defaults>
    <allow_inactive>no</allow_inactive>
    <allow_active>yes</allow_active>
  </defaults>
</action>

PolicyKit ทริกเกอร์dbus-sendคำสั่ง ในกรณีที่ปิดระบบจะเป็น:

dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown

มี daemon ที่ทำงานในพื้นหลังพร้อมกับรูทสิทธิพิเศษที่เรียกใช้คำสั่ง shutdown สำหรับคุณ

เมื่อคุณต้องการปิดเครื่อง "วิธีเก่า" ผ่านทางบรรทัดคำสั่ง ( shutdown, reboot, halt, ...) คุณจะต้องเพิ่ม suid-Bit ลงในคำสั่งเหล่านั้น แต่ระวังให้ทุกคนในระบบของคุณที่เข้าถึงเชลล์แล้วสามารถปิดเครื่องของคุณได้


14
ตัวเลือกที่ปลอดภัยกว่าเล็กน้อยคืออนุญาตให้ปิดระบบที่ไม่มีรหัสผ่านของ sudoers ซึ่งทำได้อย่างง่ายดาย: ป้อนsudo visudoเพิ่ม%sudo ALL = NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/halt, /sbin/rebootบันทึกและออก ด้วยวิธีนี้การรีบูตบรรทัดคำสั่งจะยังคงต้องการsudo rebootแต่คุณไม่ต้องป้อนรหัสผ่าน
Sebastian Thürrschmidt

27

Ubuntu เป็นระบบ GNU / Linux Operationg ซึ่งเป็นของตระกูล Unix ซึ่งเป็นสถาปัตยกรรมทั่วไปของระบบปฏิบัติการที่ทันสมัย

Unix ที่ใช้ในการทำงานบนคอมพิวเตอร์เมนเฟรม สิ่งอำนวยความสะดวกด้านการประมวลผลส่วนกลางซึ่งให้บริการ dozends หรือผู้ใช้หลายร้อยคนผ่านเทอร์มินัลระยะไกล เนื่องจากผู้ใช้ทั้งหมดอาศัยความพร้อมใช้งานของเมนเฟรมจึงไม่อนุญาตให้ผู้ใช้รายเดียวออกคำสั่งปิดระบบ แนวคิดที่เป็นพื้นฐานของสถาปัตยกรรม Unix - เคอร์เนลระบบจะไม่เริ่มต้นการปิดระบบเว้นแต่ว่าฟังก์ชั่นตามนั้นถูกเรียกใช้โดยกระบวนการ superuser

ในปัจจุบันนักพัฒนาระบบเดสก์ท็อปได้ผ่านความเจ็บปวดบางอย่างเพื่อให้การปิดการใช้งานสำหรับผู้ใช้เดสก์ท็อปเท่านั้น เทคนิคทั่วไปคือเพื่อให้ตัวจัดการล็อกอินซึ่งโดยปกติจะทำงานในบริบทความปลอดภัยของผู้ใช้รูทจัดการการปิดและรีบูต ในกรณีนี้เชลล์กราฟิกออกคำขอไปยังตัวจัดการการเข้าสู่ระบบเพื่อปิดเครื่องคอมพิวเตอร์ สิ่งนี้เกี่ยวข้องกับการใช้การสื่อสารระหว่างกระบวนการ (IPC) โดยปกติผ่านบริการ dbus

ชุดนโยบายดังกล่าวข้างต้นขยายกระบวนการนี้โดยการจัดทำกรอบมาตรฐานที่ผู้จัดการการเข้าสู่ระบบ (หรือโปรแกรมใด ๆ ที่ให้บริการปิดระบบ) สามารถตรวจสอบสิ่งที่ผู้ใช้จะได้รับอนุญาตให้ก่อให้เกิดการปิดและผ่านผู้ดูแลระบบสามารถกำหนดสิทธิ์

สภาพแวดล้อมเดสก์ท็อปบางอย่างไม่ได้ใช้บริการที่ใช้ IPC แต่เป็นชุดของโปรแกรมตัวช่วยเพื่อมอบฟังก์ชันที่เหมือนกันหรือคล้ายกัน โปรแกรมผู้ช่วยเหลือเหล่านั้นจะถูกเรียกผ่านกลไกทำให้สามารถเปลี่ยนเป็นบริบทผู้ใช้ระดับสูงเช่น sudo, suid หรือกลไกชุดนโยบายคล้ายกับ sudo

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


14

เนื่องจากลีนุกซ์ถูกใช้เป็นเซิร์ฟเวอร์หรือคล้ายกัน, และ SSHing ลงในกล่องลินุกซ์, แม้แต่แล็ปท็อป Ubuntu ทั่วไป, ค่อนข้างธรรมดา.

สิ่งนี้คือคุณอาจไม่ต้องการให้ผู้ที่มีสิทธิ์เข้าถึง SSH สามารถปิดใช้งานได้โดยเฉพาะอย่างยิ่งเมื่อผู้ใช้อื่นลงชื่อเข้าใช้จากระยะไกล ใครบางคนที่สามารถเข้าถึง GUI ได้ - เขาสามารถปิดมันเองได้ด้วยปุ่มเปิดปิดเครื่อง

นอกจากนี้ผู้ใช้ที่ล็อกอินจากระยะไกลจะไม่สามารถเปิดใช้งานอีกครั้งได้


มันไม่ได้เกิดขึ้นกับฉันในเวลานั้นเมื่อฉันถามคำถามนี้ แต่ฉันคิดว่ามันเป็นตัวเลือกใน Ubuntu เพื่อติดตั้งแพ็คเกจ GUI ในเซิร์ฟเวอร์ระยะไกลและใช้เซิร์ฟเวอร์ระยะไกลผ่าน GUI แทนบรรทัดคำสั่ง (คล้ายกับวิธีการทำงานของ Windows Remote Desktop หรือ Teamviewer) ดังนั้นการสันนิษฐานว่าจะทำให้ผู้ใช้ Ubuntu บน GUI สามารถปิดใช้งานได้ด้วยปุ่มเปิด / ปิดเครื่อง
Aditya

@aditya ที่ต้องการเซิร์ฟเวอร์ที่ติดตั้งด้วยวิธีนี้ซึ่งผู้ดูแลระบบต้องตัดสินใจทำ
Manishearth

ใช่. มันจะต้องมีสิทธิ์ใช้งานรูทเพื่อให้สามารถติดตั้งแพ็กเกจและกำหนดค่าได้ตามความจำเป็น แต่สถานการณ์นี้มาถึงใจของฉันในขณะที่อ่านคำตอบของคุณเมื่อวานนี้และฉันคิดว่าฉันจะแบ่งปันให้กับคุณ :-)
Aditya

14

เมื่อฉันรีบูตผ่าน GUI ฉันสามารถทำได้โดยไม่ต้องใช้sudoรหัสผ่าน

เฉพาะในกรณีที่คุณเป็นผู้เดียวที่เข้าสู่ระบบหากมีผู้ใช้รายอื่น (รวมถึงผู้ใช้คอนโซล) คุณอาจต้องป้อนรหัสผ่านรูท นี่เป็นสิ่งเดียวกันใน OS X และ Windows รุ่นใหม่กว่า

ทำไมถึงเป็นอย่างนั้น? เกิดอะไรขึ้นภายในระบบ Ubuntu ที่นั่น?

คำสั่งต่อไปนี้:

/usr/bin/dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop

D-Bus เป็นกลไก IPC - เป็นสื่อกลางสำหรับการสื่อสารภายในระหว่างกระบวนการที่ทำงานบนโฮสต์เดียวกัน

D-Bus เป็น "ฉลาด" กว่าโปรโตคอลส่งข้อความระดับต่ำเช่น UDP ในทางตรงกันข้ามมันส่งข้อความเป็นรายการที่ไม่ต่อเนื่องไม่ใช่กระแสข้อมูลต่อเนื่อง

D-Bus มีมุมมองแบบโครงสร้างของข้อมูลที่ดำเนินการและจัดการกับข้อมูลในรูปแบบไบนารี ตัวเลขจำนวนเต็มของความกว้างสตริงและอื่น ๆ เนื่องจากข้อมูลไม่ได้เป็นเพียง "raw bytes" ถึง D-Bus ข้อความจึงสามารถตรวจสอบได้

- ตั้งโต๊ะฟรี

ทำไมshutdownคำสั่งไม่ตรวจสอบว่ามีใครลงชื่อเข้าใช้หรือไม่ ซึ่งดูเหมือนว่าเป็นคุณลักษณะที่ไม่น่าเชื่อถือ ฉันสามารถจินตนาการได้ว่ามันจะประหยัดเวลาบางครั้ง แต่มักจะต้องการคอนโซลที่สอดคล้องกัน ฉันไม่ต้องการคำสั่งในบางครั้งต้องใช้รหัสผ่านหลังจากใช้งานและบางครั้งไม่ต้องการ

สรรพนามของฉันคือเขา / เขา


นอกจากนี้ยังมีเวอร์ชั่นที่สั้นกว่าผ่านแอพ qdbus
Sergiy Kolodyazhnyy

เมื่อปิดระบบ / ออกจากระบบ DE (GNOME ในกรณีนี้) ฉันไม่ได้ขอsudoรหัสผ่านรูท / ผู้ใช้ทั้งกับผู้ใช้อื่นที่เข้าสู่ระบบผ่านทาง GDM หรือกับผู้ใช้อื่นเข้าสู่ระบบผ่าน tty
kos

@ kos hu มันแปลก ภาพหน้าจอนั้นเป็นของ Gnome 3 และฉันเข้าสู่ระบบใน gui และ tty
ทิม

ฉันหมายถึงฉันได้รับข้อความเดียวกัน แต่การคลิก "ปิดเครื่อง" จะดำเนินต่อไปและปิดระบบ ฉันยังขอให้ Fabby ทดสอบสิ่งนี้และมันก็ไม่เหมือนกันสำหรับเขาเช่นกันไม่แน่ใจว่ามันเกี่ยวกับอะไร
kos

@ kos ohh หูแขวนอยู่
ทิม

9

เหตุผลที่คุณไม่จำเป็นต้องรูทเพื่อเริ่มต้นการปิดระบบจาก GUI นั้นส่วนใหญ่เป็นเรื่องของความสะดวกสบายสำหรับผู้ใช้เดสก์ท็อปทั่วไป ระบบรู้ว่าคุณเป็นผู้ใช้ที่เข้าสู่ระบบบนคอนโซลดังนั้นหากคุณปิดคอมพิวเตอร์โดยไม่ได้ตั้งใจคุณสามารถเปิดใช้งานได้อีกครั้ง

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

เหตุผลที่การปิดระบบไม่ได้ให้พรอมต์ GUI สำหรับรหัสผ่านผู้ใช้ขั้นสูงอาจเป็นเพราะไม่มียูทิลิตี้ตัวจริงที่จะได้รับ - ถ้าคุณอยู่บนคอนโซลที่พรอมต์จะปรากฏขึ้นคุณสามารถใช้ cog- เลือกเมนู Wheeel แทน หากคุณต้องการให้พรอมต์บรรทัดคำสั่งสำหรับรหัสผ่านผู้ใช้ขั้นสูงสำหรับการปิดระบบแสดงว่ามี "การปิดระบบ sudo" อยู่แล้ว


5

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

เช่นเดียวกันกับคำสั่ง Halt และ PowerOff เช่นกัน


2
ขอบคุณสำหรับคำตอบของคุณฉันเข้าใจว่าฉันเป็นผู้ใช้เครื่องที่ใช้งานหลายสิบคนไม่สามารถรีบูทเครื่องได้ แต่ Ubuntu (หรือเดสก์ท็อป distros ทั้งหมด) ทำอะไรเมื่อฉันเลือกที่จะรีบูตด้วยเมาส์ แทนคีย์บอร์ด? พวกเขาอนุญาตให้มีโดยไม่ต้อง priveliges
asco

3
ส่วนประกอบต่างๆเช่น systemctl, loginctl, systemd, นโยบายของระบบและอื่น ๆ ทั้งหมดอนุญาตให้ผู้ใช้ที่เข้าสู่ระบบในปัจจุบันสามารถเข้าถึงฟังก์ชั่นรูตบางอย่างได้โดยไม่ต้องมีการเข้าถึงรูทอย่างชัดเจนเพื่อให้เดสก์ท็อปนั้น คำสั่งเพื่อทำงานเหล่านั้น
Jeff Sereno
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.