为什么非root用户不能使用通配符表达式?

sho*_*key 5 bash shell wildcards

我正在使用通配符表达式来匹配文件名。

这是普通的非 root 用户会发生的情况:

debian@MiWiFi-R3-srv:~$ sudo ls  /var/log/apache2/*[0-9].gz
ls: cannot access '/var/log/apache2/*[0-9].gz': No such file or directory
Run Code Online (Sandbox Code Playgroud)

这就是我切换到 root 用户sudo su并尝试相同的命令后发生的情况:

root@MiWiFi-R3-srv:/home/debian# ls  /var/log/apache2/*[0-9].gz
/var/log/apache2/access.log.10.gz  /var/log/apache2/error.log.10.gz
/var/log/apache2/access.log.11.gz  /var/log/apache2/error.log.11.gz
/var/log/apache2/access.log.12.gz  /var/log/apache2/error.log.12.gz
Run Code Online (Sandbox Code Playgroud)

为什么这个通配符表达式可以用作root,但不能用作普通的非 root 用户?

Kam*_*ski 33

/var/log/apache2/*[0-9].gz子字符串*[0-9]中由shell的路径名扩展机制处理。不是sudo也不是ls。的外壳。这发生之前sudo或者ls甚至开始。

要展开/var/log/apache2/*[0-9].gz外壳需要检查/var/log/apache2/. 在我的 Debian 10 中,权限是rwxr-x---,所有权是root:adm. 实际上,root 的 shell 可以检查内容,但普通用户的 shell 不能。

因此,该模式针对 root 进行了扩展,但对于普通用户来说,它保持原样。既不扩展sudo也不ls扩展模式,最终普通用户(高级用户)ls尝试/var/log/apache2/*[0-9].gz准确地列出有关信息;没有这样的文件或目录。

这应该适用于普通用户:

sudo sh -c 'ls /var/log/apache2/*[0-9].gz'
Run Code Online (Sandbox Code Playgroud)

在这种情况下sudo将运行提升, sh并且此 shell 将成功扩展模式。

(起初我以为sudo -s …会这样做,但没有。)

  • 理解“*[0-9].gz”虽然不常见,但在 Unix/Linux 上是一个完全合法的文件名,这有助于理解。它_可能_存在。因此,当询问 ls 是否存在该文件时,它必须检查该确切名称。 (9认同)