Nieumyślnie nukowałem moją strukturę uprawnień do dysku - dlaczego?

23

Starałem się chownwewnątrz /optiz jakiegoś powodu chownwskoczył do rodzica i chown-owane wszystkiego.

Czy ktoś może zasugerować, dlaczego / jak to może się zdarzyć i jak tego uniknąć w przyszłości? To trochę dotyczy tego, że uruchomienie polecenia w danym katalogu może skutecznie podskoczyć i uruchomić go w katalogu głównym.

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 >
Książę Dougal
źródło
2
Zrobiłbym to w ten sposób: sudo chown -R root:wwwdata /optjak w oknie dialogowym --help ... być może użycie tej rury spowodowało jakiś problem?
Joshua Besneatte
13
.*pasuje ..(katalog macierzysty, który jest /) - zobacz Czy „chmod 777. * -R” chmod katalogi nadrzędne (..)?
steeldriver
7
@steeldriver, które brzmi jak powinno być opublikowane jako odpowiedź;)
Joshua Besneatte
2
Więc jaki jest właściwy sposób ustawiania uprawnień do ukrytych plików, co właśnie próbowałem zrobić?
Duke Dougal
4
@JoshuaBesneatte Staram się unikać uruchamiania rekurencyjnych poleceń na argumentach rozpoczynających się od /, ponieważ większość klawiatur umieszcza / dość blisko klawisza Enter, a zbyt łatwo jest przypadkowo nacisnąć Enter przed wpisaniem reszty polecenia. Aby zminimalizować to ryzyko, można albo cdprzejść do katalogu głównego i pominąć leaing /, albo uruchomić polecenie za pomocą (, co oznacza, że ​​polecenie nie zostanie wykonane, dopóki nie zostanie )wpisane dopasowanie , co daje możliwość naciśnięcia Ctrl-C i ratowania złego błędu (np. rm -rf /tmp/foo-installwciśnięcie Enter zamiast T).
Monty Harder

Odpowiedzi:

25

Stało się tak, ponieważ użyłeś:

sudo chown -R root:www-data .*

kiedy zamiast tego powinieneś użyć tego:

