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


18

有什么方法可以确定我作为普通用户是否有权发出命令。

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

类似于以下命令

-> doIhaveRightToIssue shutdown
-> Yes/No

4
简单的方法是尝试(不使用sudo)并找出答案。可能需要文本模式命令sudo和图形命令gksudo。您还可以使用来检查命令的安装位置which command。如果在/sbin/usr/sbin-中,则可以预期该命令需要sudogksudo
sudodus

Answers:


26

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


非常简洁的答案(+1)。例如,可以使用-s标志模拟apt-get install的结果(sudo apt-get install -s htop)。我曾想过,如果没有办法在发出一个问题之前先学习命令的许可,至少会有类似“模拟”之类的东西。
Bernhard Colby

当然,有些实用程序提供了可以使用的“试运行”或“模拟”标志。
乔斯(Jos)

4
which对于驻留在添加到$PATH变量的目录之一中的那些文件,该命令应该足够。例如,执行sudo chmod 700 /bin/nanosudo chmod 744 nano导致which不产生任何输出。对于本地脚本,它们驻留在PATH目录之一以外的其他地方,ls -l否则stat调用就可以解决问题。好的答案,但请将此信息添加到您的帖子中
Sergiy Kolodyazhnyy

拒绝Serg所说的,例如使用类似的stat -c '%a' /bin/gzip方法755
AT

21

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

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


sudo的问题是我不是系统中的sudoer。因此,在发出命令之前,我会尽量小心。
伯恩哈德·科尔比

4
@BernhardColby sudo -l即使您不是sudoer,也可以安全地运行-重点是-l-告诉您是否可以使用sudo运行命令。
muru

谢谢(+1),我不知道。有了我的电脑,我会尽快尝试您的解决方案。
伯恩哈德·科尔比

8

您可以使用:

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

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

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


那例如alias shutdown="shutdown now"呢?
德米特里·格里戈里耶夫

为避免别名出现问题,可以使用$(which shutdown)$(shopt -u expand_aliases && command -v shutdown)。但是,此问题仅在交互模式下出现。
David Foerster,2017年

5

好吧,有时候可能会有点困难...

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

 owngrpotr用户组命令
-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身份运行事物。


3

使用whichtypecommand等是一个切实可行的解决方案,这将在99%的情况的工作,但要100%肯定,你必须手动检查您列出的所有可执行文件的目录$PATH。许多shell(包括bash)会在命令中添加entes前缀,$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。同样,没有手动检查,发出命令和观察结果的通用方法也无法知道。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.