符号链接中带有通配符的 chmod

chmod with wildcard inside symlink

我正在根据 https://www.digitalocean.com/community/tutorials/how-to-install-apache-tomcat-8-on-centos-7 在 Centos 上设置 Tomcat ,但有一个转折:我将 Tomcat 放在 /opt/apache-tomcat-8.5.6 中,然后设置一个符号 link:

sudo ln -s /opt/apache-tomcat-8.5.6 /opt/tomcat

现在我将 /opt/tomcat 的组所有权更改为 tomcat:

sudo chgrp -R tomcat /opt/tomcat/conf

然后我给 tomcat 组对配置目录的写入权限:

sudo chmod g+rwx /opt/tomcat/conf

但问题是:我尝试授予 tomcat 组对所有配置文件的读取权限:

sudo chmod g+r /opt/tomcat/conf/*

这给了我一个错误:chmod: cannot access ‘/opt/tomcat/conf/*’: No such file or directory

什么? chmod 不接受通配符吗?或者它不看符号 links 内部?怎么回事?

请注意,我通过这样做绕过了它:

sudo chmod g+r -R /opt/tomcat/conf

这是否有效地给我同样的东西? (我知道它还使该目录可由该组读取,但这似乎无关紧要——该组可能已经读取了该目录。)为什么通配符版本不起作用?

Glob 扩展了当前 shell。这发生在 sudo 和 chown 被调用之前。

如果当前 shell 无权列出文件,则 glob 将被视为不匹配并单独保留。这使得 chmod 尝试访问一个名为 * 的文件,但失败了。

root# echo /root/.*
/root/.bash_history /root/.bashrc ...

user$ sudo echo /root/.*
/root/.*

命令替换、进程替换等扩展也是如此,同样不受sudo影响:

root# echo $(whoami)
root

user$ sudo echo $(whoami)
user

shell 还负责管道和重定向,它们也是在 sudo 运行之前设置的:

root# echo 60 > /proc/sys/vm/swappiness
(command exits successfully)

user$ sudo echo 60 > /proc/sys/vm/swappiness
bash: /proc/sys/vm/swappiness: Permission denied

在 Unix 术语中,sudoexecve(2) 的包装器,因此无法帮助完成您无法通过 execve 调用完成的任何事情。如果您需要目标用户的 shell 功能,您需要手动调用 shell:

user$ sudo sh -c 'chmod g+r /opt/tomcat/conf/*'