符号链接中带有通配符的 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 术语中,sudo
是 execve(2)
的包装器,因此无法帮助完成您无法通过 execve
调用完成的任何事情。如果您需要目标用户的 shell 功能,您需要手动调用 shell:
user$ sudo sh -c 'chmod g+r /opt/tomcat/conf/*'
我正在根据 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 术语中,sudo
是 execve(2)
的包装器,因此无法帮助完成您无法通过 execve
调用完成的任何事情。如果您需要目标用户的 shell 功能,您需要手动调用 shell:
user$ sudo sh -c 'chmod g+r /opt/tomcat/conf/*'