nuked โครงสร้างสิทธิ์ดิสก์ของฉันโดยไม่ได้ตั้งใจ - ทำไม


23

ฉันพยายามที่จะchownอยู่ข้างใน/optและด้วยเหตุผลบางอย่างchownเพิ่มขึ้นถึงผู้ปกครองและทุกอย่างที่ร้อง

มีใครแนะนำได้บ้างว่าเหตุใดสิ่งนี้จึงเกิดขึ้นและจะหลีกเลี่ยงในอนาคตได้อย่างไร มันเกี่ยวกับการเรียกใช้คำสั่งใน dir ที่กำหนดสามารถกระโดดขึ้นและรันใน 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ตาม - โต้ตอบช่วย ... บางทีการใช้ท่อที่ทำให้เกิดปัญหาบางอย่าง ???
Joshua Besneatte

13
.*จับคู่..(ไดเรกทอรีแม่ซึ่งเป็น/) - ดูไม่“ chmod 777. * -R” ไดเรกทอรีหลัก chmod (.. )?
ขับรถเหล็ก

7
@steeldriver ว่าเสียงเหมือนมันควรจะโพสต์เป็นคำตอบ;)
โจชัว Besneatte

2
ดังนั้นวิธีที่ถูกต้องในการตั้งค่าการอนุญาตในไฟล์ที่ซ่อนคือสิ่งที่ฉันพยายามทำคืออะไร?
Duke Dougal

4
@JoshuaBesneatte ฉันพยายามหลีกเลี่ยงการเรียกใช้คำสั่งแบบเรียกซ้ำบนอาร์กิวเมนต์ที่ขึ้นต้นด้วย / เพราะคีย์บอร์ดส่วนใหญ่วางอยู่ใกล้กับปุ่ม Enter และมันง่ายเกินไปที่จะกด Enter โดยไม่ตั้งใจก่อนที่จะพิมพ์คำสั่งที่เหลือ เพื่อลดความเสี่ยงนี้คุณสามารถcdไปที่ไดเรคทอรีรากและละเว้น leaing / หรือเริ่มต้นคำสั่งด้วย(ซึ่งหมายความว่าคำสั่งจะไม่ถูกดำเนินการจนกว่า)จะมีการพิมพ์การจับคู่ให้โอกาสกด 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-_]*บอกว่าสำหรับผลลัพธ์ทั้งหมดของglob /opt/.[A-Za-z0-9-_]*กำหนดแต่ละผลลัพธ์ให้กับตัวแปร "i"

glob ที่นี่บอกว่าตัวละครตัวแรกจะต้องเป็น.และตัวละครต่อไป [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
ความตั้งใจของฉันคือการกำหนดเป้าหมายไฟล์ที่ซ่อนอยู่ ฉันเข้าใจผิดคิดว่าไวยากรณ์ที่ใช้สำหรับ grepping ไฟล์ที่ซ่อนอยู่ตามที่อธิบายไว้ที่นี่stackoverflow.com/questions/10375689/...โดยทั่วไปไวยากรณ์ที่ถูกต้องสำหรับไฟล์ที่ซ่อนอยู่ ดูเหมือนจะไม่
Duke Dougal

2
@DukeDougal คุณไม่ควรยอมรับคำตอบแรกที่เกิดขึ้นทันที โดยทั่วไปดีกว่าที่จะรอพูด 24 ชั่วโมงก่อนที่จะยอมรับ ในเวลานั้นคำตอบที่เป็นประโยชน์หรือมีคำตอบเป็นลายลักษณ์อักษรอื่น ๆ อาจเกิดขึ้นซึ่งสมควรจะได้รับ คุณสามารถโหวตคำตอบทั้งหมดที่คุณคิดว่ามีประโยชน์ได้ StackExchange ไม่ได้ (หรือไม่ควร) เกี่ยวกับ "ผู้ที่ตอบก่อน" แต่ "ผู้ที่ให้คำตอบที่ดีที่สุด" (ทั้งในแง่ของเนื้อหาและความคมชัด)
Giacomo Alzetta

11
การแก้ไขนั้นแย่มาก มันแสดงให้เห็นที่จะแยกออกและช้ามากในขณะที่คำตอบคือการใช้งานls find
val พูดว่า Reinstate Monica

9
(1) ไม่มี wildcard (glob / pattern) ซ้ำใน bash ยกเว้นสำหรับ**และแม้จะต้องเปิดใช้งานอย่างชัดเจน IMHO -Rคุณควรจะชัดเจนเกี่ยวกับบทบาทของ (2) ผู้ใช้ควรหลีกเลี่ยงการใช้ธรรมดา*เพราะมันสามารถจับคู่ชื่อไฟล์ที่ขึ้นต้นด้วย-ซึ่งจะถูกตีความเป็นตัวเลือก  ควรป้องกันสิ่งนั้น แต่ฉันไม่แน่ใจว่าคำสั่งทั้งหมดให้เกียรติการประชุมนั้น … (ต่อ)command -- *
สกอตต์

6
(ต่อ) ... (3)  *,  ./* และแม้กระทั่ง  /opt/* ไม่สามารถหาไฟล์“จุด” ( .*) เว้นแต่dotglobตัวเลือกเป็นชุด ดังที่  Joshua Besneatteและ  ilkkachuพูดchown -R /optและchown -R .ดีกว่า … (ต่อ)
สกอตต์

45

เชลล์ glob .*จับคู่..(ไดเรกทอรีหลัก) ในกรณีนี้น่าเสียดายที่/:

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 Cordes

@Peter: ใช่นั่นถูกต้อง: หากนิพจน์มีเส้นทางที่จะให้บริบท (จุดเริ่มต้น) แทนที่จะเป็นไดเรกทอรีปัจจุบัน OP หมายถึงใช้.เป็นบริบท แต่ไม่ได้ผลเช่นนั้นเนื่องจากเฉือนขาด ...
alexis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.