Я ненавмисно зіпсував структуру дозволу на диск - чому?


23

Я намагався chownвсередині /optі чомусь chownпідскочив до батька і все захлинувся.

Хтось може підказати, чому / як це може статися, і як уникнути цього в майбутньому? Це трохи стосується того, що виконання команди в заданому режимі може ефективно підскочити і запустити його в root dir.

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 (..)?
steeldriver

7
@steeldriver, що звучить так, як його слід опублікувати як відповідь;)
Джошуа Беснеатте

2
Отже, що є правильним способом встановлення дозволів на приховані файли, що я намагався зробити?
Герцог Дугал

4
@JoshuaBesneatte Я намагаюся уникати запуску рекурсивних команд на аргументах, що починаються з / тому, що більшість клавіатур кладеться / досить близько до клавіші Enter, і занадто легко випадково натиснути Enter, перш ніж набрати решту команди. Щоб пом'якшити цей ризик, можна або cdдо кореневого каталогу та опустити пропуск /, або запустити команду з (, що означає, що команда не буде виконуватися, поки не буде )введено відповідність , що дає можливість натиснути Ctrl-C і вивести помилкової помилки (наприклад, rm -rf /tmp/foo-installі натиснути Enter замість T).
Monty Harder

Відповіді:


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команду лише без параметрів, команда застосовуватиметься лише до певного файлу чи каталогу, які ви їй дали, і не застосовуватиметься рекурсивно до каталогів.


5
Моя мета полягала в націлюванні на приховані файли. Я помилково припустив , що синтаксис , який використовується для прихованих файлів змісту , як описано тут stackoverflow.com/questions/10375689 / ... , як правило , діє синтаксис для прихованих файлів. Здається, ні.
Герцог Дугал

2
@DukeDougal Ви не повинні приймати першу відповідь, яка з’являється відразу. Як правило, краще почекати, скажімо, 24 години, перш ніж приймати. В цей час можуть з’явитися інші більш корисні або краще письмові відповіді, які заслуговують на прийняття. Ви можете схвалити всі відповіді, які вважаєте корисними. StackExchange - це не (або не повинно бути) про те, хто відповідає першим, але "хто дає найкращу відповідь" (як за змістом, так і за ясністю).
Джакомо Альзетта

11
Правка жахлива. Він пропонує проаналізувати lsвихід і дуже повільний, а відповідь використовувати find.
Вал каже Відновити Моніку

9
(1) Жодна підстановка (глобул / шаблон) не є рекурсивною в баші, за винятком **, і навіть це має бути чітко включено. ІМХО, ви повинні бути чіткішими щодо ролі  -R. (2) Людям рекомендується уникати використання простого, *оскільки це може відповідати назви файлів, починаючи з цього -, що потім інтерпретується як варіанти.  повинні захищати від цього, але я не впевнений, що всі команди дотримуються цієї конвенції. … (Продовження)command -- *
Скотт

6
(Продовження)… (3)  *,  ./* і навіть  /opt/* не вдалося знайти “файли крапок” ( .*), якщо не встановлено dotglobпараметр. Як  кажуть Джошуа Беснеатте і  ількакачу , chown -R /optі chown -R .вони краще. … (Продовження)
Скотт

45

Глобальний оболонка .*відповідає ..(батьківський каталог) у цьому випадку, на жаль, це /:

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
Це правильна і набагато простіша відповідь
abligh

5

Ваші неприємності виникли тому, що .*відповідає всього, що починається крапкою. Контекст - це поточний каталог, оскільки цей вираз не включає шлях. Отже, якщо .gitв поточному каталозі є приховані файли або папки , ви їх будете відповідати. Але (як ви побачите, запустивши ls -aв цій папці), ви також будете відповідати .і..

І .., звичайно, це батьківський каталог, тому chmod -Rрекурсивно орієнтовано все на батьківський каталог.


Абсолютний шлях, який /opt/.*би не допоміг, /opt/..такий самий, як ..і для CWD = /opt.
Пітер Кордес

@Peter: Так, це правильно: Якщо вираз містив шлях, це дало б контекст (вихідну точку), а не поточний каталог. ОП мав на меті використовувати .як контекст, але це не вийшло так через відсутній косої риски ...
alexis
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.