Answers:
最简单的情况是二进制可执行文件(如)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
找到可执行文件的事实已经表明您具有执行许可的许可。
which
对于驻留在添加到$PATH
变量的目录之一中的那些文件,该命令应该足够。例如,执行sudo chmod 700 /bin/nano
或sudo chmod 744 nano
导致which
不产生任何输出。对于本地脚本,它们驻留在PATH
目录之一以外的其他地方,ls -l
否则stat
调用就可以解决问题。好的答案,但请将此信息添加到您的帖子中
stat -c '%a' /bin/gzip
方法755
。
与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 -l
即使您不是sudoer,也可以安全地运行-重点是-l
-告诉您是否可以使用sudo运行命令。
您可以使用:
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)
。但是,此问题仅在交互模式下出现。
好吧,有时候可能会有点困难...
首先,用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身份运行事物。
使用which
,type
,command
等是一个切实可行的解决方案,这将在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
。同样,没有手动检查,发出命令和观察结果的通用方法也无法知道。
sudo
)并找出答案。可能需要文本模式命令sudo
和图形命令gksudo
。您还可以使用来检查命令的安装位置which command
。如果在/sbin
或/usr/sbin
-中,则可以预期该命令需要sudo
或gksudo
。