通配符中一个星号两个星号和globstar的关系(by quqi99)

来源:互联网 发布:淘宝店铺引进流量 编辑:程序博客网 时间:2024/06/16 01:30

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 (http://blog.csdn.net/quqi99)

问题

今天在处理一个AppArmor的问题时,遇到一个奇怪的问题,在/etc/apparmor.d/usr.bin.nova-compute文件中明明已经有了下面对/tmp及/var/tmp目录的配置。

  /tmp/* rw,  /tmp/*/ rw,  /tmp/** rw,  /var/tmp/* rw,

但是在运行”sudo /etc/init.d/apparmor reload && sudo service nova-compute restart“命令后仍然在syslog里能看到下列错误信息。奇了怪了,这是怎么一回事呢?

Nov 15 12:49:36 juju-864213-xenial-mitaka-ceph-11 kernel: [705198.766810] audit: type=1400 audit(1510750176.727:10140): apparmor="DENIED" operation="open" profile="/usr/bin/nova-compute" name="/tmp/" pid=16922 comm="nova-compute" requested_mask="r" denied_mask="r" fsuid=113 ouid=0Nov 15 12:49:36 juju-864213-xenial-mitaka-ceph-11 kernel: [705198.766828] audit: type=1400 audit(1510750176.727:10141): apparmor="DENIED" operation="open" profile="/usr/bin/nova-compute" name="/var/tmp/" pid=16922 comm="nova-compute" requested_mask="r" denied_mask="r" fsuid=113 ouid=0

globstar模式下的通配符

通配符有一个星号,两个星号,还有逗号,globstar模式可以开启,还可以关闭。这些混在一起会有什么影响呢?
如果想要很方便地遍历所有的目录和文件得用两个星号的通配符。globstar是Bash 4.0才引入的选项,当设置启用globstar(shopt -s globstar)时,两个星号意为对通配符进行展开就可以匹配任何当前目录(包括子目录)以及其的文件;若不启用globstar(shopt -u globstar),两个星号通配符的作用和一个星号通配符是相同的。

  • ~/tmp/* - 匹配当前目录的文件,及当前目录的下一级目录(不包括当前目录),与’ls ~/tmp’及”ls ~/tmp/”的效果同。
  • ~/tmp/*/ - 匹配当前目录的下一级目录(不包括当前目录)
  • ~/tmp/* - 禁用globstar时,与~/tmp/完全一样(不包括当前目录);但启用globstar时,不止取一级,递归取所有级的文件和目录(也包括当前目录)
  • ~/tmp/*/ - 禁用globstar时,与~/tmp// 完全一样(不包括当前目录);但启用globstar时,不止取一级,递归取所有级的目录(也包括当前目录)

当启用globstar时,英语的解释如下(注:里面说的file包括文件和目录,在Linux里目录是特殊的文件):

Substitutes for any number of characters, except /./tmp/* matches any file in /tmp. /tmp/*/ matches any directory in /tmpSubstitutes for any number of characters, including /./tmp/** matches all files and directories underneath /tmp./tmp/**/ matches all directories underneath /tmp.

请看实验数据:

hua@t440p:~/tmp$ tree ..├── l0_dir1│   ├── l1_dir│   │   ├── l2_dir│   │   │   └── l3_file│   │   └── l2_file│   └── l1_file├── l0_dir2└── l0_file4 directories, 4 fileshua@t440p:~/tmp$ shopt -s globstarhua@t440p:~/tmp$ ls ~/tmp/*/home/hua/tmp/l0_file/home/hua/tmp/l0_dir1:l1_dir  l1_file/home/hua/tmp/l0_dir2:hua@t440p:~/tmp$ ls ~/tmp/*//home/hua/tmp/l0_dir1/:l1_dir  l1_file/home/hua/tmp/l0_dir2/:hua@t440p:~/tmp$ ls ~/tmp/**/home/hua/tmp/l0_dir1/l1_dir/l2_dir/l3_file  /home/hua/tmp/l0_dir1/l1_file/home/hua/tmp/l0_dir1/l1_dir/l2_file         /home/hua/tmp/l0_file/home/hua/tmp/:l0_dir1  l0_dir2  l0_file/home/hua/tmp/l0_dir1:l1_dir  l1_file/home/hua/tmp/l0_dir1/l1_dir:l2_dir  l2_file/home/hua/tmp/l0_dir1/l1_dir/l2_dir:l3_file/home/hua/tmp/l0_dir2:hua@t440p:~/tmp$ ls ~/tmp/**//home/hua/tmp/:l0_dir1  l0_dir2  l0_file/home/hua/tmp/l0_dir1/:l1_dir  l1_file/home/hua/tmp/l0_dir1/l1_dir/:l2_dir  l2_file/home/hua/tmp/l0_dir1/l1_dir/l2_dir/:l3_file/home/hua/tmp/l0_dir2/:hua@t440p:~/tmp$ ls ~/tmp/{,**}/home/hua/tmp/l0_file/home/hua/tmp/:l0_dir1  l0_dir2  l0_file/home/hua/tmp/l0_dir1:l1_dir  l1_file/home/hua/tmp/l0_dir2:hua@t440p:~/tmp$ shopt -u globstarhua@t440p:~/tmp$ ls ~/tmp/*/home/hua/tmp/l0_file/home/hua/tmp/l0_dir1:l1_dir  l1_file/home/hua/tmp/l0_dir2:hua@t440p:~/tmp$ ls ~/tmp/*//home/hua/tmp/l0_dir1/:l1_dir  l1_file/home/hua/tmp/l0_dir2/:hua@t440p:~/tmp$ ls ~/tmp/**/home/hua/tmp/l0_file/home/hua/tmp/l0_dir1:l1_dir  l1_file/home/hua/tmp/l0_dir2:hua@t440p:~/tmp$ ls ~/tmp/**//home/hua/tmp/l0_dir1/:l1_dir  l1_file/home/hua/tmp/l0_dir2/:hua@t440p:~/tmp$ ls ~/tmp/{,**}/home/hua/tmp/l0_file/home/hua/tmp/:l0_dir1  l0_dir2  l0_file/home/hua/tmp/l0_dir1:l1_dir  l1_file/home/hua/tmp/l0_dir2:

问题的解决

学习了上面的理论之后,是不是想到了问题所在了,那就是下列两个配置没有包括当前目录:

  /tmp/** rw,  /var/tmp/* rw,

所以它应该修改为:

/tmp/{,**} rw,/var/tmp/{,**} rw,
原创粉丝点击