Я пытался 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 >
Это произошло, потому что Вы использовали:
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
команда без опций, команда будет только относиться к определенному файлу или каталогу, который Вы дали ей и не примените рекурсивно к каталогам.
Шарик оболочки .*
соответствия ..
(родительский каталог) в этом случае, к сожалению, это /
:
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
Поскольку дополнительное обсуждение видит:
Ваши проблемы прибыли потому что .*
соответствия все, что начинается с точки. Контекст является текущим каталогом, так как это выражение не включает путь. Так, если существуют какие-либо скрытые файлы или папки как .git
в текущем каталоге Вы будете соответствовать им. Но (как Вы будете видеть путем выполнения ls -a
в той папке), Вы будете также соответствовать .
и ..
И ..
, конечно, родительский каталог, таким образом, chmod -R
рекурсивно предназначенный все в родительском каталоге.