【问题标题】:chmod with wildcard inside symlink符号链接中带有通配符的 chmod
【发布时间】:2016-10-27 16:08:25
【问题描述】:

我在 Centos 上根据 https://www.digitalocean.com/community/tutorials/how-to-install-apache-tomcat-8-on-centos-7 设置 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

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

【问题讨论】:

  • 目录里有文件吗?
  • 您运行的用户是否对该目录具有 +rx 权限? (您的用户,不是 root 或 tomcat)。这是扩展 glob 所必需的。
  • 否; sudo 不处理这个吗?
  • 没有。在 sudo 和 chmod 运行之前,shell 会扩展 Glob。
  • 疯了!!好的,这是一个我不知道的“陷阱”。你能把它放在一个实际的答案中,以便我可以在这里接受吗?

标签: wildcard symlink chmod


【解决方案1】:

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/*'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2015-08-06
    相关资源
    最近更新 更多