权限为rwxr-xr-x时为什么不能执行关机?


34

我进去了/sbin,我看到shutdown有权限rwxr-xr-x。这是否意味着任何人都可以执行它?


1
您运行的命令是什么,得到的错误是什么?
slayedbylucifer

我认为他在谈论shutdown命令。
Vinz 2013年

我跑了./shutdown +30。我收到“关机:必须是root”的信息。但是,如果权限表明任何人都可以执行,为什么我需要成为root用户?
Korgan Rivera

我猜,任何人都可以关闭计算机。就像在GUI上一样,任何人都可以将其关闭。但是,如果您说您需要扎根,那我就不知道了。很好的问题。
Kevdog777

4
@ Kevdog777:在GUI PolicyKit上进行管理。这是一个具有root特权的守护程序,它将检查是否允许您使用shutdown
Vinz 2013年

Answers:


76

任何人都可以执行shutdown,但是触发系统关闭需要root特权。但是shutdown不是setuid,因此只有root才能成功执行它。该shutdown程序足以检查您的特权,并让您知道是否存在问题,但是即使它天真的尝试关闭系统,也不会发生任何事情。

GLENDOWER:我可以从很深的地方召唤精神。
HOTSPUR:为什么,我也可以,任何人也可以。但是当您要求他们时它们会来吗?
(摘自亨利四世)

shutdown与没什么不同/bin/rm。每个人都可以执行它,但是普通用户不能删除/etc或其他用户的主目录。

特别是:只有以root特权(有效UID 0)运行的进程才能引导初始化系统停止系统服务,终止所有用户进程,并发出实际上停止计算机的系统调用。(如果shutdown是setuid,则无论谁调用它,它都将以root身份运行;但事实并非如此。)

如何shutdown从GUI 调用,例如使用control-alt-del进行调用?重要的是要意识到,在这种情况下,它是由rootshutdown直接启动init以root特权运行的。 因此,走到控制台的每个人都有可能将其关闭。如果不希望这样做,则control-alt-delete实际上会运行shutdown -a。(请参阅@ some1在其答案中引用的文档)。这告诉shutdown检查当前登录的用户是否有权运行它。但这仅是相关的,因为shutdown在这种情况下以root用户身份运行。


2
说明:任何人都可以执行该程序shutdown,但是除非当前用户具有root特权,否则该程序实际上不会触发系统关闭。对?
LarsH 2013年

1
就是这样。程序以调用用户的特权运行,除非它们是setuid。关闭系统需要root特权,因此您也不能编写自己的程序来执行此操作(除非利用安全漏洞等)。
Alexis

“关机不是setuid”是什么意思?
伊恩·塞缪尔·麦克莱恩

1
@Iain,程序通常在调用它们的用户权限下运行。的情况也是如此shutdown。使用拥有可执行文件的用户权限运行setuid程序。例如,/etc/passwd以root权限运行,以允许您修改密码文件。参见手册chmod
Alexis

那应该是“ /usr/bin/passwd以root权限运行”!/etc/passwd不可执行(正在修改“密码文件”)。
Alexis

15

二进制文件shutdown本身会检查您的UID是否为0。

请参阅以下内容的strace输出:

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)                           = ?

4
+1用于显示strace的用法...这很有用。但是我不明白这是如何跟踪显示shutdown检查你的UID为0
LarsH

1
您不会在strace输出中看到它,因为它仅报告系统调用。您可以推断出,当紧跟在getuid之后,会写出代码类似于的错误消息if(getuid() != 0) printf("Need to be root");。实际上,源代码表明了这一点。
msw 2013年

5

是的!每个人都可以运行该命令。如您所说,您可以运行它,但遇到的是“需要成为root”消息,而不是permission denied。该shutdown命令检查您UID是否是root。


-1

如果您用-a标记关闭,则似乎shutdown将检查访问列表:

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.

由于当前正在调用时不带-a标志,因此默认情况下仅允许root用户关机。

如果希望其他用户能够运行该命令,请配置该文件并使用该标志。

Why can't I execute shutdown when the permission is rwxr-xr-x?

权限位不一定排除基于用户或组的访问控制。


从命令行调用它-a没有什么区别:shutdown -a仍然必须以root权限执行(init在control-alt-del上提供)。
Alexis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.