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

Я пытался 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 >
23
задан 27 July 2019 в 01:49

3 ответа

Это произошло, потому что Вы использовали:

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-_] должен быть любой символ, который является A-Z или a-z или любым номером 0-9 или a - или a _.

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

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

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


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

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

25
ответ дан 23 November 2019 в 01:22

Шарик оболочки .* соответствия .. (родительский каталог) в этом случае, к сожалению, это /:

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

Поскольку дополнительное обсуждение видит:

45
ответ дан 23 November 2019 в 01:22

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

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

5
ответ дан 23 November 2019 в 01:22

Другие вопросы по тегам:

Похожие вопросы: