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

Ber*_*lby 19 permissions command-line

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

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

类似于以下命令

-> doIhaveRightToIssue shutdown
-> Yes/No
Run Code Online (Sandbox Code Playgroud)

Jos*_*Jos 27

最简单的情况是二进制可执行文件,如gzip. 首先,我们找到可执行文件:

$ which gzip
/bin/gzip
Run Code Online (Sandbox Code Playgroud)

然后我们看一下这个文件的属性:

$ ls -l /bin/gzip
-rwxr-xr-x 1 root root 98240 oct 27  2014 /bin/gzip
Run Code Online (Sandbox Code Playgroud)

三个 x 告诉我们文件可能分别由所有者(第一个root)或组中的任何人root(第二个root)和其他任何人执行。所以你的用户被允许执行程序。

但是,您的可执行文件可能是一个脚本文件,它调用内部的其他可执行文件。您可能能够执行脚本,但不能执行其中调用的程序。除了实际尝试之外,无法确定您的用户是否被允许这样做。

然后有一些特殊情况,例如shutdown- 这实际上是一个名为 的核心实用程序的符号链接systemctl,它有自己的机制来确定您是否可以调用它,如果不可以,则要求您提供 sudo 密码,例如.

(关于which命令:这会在您的 $PATH 中定位您可以执行的可执行文件,并告诉您如果 $PATH 中有多个同名的文件,您使用哪一个。它不只定位任何可执行文件。我在这里使用它作为在哪里查找权限的示例。which找到可执行文件的事实已经表明您有权执行它。)

  • `which` 命令对于那些驻留在添加到 `$PATH` 变量的目录之一中的文件应该足够了。例如,执行 `sudo chmod 700 /bin/nano` 或 `sudo chmod 744 nano` 会导致 `which` 不产生任何输出。对于位于“PATH”目录之一以外的其他地方的本地脚本,“ls -l”或“stat”调用将起作用。很好的答案,但请将此信息添加到您的帖子中 (4认同)

mur*_*uru 22

sudo

$ sudo -l shutdown
/sbin/shutdown
Run Code Online (Sandbox Code Playgroud)

如果我没有权限,我sudo会抱怨而不是显示命令。

使用 polkit,您可以检查要运行的操作:

$ pkcheck --action-id org.freedesktop.login1.power-off --process $$ -u --enable-internal-agent && echo yes
polkit\56temporary_authorization_id=tmpauthz1
yes
Run Code Online (Sandbox Code Playgroud)

找到相关操作是一个不同的问题。

  • @BernhardColby 即使您不是 sudoer,您也可以安全地运行 `sudo -l` - 这就是 `-l` 的全部意义 - 告诉您是否可以使用 sudo 运行命令。 (4认同)

Rob*_*sak 8

您可以使用:

test -x $(command -v shutdown) && echo yes || echo no
Run Code Online (Sandbox Code Playgroud)

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

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


Baa*_*rud 5

嗯,有时可能有点困难......

首先,查看权限ls -l...

 owngrptr 用户组命令
-rwxr-xr-x root bin vim

如果最后一个/第三个三元组中有一个x(“可以执行”),那么其他人- 这意味着你 - 可以执行它......如果它是一个 shell 脚本或类似的东西,那么其他人将需要r(“也可以阅读”)。

如果其他人没有执行权限但(第二个三元组)有执行权限,那么如果您是的成员,则可以执行它- 在示例中为bin。例如,wheel -group 通常用于限制谁可以运行su,因此只有属于该组的用户才能执行它。另一个例子是为开发人员创建一个组,并将 C 编译器和此类工具的执行限制在该组中。

如果最后一个三元组后面有一个+,则意味着使用了 AccessControllLists - 这可能会向其他用户和组添加执行权限。

+++

即使您能够执行该命令,该命令也可能取决于对您无权访问的文件、目录和/或设备的访问权限 - 这可能会限制您能够执行的操作(您可能无法做任何事)。

最后,虽然您可能被允许执行命令,但该命令本身可能会检查您的身份,并拒绝让您使用它,除非您在配置文件中列出或者是某些用户(例如root)。例如,该mount命令将只允许root安装任何设备 - 普通用户只允许安装在 /etc/fstab 中列出的设备......可能没有。如果您不是root并尝试挂载某些东西,mount则会抱怨并拒绝挂载设备。另一个例子是sudo,它可以为任何人运行,但实际上只有 /etc/sudoers 中列出的用户才能以root身份运行。