Случайно уничтожил мою структуру разрешений на диске - почему?

23

Я пытался 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 >
Герцог Дугал
источник
2
Я бы сделал это так: sudo chown -R root:wwwdata /optсогласно диалогу --help ... возможно, использование этой трубы вызвало какую-то проблему ???
Джошуа Беснеатте
13
.*соответствует ..(родительский каталог, который есть /) - см. «chmod 777. * -R» родительские каталоги chmod (..)?
Стальной водитель
7
@steeldriver, который звучит так, как будто он должен быть опубликован в качестве ответа;)
Джошуа Беснеатте
2
Итак, как правильно установить разрешения для скрытых файлов, что я и пытался сделать?
Герцог Дугал
4
@JoshuaBesneatte Я стараюсь избегать запуска рекурсивных команд для аргументов, начинающихся с /, потому что большинство клавиатур помещают / довольно близко к клавише Enter, и слишком легко случайно нажать Enter, прежде чем вводить остальную часть команды. Чтобы уменьшить этот риск, можно либо cdперейти в корневой каталог и пропустить команду leaing /, либо запустить команду (, что означает, что команда не будет выполнена до тех пор, пока не будет )набрано совпадение , что дает возможность нажать Ctrl-C и выручить плохой ошибки (например, rm -rf /tmp/foo-installи нажмите Enter вместо T).
Монти Хардер

Ответы:

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-_]*говорит, что для всех результатов глоба /opt/.[A-Za-z0-9-_]* присваивают каждому результату переменную «i».

Глобус здесь говорит, что первый символ должен быть .и что следующий символ [A-Za-z0-9-_] должен быть любым символом, который является AZ или az или любым числом 0-9 или a -или a _.

Это позволит исключить результаты .и ..которые представляют текущий каталог и каталог выше текущего каталога и будет включать в себя только скрытые файлы и каталоги.

Вторая часть команды : do sudo chmod root:www-data "/opt/$i"говорит, что нужно выполнить команду для всех переменных, которые соответствуют текущему значению $i.

Третья часть команды : doneговорит, что я закончил.


Кроме того, вы использовали -Rпараметр с, chmodа -Rпараметр является рекурсивным и будет применяться ко всем каталогам и файлам.

Когда вы используете только chmodкоманду без параметров, команда будет применяться только к конкретному файлу или каталогу, который вы ей дали, и не будет применяться рекурсивно к каталогам.

mchid
источник
5
Мое намерение состояло в том, чтобы предназначаться для скрытых файлов. Я ошибочно предположил, что синтаксис, используемый для поиска скрытых файлов, как описано здесь stackoverflow.com/questions/10375689/… , обычно является допустимым синтаксисом для скрытых файлов. Кажется нет.
Герцог Дугал
2
@ DukeDougal Вы не должны принимать первый ответ, который приходит сразу. Обычно лучше подождать, скажем, за 24 часа до принятия. В это время могут появиться другие более полезные или лучше написанные ответы, которые заслуживают принятия. Вы можете подтвердить все ответы, которые вы считаете полезными. StackExchange не (или не должен быть) о том, «кто отвечает первым», а «кто дает лучший ответ» (как с точки зрения содержания, так и ясности).
Джакомо Альзетта
11
Редактировать это ужасно. Он предлагает анализировать lsвывод и очень медленный, пока ответ не используется find.
Вэл говорит восстановить Монику
9
(1) Никакой подстановочный знак (glob / pattern) не является рекурсивным в bash, за исключением того **, что даже это должно быть явно включено. ИМХО, вам следует прояснить роль  -R. (2) Людям рекомендуется избегать использования обычного, *потому что оно может соответствовать именам файлов, начинающимся с -, которые затем будут интерпретироваться как опции.  должен защищать от этого, но я не уверен, что все команды соблюдают это соглашение. … (Продолжение)command -- *
Скотт
6
(Продолжение)… (3)  *,  ./* и даже  /opt/* не удается найти «точечные файлы» ( .*), если dotglobопция не установлена. Как  говорят Джошуа Беснеатте и  Илккачу , так chown -R /optи chown -R .лучше. … (Продолжение)
Скотт
45

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

Для дополнительного обсуждения смотрите:

steeldriver
источник
6
Это правильный и гораздо более простой ответ
чуть более
5

Ваши проблемы возникли, потому что .*соответствует всему, что начинается с точки. Контекст является текущим каталогом, так как это выражение не включает путь. Поэтому, если .gitв текущем каталоге есть какие-либо скрытые файлы или папки , вы их сопоставите. Но (как вы увидите, запустив ls -aэту папку), вы также сопоставите .и..

И .., конечно же, это родительский каталог, поэтому chmod -Rрекурсивно нацелены на все в родительском каталоге.

Alexis
источник
Абсолютный путь, /opt/.*который не помог бы, /opt/..такой же, как ..с CWD = /opt.
Питер Кордес
@Peter: Да, это правильно: если выражение включает в себя путь, это даст контекст (начальную точку) вместо того, чтобы быть текущим каталогом. ОП предполагалось использовать .в качестве контекста, но это не сработало из-за отсутствующего слеша ...
Алексис