有没有什么办法可以识别我作为普通用户是否有权发出命令。
例如,我想检查我是否有权发布关闭在我实际发出命令之前。
类似以下命令
-> 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
返回命令的路径shutdown
。test -x
检查该路径对您来说是否可执行。
请注意,尽管您可能能够执行该命令,但该命令仍可能会失败,因为它没有足够的权限来执行任务。这是 Unix 类型系统上的常见情况,这些系统不是限制执行命令的权限,而是限制程序实际可以执行的操作的权限。
答案4
使用which
、type
等command
是一种实用的解决方案,在 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
。同样,没有手动检查或发出命令并观察结果,就没有一般的方法可以知道这一点。