“which”如何在我没有读取权限的目录中找到命令?

“which”如何在我没有读取权限的目录中找到命令?

在我的工作电脑上,我注意到 which 命令似乎能够在我没有读取权限的目录中找到可执行文件。

$ export PATH=/usr/sbin:$PATH

$ ls /usr/sbin
ls: cannot open directory '/usr/sbin': Permission denied

$ which logrotate
/usr/sbin/logrotate

这是如何运作的?天真地,我会通过检查是否logrotate是为变量中的任何目录列出的文件之一来实现$PATH,这会失败。

答案1

它可以工作,因为which命令只需要检查它是否/usr/sbin/logrotate存在以及用户是否有执行权限。

虽然缺乏读取权限 ( chmod -r /usr/sbin)/usr/sbin会阻止列出目录,从而阻止制表符完成或通配符扩展,但检查特定名称是否存在仅需要执行位 ( chmod +x /usr/sbin),该执行位允许在给定已知名称的情况下访问文件元数据。

另一方面,禁用目录的执行权限将导致命令变得无法找到which且无法执行,尽管用户对该文件具有执行权限。我们只是无法再访问它了。

$ sudo chmod -x /usr/sbin/
$ which logrotate # finds nothing
$ logrotate

Command 'logrotate' not found, but can be installed with:

sudo apt install logrotate

https://unix.stackexchange.com/a/62476/120312进行更多讨论。

相关内容