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

Gar*_*son 3 symlink wildcard chmod

我根据https://www.digitalocean.com/community/tutorials/how-to-install-apache-tomcat-8-on-centos-7在 Centos 上设置 Tomcat ,但有一个变化:我把然后在Tomcat中/opt/apache-tomcat-8.5.6设置符号链接:

\n\n
sudo ln -s /opt/apache-tomcat-8.5.6 /opt/tomcat\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我将 的组所有权更改/opt/tomcattomcat

\n\n
sudo chgrp -R tomcat /opt/tomcat/conf\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
sudo chmod g+rwx /opt/tomcat/conf\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
sudo chmod g+r /opt/tomcat/conf/*\n
Run Code Online (Sandbox Code Playgroud)\n\n

这给了我一个错误:chmod: cannot access \xe2\x80\x98/opt/tomcat/conf/*\xe2\x80\x99: No such file or directory

\n\n

什么?不chmod接受通配符?或者它不查看符号链接内部?这是怎么回事?

\n\n

请注意,我通过这样做解决了这个问题:

\n\n
sudo chmod g+r -R /opt/tomcat/conf\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

tha*_*guy 5

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

如果当前 shell 无权列出文件,则 glob 将被视为不匹配,并且不会发生变化。这使得chmod尝试访问一个字面名为 的文件*,但失败了。

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

user$ sudo echo /root/.*
/root/.*
Run Code Online (Sandbox Code Playgroud)

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

root# echo $(whoami)
root

user$ sudo echo $(whoami)
user
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

user$ sudo sh -c 'chmod g+r /opt/tomcat/conf/*'
Run Code Online (Sandbox Code Playgroud)