我如何知道我是否有权运行特定命令?

我如何知道我是否有权运行特定命令?

有没有什么办法可以识别我作为普通用户是否有权发出命令。

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

类似以下命令

-> doIhaveRightToIssue shutdown
-> Yes/No

答案1

最简单的情况是二进制可执行文件,例如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找到可执行文件这一事实已经表明您有权执行它。)

答案2

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

找到相关的行动是另一个问题。

答案3

您可以使用:

test -x $(command -v shutdown) && echo yes || echo no

command -v shutdown返回命令的路径shutdowntest -x检查该路径对您来说是否可执行。

请注意,尽管您可能能够执行该命令,但该命令仍可能会失败,因为它没有足够的权限来执行任务。这是 Unix 类型系统上的常见情况,这些系统不是限制执行命令的权限,而是限制程序实际可以执行的操作的权限。

答案4

使用whichtypecommand是一种实用的解决方案,在 99% 的情况下都有效,但要 100% 确定,您必须手动检查 中列出的每个可执行目录$PATH。许多 shell(包括bash)会在您的命令前加上 entres from$PATH并尝试反复执行这些文件,直到成功。由于which无法真正执行命令,因此它无法预测您的 shell 真正会选择哪个文件。

例如,假设我有PATH=/opt/arm/bin:/bin,两个目录都包含可执行文件,但适用于不同的体系结构。运行which dd将返回/opt/arm/bin/dd(假设我有权执行它),因为该条目排在第一位。但是,当我dd在 shell 中运行时,/bin/dd将被执行,因为/opt/arm/bin/dd将无法运行。如果二进制文件损坏、缺少库等,可能会发生同样的情况。最后,除了尝试之外,没有其他可靠的方法可以知道您是否能够执行命令。

另一个方面是您认为“拥有权限”的内容。作为用户,我确实有权限运行,rm ~/file但没有权限rm /root/file。同样,没有手动检查或发出命令并观察结果,就没有一般的方法可以知道这一点。

相关内容