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

Duk*_*gal 23 permissions chown

我试图在chown里面/opt,出于某种原因chown跳到父母身边,把所有东西都吃了。

任何人都可以建议为什么/如何发生这种情况,以及将来如何避免这样做?在给定的目录中运行命令可以有效地跳转并在根目录中运行它,这有点令人担忧。

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 >
Run Code Online (Sandbox Code Playgroud)

ste*_*ver 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
Run Code Online (Sandbox Code Playgroud)

有关其他讨论,请参阅:

  • 这是正确且简单得多的答案 (6认同)

mch*_*hid 25

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

sudo chown -R root:www-data .*
Run Code Online (Sandbox Code Playgroud)

当您应该使用它时:

sudo chown -R root:www-data ./*
Run Code Online (Sandbox Code Playgroud)

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

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

为避免将来发生这种情况,您可以ls在执行chown命令之前使用该命令来验证路径,如以下示例所示:

ls -a ./*
ls -a *
ls -a .*
ls -a ../*
Run Code Online (Sandbox Code Playgroud)

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

下面是一个例子:

sudo chown -R root:www-data /opt/*
Run Code Online (Sandbox Code Playgroud)

编辑:

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

for i in /opt/.[A-Za-z0-9-_]*; do sudo chmod root:www-data "/opt/$i"; done
Run Code Online (Sandbox Code Playgroud)

您可以chmod通过运行以下命令来验证这将使用哪些文件:

ls /opt/.[A-Za-z0-9-_]*
Run Code Online (Sandbox Code Playgroud)

命令的第一部分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选项 withchmod并且该-R选项是递归的,将应用于所有目录文件。

当您只使用chmod没有选项的命令时,该命令将仅适用于您提供的特定文件或目录,而不会递归适用于目录。

  • 编辑太可怕了。它建议解析 `ls` 输出并且非常慢,而答案是使用 `find`。 (11认同)
  • (1) 除了 `**` 外,bash 中没有通配符(glob/pattern)是递归的,甚至必须显式启用。恕我直言,你应该更清楚`-R`的作用。(2) 建议大家避免使用普通的`*`,因为它可以匹配以**`-`**开头的文件名,然后会被解释为选项。_`command `_ `-- *` 应该防止这种情况发生,但我不确定所有命令都遵守该约定。……(续) (9认同)
  • (续) … (3) `*`、`./*` 甚至 `/opt/*` 都无法找到“点文件”(`.*`),除非设置了 `dotglob` 选项。作为 [Joshua Besneatte](https://askubuntu.com/q/1160828/309110#comment1933467_1160828) 和 [ilkkachu](https://askubuntu.com/q/1160828/309110#comment1911608) 说-3R 3 /opt`` 和 ``chown -R .`` 更好。……(续) (6认同)
  • 我的意图是针对隐藏文件。我错误地认为此处描述的用于 grepping 隐藏文件的语法 /sf/ask/726298261/ 通常是隐藏文件的有效语法。似乎没有。 (5认同)
  • @DukeDougal 你不应该接受马上出现的第一个答案。通常最好等待 24 小时后再接受。在那个时候,可能会出现其他更有用或更好的书面答案,值得接受。您可以为您认为有用的所有答案点赞。StackExchange 不是(或不应该是)“谁先回答”,而是“谁提供最佳答案”(无论是在内容还是清晰度方面)。 (2认同)

ale*_*xis 5

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

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