问题描述
有什么办法可以判断我作为普通用户是否有权限发出命令。
例如;我想在实际发出关闭命令之前检查我是否有权发出它。
类似于以下命令
-> doIhaveRightToIssue shutdown
-> Yes/No
最佳思路
最简单的情况是像 gzip
这样的二进制可执行文件。首先,我们找到可执行文件:
$ which gzip
/bin/gzip
然后我们看一下这个文件的属性:
$ ls -l /bin/gzip
-rwxr-xr-x 1 root root 98240 oct 27 2014 /bin/gzip
三个 x 分别告诉我们该文件可能由所有者(第一个 root
)或组 root
中的任何人(第二个 root
)和其他任何人执行。所以你的用户被允许执行程序。
但是,您的可执行文件可能是一个脚本文件,它调用内部的其他可执行文件。您可能能够执行脚本,但不能执行其中调用的程序。除了实际尝试之外,无法确定您的用户是否被允许这样做。
然后是像 shutdown
这样的特殊情况——这实际上是一个指向名为 systemctl
的核心实用程序的符号链接,它有自己的机制来确定你是否被允许调用它,如果你不这样做,它会询问你的 sudo 密码,例如。
(关于 which
命令:这会在您的 $PATH 中找到您被允许执行的可执行文件,如果 $PATH 中有多个同名的可执行文件,它会告诉您使用哪个。它不会只定位任何可执行文件。我在这里使用它作为在哪里查找权限的示例。which
找到可执行文件的事实已经表明您有权执行它。)
次佳思路
使用 sudo
:
$ sudo -l shutdown
/sbin/shutdown
如果我没有权限,sudo
会抱怨而不是显示命令。
使用 polkit,您可以检查要运行的操作:
$ pkcheck --action-id org.freedesktop.login1.power-off --process $$ -u --enable-internal-agent && echo yes
polkit\56temporary_authorization_id=tmpauthz1
yes
找到相关的行动是一个不同的问题。
第三种思路
您可以使用:
test -x $(command -v shutdown) && echo yes || echo no
command -v shutdown
返回 shutdown
命令的路径。 test -x
检查该路径是否对您可执行。
请注意,尽管您可能能够执行该命令,但该命令仍可能会失败,因为它没有足够的权限来执行该任务。这是 Unix-type 系统上的常见情况,它不是限制执行命令的访问,而是限制对程序实际可以执行的操作的访问。
第四种思路
好吧,有时可能会有点困难…
首先,使用 ls -l 查看权限…
owngrpotr user group command
-rwxr-xr-x root bin vim
如果最后一个/第三个三元组中有一个 x (“can execute”),那么其他人 – 这意味着你 – 可以执行它……如果它是 shell-script 或类似的东西,那么其他人也需要 r (“can read”)。
如果其他人没有得到 execute-permission 但 group(第二个三元组)有,那么如果你是该组的成员,你可以执行它 – 在上面的例子中,bin。例如,wheel-group 通常用于限制谁可以运行 su
,因此只有属于该组的用户才能执行它。另一个例子是为开发人员创建一个组,并将 C-compiler 等工具的执行限制在该组中。
如果在最后一个三元组后有尾随 +,则意味着使用了 AccessControllLists – 这可能会将 execution-rights 添加到其他用户和组。
+++
即使您能够执行该命令,该命令也可能取决于您对您无权访问的文件、目录和/或设备的访问权限 – 这可能会限制您能够执行的操作(您可能无法做任何事)。
最后,虽然你可能被允许执行命令,但命令本身可能会检查你的身份,并拒绝让你使用它,除非你在 config-file 中列出或者是某些用户(例如 root)。例如,mount
命令将只允许 root 挂载任何设备 – 普通用户只允许挂载 /etc/fstab 中列出的设备…可能没有。如果您不是 root 并尝试挂载某些东西,mount
会抱怨并拒绝挂载该设备。另一个例子是 sudo
,它将为任何人运行,但实际上只允许 /etc/sudoers 中列出的用户以 root 身份运行。
第五种思路
使用 which
、 type
、 command
等是一个实用的解决方案,它适用于 99% 的情况,但要 100% 确定您必须手动检查 $PATH
中列出的每个可执行目录。许多 shell(包括 bash
)会在您的命令前加上 $PATH
中的条目,并尝试重复执行这些文件,直到成功。由于 which
无法真正执行该命令,因此它无法预测您的 shell 将真正选择哪个文件。
例如,假设我有 PATH=/opt/arm/bin:/bin
,这两个目录都包含可执行文件,但适用于不同的体系结构。运行 which dd
将返回 /opt/arm/bin/dd
(假设我有执行它的权限),因为该条目排在第一位。但是,当我在 shell 中运行 dd
时,/bin/dd
将被执行,因为 /opt/arm/bin/dd
将无法运行。同样的情况可能发生在损坏的二进制文件、丢失的库等情况下。最后,除了尝试之外,没有确定的方法知道您是否能够执行命令。
另一个方面是你考虑的”having permissions”。作为用户,我确实有权运行 rm ~/file
但没有 rm /root/file
。同样,如果不进行手动检查或发出命令并观察结果,就没有通用的方法可以知道这一点。