Tại sao chúng ta cần phải root trong terminal để tắt máy và khởi động lại?


65

Khi chúng tôi cài đặt / xóa / cập nhật các gói hoặc thực hiện bất kỳ thay đổi nào cần đặc quyền quản trị, chúng tôi sẽ được nhắc nhập mật khẩu của người dùng quản trị viên có sudođặc quyền - điều này xảy ra cả thông qua GUI và thiết bị đầu cuối.

nhắc qua gui

Tuy nhiên, nếu chúng tôi cố gắng tắt máy và khởi động lại qua thiết bị đầu cuối, nó sẽ phàn nàn rằng chúng tôi cần phải root:

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

Nhưng chúng tôi không bao giờ được yêu cầu nhập mật khẩu khi chúng tôi thực hiện các hành động này thông qua bánh răng cưa ở trên cùng bên phải.

menu bánh xe

Tại sao có sự khác biệt này?


5
Câu hỏi hay .. Bạn biết những gì tôi sẽ hỏi tương tự. Kịch bản của tôi là tắt Ubuntu bằng các phím tắt. i, e khi tôi nhấn một số phím được gán như ctrl + super + s, nó thực thi lệnh sudo shutdown -h nownhưng vấn đề là không có quyền truy cập vào shutdownnó sẽ không bao giờ hoạt động .. Bởi vì nó sẽ yêu cầu nhập mật khẩu sau khi nhấn phím tắt .. Hy vọng bạn hiểu tình hình của tôi .. :)
Saurav Kumar


Câu trả lời:


50

Việc tắt máy kiểm tra bánh xe nếu bạn được phép tắt máy. Điều này được thực hiện thông qua PolicyKit. Trong trường hợp tắt máy, tuyên bố này trong tệp /usr/share/polkit-1/actions/org.freedesktop.consolekit.policyđược chọn:

<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>

Chính sách kích hoạt một dbus-sendlệnh. Trong trường hợp tắt máy, nó sẽ là:

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

Có một trình nền chạy trong nền với các đặc quyền gốc gọi lệnh tắt máy cho bạn.

Khi bạn muốn có thể tắt máy "theo cách cũ" thông qua dòng lệnh ( shutdown, reboot, halt, ...), thì bạn cần thêm suid-Bit vào các lệnh đó. Nhưng hãy lưu ý, mọi người trong hệ thống của bạn, có quyền truy cập vào vỏ sau đó có thể tắt máy của bạn.


14
Một tùy chọn an toàn hơn một chút sẽ là cho phép sudoers tắt mật khẩu, v.v ... Điều đó dễ dàng thực hiện: nhập sudo visudo, thêm %sudo ALL = NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/halt, /sbin/reboot, lưu và thoát. Bằng cách này, khởi động lại dòng lệnh vẫn sẽ yêu cầu sudo reboot, nhưng bạn sẽ không phải nhập mật khẩu của mình.
Sebastian Thürrschmidt

27

Ubuntu là một bản phân phối của Hệ điều hành GNU / Linux, lần lượt thuộc họ hệ thống Unix - một kiến ​​trúc phổ biến cho một số Hệ điều hành hiện đại.

Theo truyền thống, Unix được sử dụng để chạy trên máy tính lớn. Các cơ sở tính toán trung tâm phục vụ dozends hoặc hàng trăm người dùng thông qua các thiết bị đầu cuối từ xa. Vì tất cả người dùng đều dựa vào tính khả dụng của máy tính lớn, không một người dùng nào được phép ra lệnh tắt máy. Một ý tưởng cơ bản cho kiến ​​trúc Unix - hạt nhân hệ thống sẽ không bao giờ khởi tạo tắt máy trừ khi chức năng theo được gọi bởi một quá trình siêu người dùng.

Trong các hệ thống máy tính để bàn hiện đại, các nhà phát triển đã trải qua những khó khăn nhất định để tắt máy cho người dùng máy tính để bàn đơn thuần. Một kỹ thuật phổ biến là, để cho phép trình quản lý đăng nhập, thường chạy trong ngữ cảnh bảo mật của người dùng root, xử lý tắt máy và khởi động lại. Trong trường hợp này, vỏ đồ họa đưa ra yêu cầu cho người quản lý đăng nhập tắt máy tính. Điều này liên quan đến việc sử dụng giao tiếp giữa các quá trình (IPC), thường thông qua dịch vụ dbus.

