在我的工作电脑上,我注意到 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