sudo chown -R root:www-data ./*

Po pierwsze, -Rrekurencyjne dla wszystkich katalogów w katalogu docelowym.

Dodatkowo *dopasuje wszystkie pliki i katalogi w bieżącym katalogu. Następnie .*dopasuje wszystkie pliki i katalogi jeden poziom powyżej bieżącego katalogu.

Aby tego uniknąć w przyszłości, możesz użyć lspolecenia do zweryfikowania ścieżki przed wykonaniem chownpolecenia, tak jak w poniższych przykładach:

ls -a ./*
ls -a *
ls -a .*
ls -a ../*

Innym sposobem uniknięcia tego jest zawsze użycie pełnej ścieżki do katalogu, w którym chcesz uruchomić polecenie.

Oto przykład:

sudo chown -R root:www-data /opt/*

Edytować:

Możesz użyć następującego polecenia do chmodwszystkich ukrytych plików lub katalogów bezpośrednio pod /opt(zakładając, że pierwszy znak po znaku, .który je ukrywa, to litera, liczba, myślnik lub znak podkreślenia, które powinny być prawdziwe dla większości plików).

for i in /opt/.[A-Za-z0-9-_]*; do sudo chmod root:www-data "/opt/$i"; done

Możesz sprawdzić, jakie to będzie pliki, chmoduruchamiając następujące polecenie:

ls /opt/.[A-Za-z0-9-_]*

Pierwsza część polecenia : for i in /opt/.[A-Za-z0-9-_]*mówi, że dla wszystkich wyników globu /opt/.[A-Za-z0-9-_]* przypisz każdy wynik do zmiennej „i”.

Glob mówi tutaj, że pierwszy znak musi być, .a następny znak [A-Za-z0-9-_] musi być dowolnym znakiem, który jest AZ lub az lub dowolną liczbą 0-9 lub a -lub a _.

Pozwoli to wykluczyć wyniki .i ..który reprezentuje bieżący katalog i katalog powyżej katalogu bieżącego i będzie obejmować tylko ukryte pliki i katalogi.

Druga część polecenia : do sudo chmod root:www-data "/opt/$i"mówi, aby uruchomić polecenie dla wszystkich zmiennych, które pasują do bieżącej wartości $i.

Trzecia część polecenia : donemówi, że jestem skończona.


Dodatkowo użyłeś -Ropcji z, chmoda -Ropcja jest rekurencyjna i będzie miała zastosowanie do wszystkich katalogów i plików.

Jeśli użyjesz tylko chmodpolecenia bez opcji, polecenie będzie miało zastosowanie tylko do określonego pliku lub katalogu, który mu podałeś i nie będzie miało zastosowania rekursywnego do katalogów.

mchid
źródło
5
Moim zamiarem było celowanie w ukryte pliki. Przez pomyłkę założyłem, że składnia używana do grepowania ukrytych plików, jak opisano tutaj, stackoverflow.com/questions/10375689/... jest ogólnie poprawną składnią dla ukrytych plików. Nie wydaje się.
Duke Dougal
2
@DukeDougal Nie powinieneś akceptować pierwszej odpowiedzi, która pojawia się od razu. Na ogół lepiej jest poczekać, powiedzmy, 24 godziny przed akceptacją. W tym czasie mogą pojawić się inne bardziej przydatne lub lepiej napisane odpowiedzi, które zasługują na przyjęcie. Możesz głosować za wszystkimi odpowiedziami, które uważasz za przydatne. StackExchange nie polega (lub nie powinno być) na „kto odpowiada pierwszy”, ale „kto udziela najlepszej odpowiedzi” (zarówno pod względem treści, jak i przejrzystości).
Giacomo Alzetta
11
Edycja jest okropna. Sugeruje parsowanie lsdanych wyjściowych i jest bardzo powolny, gdy używana jest odpowiedź find.
val mówi Przywróć Monikę
9
(1) Żaden symbol wieloznaczny (glob / pattern) nie jest rekurencyjny w bash, z wyjątkiem **, i nawet to musi być wyraźnie włączone. IMHO, powinieneś jaśniej określić rolę  -R. (2) Ludzie powinni unikać używania zwykłego, *ponieważ może on pasować do nazw plików rozpoczynających się od -, co zostanie następnie zinterpretowane jako opcje.  powinienem się przed tym uchronić, ale nie jestem pewien, czy wszystkie polecenia przestrzegają tej konwencji. … (Ciąg dalszy)command -- *
Scott,
6
(Ciąg dalszy)… (3)  *,  ./* a nawet  /opt/* nie można znaleźć „plików kropkowych” ( .*), chyba że dotglobustawiono opcję. Jak  mówią Joshua Besneatte i  ilkkachu , chown -R /opti chown -R .są lepsze. … (Ciąg dalszy)
Scott,
45

Skorupa glob .*mecze ..(katalogu nadrzędnego) w tym przypadku niestety to /:

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

Dodatkowa dyskusja patrz:

steeldriver
źródło
6
To jest poprawna i znacznie prostsza odpowiedź
dniu
5

Twoje kłopoty nadeszły, ponieważ .*pasują do wszystkiego , co zaczyna się od kropki. Kontekstem jest bieżący katalog, ponieważ to wyrażenie nie zawiera ścieżki. Jeśli więc są jakieś ukryte pliki lub foldery, takie jak .gitw bieżącym katalogu, dopasujesz je. Ale (jak zobaczysz, uruchamiając ls -aw tym folderze), również dopasujesz .i..

I .., oczywiście, jest katalogiem nadrzędnym, więc chmod -Rrekursywnie celował w wszystko w katalogu nadrzędnym.

Alexis
źródło
Bezwzględna ścieżka, /opt/.*która nie pomogłaby, /opt/..jest taka sama jak w ..przypadku CWD = /opt.
Peter Cordes
@Peter: Tak, to prawda: jeśli wyrażenie zawiera ścieżkę, dałoby to kontekst (punkt początkowy), zamiast być bieżącym katalogiem. OP miał służyć .jako kontekst, ale nie zadziałało w ten sposób z powodu brakującego slash ...
Alexis