无意中破坏了我的磁盘权限结构-为什么?


23

我试图chown/opt出于某种原因,chown跳起来家长和chowned一切。

谁能建议为什么/如何发生以及将来如何避免?有点有关在给定目录中运行命令可以有效地跳转并在根目录中运行该命令的问题。

ubuntu: /opt > sudo chown -R root:www-data .*
chown: changing ownership of '../var/lib/lxcfs/proc/cpuinfo': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/meminfo': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/stat': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/uptime': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/diskstats': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/swaps': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/devices': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/blkio': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/hugetlb': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/rdma': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/pids': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/freezer': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/cpuset': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/memory': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/perf_event': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/cpu,cpuacct': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/net_cls,net_prio': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/name=systemd': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/unified': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs': No such file or directory
^C
:ubuntu: /opt >

2
我本来会这样:sudo chown -R root:wwwdata /opt按照--help对话框...也许使用该管道会引起一些问题???
Joshua Besneatte

13
.*匹配..(父目录为/)-请参见“ chmod 777。* -R” chmod父目录(..)吗?
steeldriver

7
@steeldriver,听起来像应该作为答案发布);)
Joshua Besneatte

2
那么,对隐藏文件设置权限的正确方法是什么呢?
杜加尔(Dougal)

4
@JoshuaBesneatte我尝试避免在以/开头的参数上运行递归命令,因为大多数键盘将/相当接近Enter键,并且在键入其余命令之前不小心按下Enter太容易了。为了减轻这种风险,您可以cd进入根目录并省略leaing /,也可以使用来启动命令(,这意味着)只有键入匹配项后命令才能执行,从而有机会按Ctrl-C并退出错误(例如,rm -rf /tmp/foo-install然后按Enter键而不是T键)。
Monty Harder

Answers:


25

发生这种情况是因为您使用了:

sudo chown -R root:www-data .*

当您应该使用它代替:

sudo chown -R root:www-data ./*

首先,-R对于目标目录下的所有目录都是递归的。

此外,*将匹配当前目录下的所有文件和目录。接下来,.*将匹配当前目录上一级的所有文件和目录。

为了避免将来发生这种情况,可以像ls执行chown以下示例一样使用命令来验证路径,然后再执行命令:

ls -a ./*
ls -a *
ls -a .*
ls -a ../*

避免这种情况的另一种方法是始终使用您要对其运行命令的目录的完整路径。

这是一个例子:

sudo chown -R root:www-data /opt/*

编辑:

您可以对下面的chmod所有隐藏文件或目录使用以下命令/opt(假设.使它们隐藏的第一个字符是字母,数字,破折号或下划线,对于大多数文件来说应该是正确的)。

for i in /opt/.[A-Za-z0-9-_]*; do sudo chmod root:www-data "/opt/$i"; done

您可以chmod通过运行以下命令来验证将要存储的文件:

ls /opt/.[A-Za-z0-9-_]*

命令的第一部分for i in /opt/.[A-Za-z0-9-_]*表示,对于glob的 所有结果,/opt/.[A-Za-z0-9-_]*将每个结果分配给变量“ i”。

这里的glob表示第一个字符必须是.,而下一个字符 [A-Za-z0-9-_]必须是AZ或az或任何数字0-9或a -或a的任何字符_

这将排除结果...它们代表当前目录和当前目录上方的目录,并且仅包括隐藏文件和目录。

命令的第二部分do sudo chmod root:www-data "/opt/$i"表示对与当前值相匹配的所有变量运行命令$i

命令的第三部分done说我完成了。


此外,您将该-R选项与chmod和一起使用,并且该-R选项是递归的,并且将应用于所有目录文件。

当您仅使用chmod不带任何选项的命令时,该命令将仅应用于您为其指定的特定文件或目录,而不会递归应用于目录。


5
我的目的是针对隐藏文件。我错误地认为,如此处stackoverflow.com/questions/10375689/…所述,用于grepping隐藏文件的语法通常是隐藏文件的有效语法。好像没有。
杜加尔(Dougal)

2
@DukeDougal您不应该立即接受第一个答案。通常最好等待24小时再接受。到那时,可能还会出现其他更有用或更优质的书面答案,值得接受。您可以对您认为有用的所有答案进行投票。StackExchange不是(也不应该是)“谁先回答”,而是“谁提供了最佳答案”(在内容和清晰度方面)。
Giacomo Alzetta

11
编辑太糟糕了。它建议解析ls输出,并且在使用答案时非常慢find
瓦尔说莫妮卡(Monica)恢复

9
(1)除了**,没有任何通配符(glob / pattern)在bash中是递归的,甚至必须显式启用。恕我直言,您应该对的角色更加清楚  -R。(2)建议人们避免使用纯文本,*因为它可以匹配以开头的文件名-,然后将其解释为选项。  应该防止这种情况,但是我不确定所有命令是否都遵循该约定。…(续)command -- *
斯科特

6
(续)…(3)  *,  除非设置了该选项,否则./* 甚至  /opt/* 找不到“点文件”(.*dotglob。正如  Joshua Besneatte和  ilkkachu所说,chown -R /opt而且chown -R .更好。…(续)
斯科特

45

不幸的是,在这种情况下,shell glob .*..(父目录)匹配/

steeldriver@t400s:/opt$ ls .*
.:

..:
bin  boot  cdrom  dev  etc  home  initrd.img  initrd.img.old  lib  lib32  lib64
libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  swapfile  sys
tmp  usr  var  vmlinuz  vmlinuz.old

有关其他讨论,请参见:


6
这是正确且简单得多的答案
大约在

5

您遇到的麻烦是因为.*匹配所有以点开头的内容。上下文是当前目录,因为此表达式不包含路径。因此,如果.git当前目录中有任何隐藏的文件或文件夹,则将它们匹配。但是(如您ls -a在该文件夹中运行所看到的),您还将匹配...

并且..,当然是父目录,因此chmod -R递归地定位父目录中的所有内容。


绝对/opt/.*无济于事的绝对路径与CWD = /opt/..相同。../opt
Peter Cordes

@Peter:是的,这是正确的:如果表达式包含路径,则将给出上下文(起点),而不是当前目录。OP打算.用作上下文,但是由于缺少斜杠而无法解决问题……
Alexis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.