chmod with symlink

时间:2016-10-27 16:08:25

标签: wildcard symlink 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中,然后设置一个符号链接:

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不接受通配符吗?或者它没有看到符号链接?发生了什么事?

请注意,我这样做是为了解决这个问题:

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

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

1 个答案:

答案 0 :(得分:3)

Globs由当前的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/*'