Bộ chính sách được đề cập ở trên mở rộng quy trình này bằng cách cung cấp khung chuẩn hóa mà qua đó trình quản lý đăng nhập (hoặc bất kỳ chương trình nào cung cấp dịch vụ tắt máy) có thể kiểm tra những gì người dùng được phép gây ra tắt máy và thông qua quản trị viên có thể định cấu hình các quyền đó tương ứng.

Một số môi trường máy tính để bàn không sử dụng các dịch vụ dựa trên IPC mà thay vào đó là một bộ các chương trình trợ giúp để cung cấp các chức năng tương tự hoặc tương tự. Các chương trình trợ giúp đó sẽ được gọi thông qua các cơ chế, cho phép thay đổi vào bối cảnh siêu người dùng, như sudo, suid hoặc cơ chế bộ chính sách tương tự như sudo.

Trong mọi trường hợp, chương trình tắt truyền thống ngu ngốc trên vỏ không hoạt động theo cách này, Nó đòi hỏi bạn phải thấy rằng nó được chạy trong bối cảnh siêu người dùng.


14

Bởi vì Linux thường được sử dụng như một máy chủ hoặc tương tự, và SSH vào một hộp linux, thậm chí là một máy tính xách tay Ubuntu bình thường, là khá phổ biến.

Điều quan trọng là, bạn có thể không muốn những người có quyền truy cập SSH có thể tắt nó, đặc biệt là khi có thể có người dùng đăng nhập từ xa khác sử dụng nó. Một người nào đó có quyền truy cập vào GUI - tốt, anh ta có thể tự tắt nó bằng nút nguồn vật lý.

Ngoài ra, người dùng đăng nhập từ xa sẽ không thể bật lại.


Điều đó đã không xảy ra với tôi khi tôi hỏi câu hỏi này, nhưng tôi cho rằng chúng là các tùy chọn trong Ubuntu để cài đặt các gói GUI trong một máy chủ từ xa và sử dụng máy chủ từ xa qua GUI thay vì dòng lệnh. (Tương tự như cách Windows Remote Desktop hoặc Teamviewer hoạt động). Vì vậy, điều đó sẽ làm mất hiệu lực giả định rằng ai đó sử dụng Ubuntu qua GUI có thể tắt bằng nút nguồn vật lý.
Aditya

@aditya cần máy chủ được thiết lập theo cách đó, mà quản trị viên phải quyết định thực hiện
Manishearth

Đúng. Nó sẽ yêu cầu quyền root để có thể cài đặt các gói và cấu hình khi cần thiết. Nhưng kịch bản này xuất hiện trong đầu tôi khi đọc câu trả lời của bạn ngày hôm qua và tôi nghĩ rằng tôi sẽ chia sẻ nó với bạn :-)
Aditya

14

Khi tôi khởi động lại qua GUI tôi có thể làm điều đó mà không cần sudomật khẩu.

Chỉ khi bạn là người duy nhất đăng nhập. Nếu có bất kỳ người dùng nào khác (bao gồm cả người dùng bảng điều khiển), bạn có thể phải nhập mật khẩu gốc. Điều này giống nhau trên OS X và các phiên bản Windows mới hơn.

Tại sao vậy? Điều gì đang xảy ra bên trong hệ thống Ubuntu ở đó?

Lệnh sau:

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

D-Bus là một cơ chế IPC - phương tiện để liên lạc cục bộ giữa các tiến trình đang chạy trên cùng một máy chủ.

D-Bus "thông minh" hơn các giao thức truyền tin nhắn cấp thấp như UDP. Mặt khác, nó thực hiện các thông điệp dưới dạng các mục rời rạc. Không liên tục truyền dữ liệu.

D-Bus có chế độ xem cấu trúc của dữ liệu mà nó mang theo và xử lý dữ liệu ở dạng nhị phân; số nguyên của các chiều rộng khác nhau, chuỗi, và như vậy. Vì dữ liệu không chỉ là "byte thô" cho D-Bus, tin nhắn có thể được xác thực.

