当前位置: 首页>>技术教程>>正文


如何判断我是否有权运行特定命令?

,

问题描述

有什么办法可以判断我作为普通用户是否有权限发出命令。

例如;我想在实际发出关闭命令之前检查我是否有权发出它。

类似于以下命令

-> 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 身份运行。

第五种思路

使用 whichtypecommand 等是一个实用的解决方案,它适用于 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 。同样,如果不进行手动检查或发出命令并观察结果,就没有通用的方法可以知道这一点。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13235.html,未经允许,请勿转载。