Secara tidak sengaja nuked struktur izin disk saya - mengapa?

23

Saya mencoba ke chowndalam /optdan untuk beberapa alasan chownmelompat ke orang tua dan membagikan semuanya.

Adakah yang bisa menyarankan mengapa / bagaimana ini bisa terjadi, dan bagaimana menghindari melakukannya di masa depan? Ini sedikit tentang menjalankan perintah dalam direktori tertentu dapat secara efektif melompat dan menjalankannya di direktori root.

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 >
Duke Dougal
sumber
2
Saya akan melakukannya seperti ini: sudo chown -R root:wwwdata /optsesuai dialog --help ... mungkin menggunakan pipa itu menyebabkan beberapa masalah ???
Joshua Besneatte
13
.*cocok ..(direktori induk, yaitu /) - lihat Apakah “chmod 777. * -R” direktori induk chmod (..)?
steeldriver
7
@steeldriver yang kedengarannya seperti itu harus diposting sebagai jawaban;)
Joshua Besneatte
2
Jadi apa cara yang benar untuk mengatur izin pada file tersembunyi, yang saya coba lakukan?
Duke Dougal
4
@ JoshuaBesneatte Saya mencoba untuk menghindari menjalankan perintah rekursif pada argumen yang dimulai dengan / karena kebanyakan keyboard meletakkan / cukup dekat dengan tombol Enter, dan terlalu mudah untuk secara tidak sengaja menekan Enter sebelum mengetikkan sisa perintah. Untuk mengurangi risiko ini, seseorang dapat cdke direktori root dan menghilangkan leaing /, atau memulai perintah dengan (, yang berarti perintah tidak akan dieksekusi sampai pencocokan )diketik, memberikan kesempatan untuk menekan Ctrl-C dan menyelamatkan dari kesalahan buruk (seperti rm -rf /tmp/foo-installdan menekan Enter, bukan T).
Monty Harder

Jawaban:

25

Ini terjadi karena Anda menggunakan:

sudo chown -R root:www-data .*

padahal seharusnya Anda menggunakan ini:

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

Pertama, -Rbersifat rekursif untuk semua direktori di bawah direktori target.

Selain itu, *akan cocok dengan semua file dan direktori di bawah direktori saat ini. Selanjutnya, .*akan mencocokkan semua file dan direktori satu tingkat di atas direktori saat ini.

Untuk menghindari ini di masa mendatang, Anda dapat menggunakan lsperintah untuk memverifikasi jalur sebelum Anda menjalankan chownperintah seperti dalam contoh berikut:

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

Cara lain untuk menghindari ini adalah dengan selalu menggunakan path lengkap ke direktori yang ingin Anda jalankan perintahnya.

Berikut ini sebuah contoh:

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

Edit:

Anda dapat menggunakan perintah berikut untuk chmodsemua file atau direktori tersembunyi langsung di bawah /opt(dengan asumsi karakter pertama setelah .yang membuat mereka disembunyikan adalah huruf, angka, tanda hubung atau garis bawah yang seharusnya benar untuk sebagian besar file).

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

Anda dapat memverifikasi file apa ini chmoddengan menjalankan perintah berikut:

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

Bagian pertama dari perintah : for i in /opt/.[A-Za-z0-9-_]*mengatakan bahwa, untuk semua hasil glob, /opt/.[A-Za-z0-9-_]* tetapkan setiap hasil ke variabel "i".

Glob di sini mengatakan bahwa karakter pertama harus .dan bahwa karakter berikutnya [A-Za-z0-9-_] harus berupa karakter apa pun yang AZ atau az atau angka 0-9 atau a -atau a _.

Ini akan mengecualikan hasil .dan ..yang mewakili direktori saat ini dan direktori di atas direktori saat ini dan hanya akan menyertakan file dan direktori tersembunyi.