- Máy tính để bàn miễn phí

Tại sao shutdownlệnh không kiểm tra xem có ai đăng nhập không? Đó có vẻ là một tính năng không trung thực để thành thật. Tôi có thể tưởng tượng đôi khi nó sẽ tiết kiệm thời gian, nhưng một giao diện điều khiển nhất quán thường được ưa thích hơn. Tôi không muốn các lệnh đôi khi yêu cầu mật khẩu sau khi chạy nó, và đôi khi không.

Đại từ của tôi là He / Ngài


Ngoài ra còn có phiên bản ngắn hơn thông qua ứng dụng qdbus
Sergiy Kolodyazhnyy 7/2/2016

Khi tắt / đăng xuất khỏi DE (Gnome trong trường hợp này), tôi không được hỏi sudomật khẩu root / user với người dùng khác đăng nhập qua GDM cũng như với người dùng khác đăng nhập qua tty.
kos

@kos hu, thật lạ. Ảnh chụp màn hình đó là của Gnome 3 và tôi đã đăng nhập vào gui và tty
Tim

Ý tôi là tôi nhận được thông báo tương tự, nhưng nhấp vào "Tắt nguồn" chỉ cần tiếp tục và tắt hệ thống. Tôi cũng yêu cầu Fabby thử nghiệm điều này và nó cũng làm như vậy với anh ta, không chắc điều đó là gì.
kos

@kos ồ. Hu treo trên.
Tim

9

Lý do bạn không cần phải root để bắt đầu tắt máy từ GUI phần lớn là sự thuận tiện cho người dùng máy tính để bàn thông thường. Hệ thống biết rằng bạn là người dùng đã đăng nhập vào bảng điều khiển, vì vậy nếu bạn tắt máy tính do nhầm lẫn, có lẽ bạn có thể bật lại.

Đối với người dùng trong trình bao, bạn rất có thể đăng nhập từ xa, vì vậy hệ thống yêu cầu bạn phải đăng nhập bằng root để ra lệnh tắt máy. Điều này ngăn người dùng thông thường đăng nhập vào máy chủ tắt nó trong khi những người khác đang sử dụng nó và trong khi không nhất thiết phải có ai đó ở đó để khởi động máy tính sao lưu.

Lý do tắt máy không cung cấp lời nhắc GUI cho mật khẩu siêu người dùng có lẽ chỉ đơn giản là không có tiện ích thực sự nào đạt được ở đó - nếu bạn đang ở trên bảng điều khiển, nơi lời nhắc sẽ xuất hiện, bạn chỉ cần sử dụng cog- menu wheeel thay thế. Nếu bạn muốn có một dấu nhắc dòng lệnh cho mật khẩu siêu người dùng để tắt máy, thì điều đó đã có sẵn với "sudo shutdown".


5

Trong hệ thống nhiều người dùng, điều cuối cùng bạn muốn là người dùng của bạn đăng nhập và có thể khởi động lại máy chủ bất cứ lúc nào, do đó, phiên bản dòng lệnh của Reboot là một lệnh chỉ dành cho người dùng, do đó bạn cần phải root hoặc có quyền sudo.

Ditto các lệnh Halt và PowerPack cũng vậy.


2
Cảm ơn câu trả lời của bạn, tôi hiểu rằng tôi với tư cách là người dùng máy được hàng chục người sử dụng không nên khởi động lại máy, nhưng Ubuntu (hoặc hầu hết tất cả các bản phân phối trên máy tính để bàn) làm gì khi tôi chọn khởi động lại bằng chuột thay vì bàn phím? Họ cho phép mà không có tư nhân.
asco

3
Các thành phần như systemctl, logincl, systemd, chính sách hệ thống, v.v ... đều cho phép người dùng hiện đang đăng nhập truy cập một số chức năng gốc nhất định mà không yêu cầu quyền truy cập root để làm cho trải nghiệm máy tính để bàn thân thiện hơn với người dùng, nhưng chúng không nhất thiết phải gọi dòng lệnh các lệnh để thực hiện các nhiệm vụ đó.
Jeff Sereno
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.