Tôi vào /sbin
và tôi thấy shutdown
có quyền rwxr-xr-x
. Điều này không có nghĩa là bất cứ ai cũng có thể thực hiện nó?
shutdown
lệnh.
shutdown
.
Tôi vào /sbin
và tôi thấy shutdown
có quyền rwxr-xr-x
. Điều này không có nghĩa là bất cứ ai cũng có thể thực hiện nó?
shutdown
lệnh.
shutdown
.
Câu trả lời:
Bất cứ ai cũng có thể thực thi shutdown
, nhưng việc kích hoạt tắt hệ thống đòi hỏi phải có quyền root. Nhưng shutdown
không phải là setuid, và vì vậy chỉ có root mới có thể thực hiện thành công nó. Các shutdown
chương trình là đủ thoải mái để kiểm tra đặc quyền của bạn và cho bạn biết nếu có một vấn đề, nhưng ngay cả khi nó ngây thơ thử một shutdown hệ thống, không có gì sẽ xảy ra.
GLENDOWER: Tôi có thể gọi các linh hồn từ sâu thẳm khó chịu.
HOTSPUR: Tại sao, tôi cũng vậy, hoặc bất kỳ người đàn ông nào cũng có thể; Nhưng họ sẽ đến khi bạn gọi cho họ chứ?
(từ Henry IV)
shutdown
là không khác /bin/rm
. Mọi người đều có thể thực thi nó, nhưng một người dùng thông thường không thể xóa /etc
hoặc thư mục chính của người dùng khác.
Cụ thể: Chỉ một quy trình chạy với quyền root (UID 0 hiệu quả) mới có thể điều khiển hệ thống init dừng dịch vụ hệ thống, chấm dứt tất cả các quy trình của người dùng và thực hiện lệnh gọi hệ thống thực sự dừng máy. (Nếu shutdown
là setuid, nó sẽ chạy như root bất kể ai gọi nó; nhưng không phải vậy.)
Còn việc gọi shutdown
từ GUI, ví dụ như với control-alt-del thì sao? Điều quan trọng là phải nhận ra rằng trong trường hợp đó, shutdown
được bắt đầu trực tiếp bởi init
và nó chạy với quyền root. Vì vậy, tất cả những người đi lên bàn điều khiển có khả năng tắt nó đi. Nếu điều này là không mong muốn, control-alt-xóa sẽ thực sự chạy shutdown -a
. (Xem tài liệu mà @ some1 trích dẫn trong câu trả lời của họ). Điều đó cho biết shutdown
để kiểm tra xem người dùng hiện đang đăng nhập có được phép chạy nó hay không. Nhưng điều này chỉ có liên quan vì shutdown
đang chạy bằng root trong kịch bản này.
shutdown
, nhưng chương trình đó thực sự không thể kích hoạt tắt hệ thống trừ khi người dùng hiện tại có quyền root. Đúng?
shutdown
. Một chương trình setuid được chạy với sự cho phép của người dùng sở hữu tệp thực thi. Ví dụ, /etc/passwd
chạy với quyền root để cho phép bạn sửa đổi tệp mật khẩu. Xem trang hướng dẫn cho chmod
.
/usr/bin/passwd
chạy với quyền root"! /etc/passwd
không thể thực thi (đó là "tập tin mật khẩu" đang được sửa đổi).
Bản shutdown
thân nhị phân kiểm tra nếu UID của bạn bằng 0.
Xem đầu ra bước của:
strace /sbin/shutdown -r -h now
...
...
geteuid() = 10001
setuid(10001) = 0
getuid() = 10001
write(2, "shutdown: Need to be root\n", 26shutdown: Need to be root
) = 26
exit_group(1) = ?
shutdown
kiểm tra UID của bạn bằng 0.
if(getuid() != 0) printf("Need to be root");
. Trong thực tế, mã nguồn cho thấy nó là.
Dường như tắt máy sẽ kiểm tra danh sách truy cập nếu bạn gắn cờ với -a:
ACCESS CONTROL
shutdown can be called from init(8) when the magic keys CTRL-ALT-DEL are pressed, by creating an appropriate entry in /etc/inittab. This means that every‐
one who has physical access to the console keyboard can shut the system down. To prevent this, shutdown can check to see if an authorized user is logged
in on one of the virtual consoles. If shutdown is called with the -a argument (add this to the invocation of shutdown in /etc/inittab), it checks to see
if the file /etc/shutdown.allow is present. It then compares the login names in that file with the list of people that are logged in on a virtual console
(from /var/run/utmp). Only if one of those authorized users or root is logged in, it will proceed. Otherwise it will write the message
shutdown: no authorized users logged in
to the (physical) system console. The format of /etc/shutdown.allow is one user name per line. Empty lines and comment lines (prefixed by a #) are
allowed. Currently there is a limit of 32 users in this file.
Vì bạn hiện đang gọi nó mà không có cờ -a, nên mặc định chỉ cho phép tắt máy gốc.
Nếu bạn muốn người dùng bổ sung có thể chạy lệnh, hãy định cấu hình tệp đó và sử dụng cờ.
Why can't I execute shutdown when the permission is rwxr-xr-x?
Các bit cho phép không nhất thiết loại trừ kiểm soát truy cập dựa trên người dùng hoặc nhóm.
-a
từ dòng lệnh sẽ không có sự khác biệt: shutdown -a
vẫn phải được thực thi với quyền root ( init
cung cấp trên control-alt-del).