Bagian kedua dari perintah : do sudo chmod root:www-data "/opt/$i"mengatakan untuk menjalankan perintah untuk semua variabel yang cocok dengan nilai saat ini $i.

Bagian ketiga dari perintah : donemengatakan bahwa saya sudah selesai.


Selain itu, Anda menggunakan -Ropsi dengan chmoddan -Ropsi bersifat rekursif dan akan berlaku untuk semua direktori dan file.

Ketika Anda hanya menggunakan chmodperintah tanpa opsi, perintah hanya akan berlaku untuk file atau direktori tertentu yang Anda berikan dan tidak akan berlaku secara rekursif ke direktori.

mchid
sumber
5
Maksud saya adalah menargetkan file yang tersembunyi. Saya keliru berasumsi bahwa sintaks yang digunakan untuk menangkap file tersembunyi seperti dijelaskan di sini stackoverflow.com/questions/10375689/… umumnya sintaksis yang valid untuk file tersembunyi. Kelihatannya tidak.
Duke Dougal
2
@DukeDougal Anda seharusnya tidak menerima jawaban pertama yang muncul segera. Biasanya lebih baik menunggu, katakanlah, 24 jam sebelum menerima. Pada waktu itu jawaban-jawaban tertulis lain yang lebih berguna atau lebih baik mungkin muncul yang pantas diterima. Anda dapat mengubah semua jawaban yang menurut Anda berguna. StackExchange bukan (atau tidak boleh) tentang "siapa yang menjawab pertama" tetapi "siapa yang memberikan jawaban terbaik" (baik dalam hal konten dan kejelasan).
Giacomo Alzetta
11
Edit itu mengerikan. Ini menyarankan untuk mengurai lsoutput dan sangat lambat sementara jawabannya adalah untuk digunakan find.
val berkata Reinstate Monica
9
(1) Tidak ada wildcard (gumpalan / pola) rekursif dalam bash kecuali untuk **, dan bahkan yang harus diaktifkan secara eksplisit. IMHO, Anda harus lebih jelas tentang peran  -R. (2) Orang-orang disarankan untuk tidak menggunakan polos *karena dapat mencocokkan nama file yang diawali dengan -, yang kemudian akan ditafsirkan sebagai opsi.  harus melindungi dari itu, tapi saya tidak yakin semua perintah menghormati konvensi itu. … (Lanjutan)command -- *
Scott
6
(Lanjutan) ... (3)  *,  ./* dan bahkan  /opt/* gagal menemukan “file dot” ( .*) kecuali jika dotglobopsi disetel. Seperti yang dikatakan  Joshua Besneatte dan  ilkkachu , chown -R /optdan chown -R .lebih baik. … (Lanjutan)
Scott
45

Sayangnya, shell glob .*cocok ..(direktori induk) dalam hal ini /:

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

Untuk diskusi tambahan, lihat:

Steeldriver
sumber
6
Ini adalah jawaban yang benar, dan jauh lebih sederhana,
abligh
5

Masalah Anda datang karena .*cocok dengan semua yang dimulai dengan titik. Konteksnya adalah direktori saat ini, karena ungkapan ini tidak termasuk jalur. Jadi, jika ada file atau folder tersembunyi seperti .gitdi direktori saat ini, Anda akan mencocokkannya. Tetapi (seperti yang akan Anda lihat dengan menjalankan ls -adi folder itu), Anda juga akan cocok .dan..

Dan .., tentu saja, adalah direktori induk, jadi chmod -Rsecara rekursif menargetkan semua yang ada di direktori induk.

alexis
sumber
Path absolut seperti /opt/.*tidak akan membantu, /opt/..sama ..dengan CWD = /opt.
Peter Cordes
@ Peter: Ya, itu benar: Jika ekspresi termasuk path, itu akan memberikan konteks (titik awal), alih-alih menjadi direktori saat ini. OP dimaksudkan untuk digunakan .sebagai konteks, tetapi itu tidak berhasil karena garis miring yang hilang ...
alexis