Tüm dosya sistemini silmek neden mümkündür?


24

Dosya sistemimin tamamını silme, aldığım sudo rm -rf /*korkunç zarardan kurtulma ve ömrümden 6 yıl önce kaybettim gerçeğiyle başa çıkma konusundaki haksız hatayı yaptıktan sonra neden bunu yapmanın bile mümkün olduğunu merak etmeye başladım. bu hatanın ortaya çıkmaması için ne yapılabilir.

Bana önerilen bir çözüm, hesabımdan kök erişimini iptal etmek, ancak bu elverişsiz, çünkü birçok komut kök erişimi gerektiriyor ve her gün birkaç düzine komut çalıştırmanız gerektiğinde sinir bozucu oluyor.

Sisteminizi yedeklemek, açık bir yoldur. Ancak, bir yedeklemeyi geri yüklemek de bir miktar kesinti gerektirir ve sisteminize bağlı olarak, bu kesinti zamanının günler veya haftalar olabileceğini ve bazı durumlarda kabul edilemeyebileceğini gösterir.

Sorum şu: Kullanıcı kendi dosya sistemini silmeye çalıştığında neden onay uygulamıyorsunuz? Böylece, gerçekten bunu yapmak istediğinizde, sadece Y'ye vurur ya da girersiniz ve en azından yapmazsanız her şeyi kaybedersiniz.



20
“Bunu yapmak neden mümkün?” Neden mümkün olmasın ? Bir dizin hiyerarşisinin içeriğini silmek için mükemmel sebepler var ve bunların silinmesi /neredeyse kötü olabilecek pek çok altkümesi var ( /etc/örneğin). rmHangi dizinlerin kolayca silinebileceğine veya kolayca silinemeyeceğine karar vermek işi değildir.
chepner

2
Başlık, "Sistemi silmek neden mümkün olabilir?" Yazıyor. "Ben sorum şu: Kullanıcı dosya sistemlerini silmeye çalıştığında neden onay vermiyorsunuz?" Böylece bu soru belirsiz hale getirir. Asıl sorunuz hangisi? Bu yüzden en azından ne cevaplayacağımızı biliyoruz? Lütfen açıklığa kavuşturmak için mesajınızı düzenleyin
Sergiy Kolodyazhnyy

3
Burada asıl soru ne? Üç tane görebiliyorum: (1) Neden mümkün? (2) Bunu nasıl önleyebilirim? Ve (3) Neden bir onaylamadı? - Aynı soru değil, ilk akıl yürütme, ikinci araç için. (Üçüncüsü
ikinciyle

10
Sorunun yazarından açıklama istemiyorsanız , lütfen yorum yapmayın . Burada, bayrakların ne anlama geldiğini bilmek veya bir yedekleme ya da her neye sahip olmamak için OP'nin nasıl bir hata olduğunu açıklayan çok sayıda kendi kendini tebrik eden yorumlar görüyorum. Kullanıcılarımızın çoğunun, yedekleme yapacak ve anlamadıkları komutları çalıştırmaya yetecek kadar akıllı olduklarını bilmek beni çok mutlu ediyor. Bu onlar için kesinlikle harika, fakat muhtemelen bu dersi şimdi de öğrenmiş olan OP için temelde yararsızdır. Öyleyse kendi parlaklığımızla konuşmayı bırakalım ve soruya cevap verelim.
terdon

Yanıtlar:


16

rmDüşük seviye sistem aracıdır. Bu araçlar, herhangi bir sistemde bulunması gerektiği kadar basit üretilir. rmÖzellikle onay istemleriyle ilgili olarak, komut dosyalarında kullanılabilecek iyi bilinen davranışa sahip olması beklenir.

Sormak için özel bir durum eklemek rm /*, rm komutu bu biçimde göremediğinden mümkün olmaz. *Joker geçirilmeden önce kabuk tarafından genişletilir rmözel bir durum ihtiyacı fiili komuta gibi bir şey olurdu bu yüzden, rm /bin /boot /dev /etc /home /initrd.img /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var /vmlinuz. Bu durumu kontrol etmek için kod eklemek (muhtemelen farklı linux'larda muhtemelen farklı olacaktır), karmaşık hataların yanı sıra ince hatalara eğilimli olacaktır. Standart linux , seçenek olmadan rmkaldırmayı reddederek sistemin bozulmasına karşı varsayılan korumaya sahiptir ./--no-preserve-root

Varsayılan olarak, sisteminizi bu şekilde silmeye karşı üç koruma vardır:

  1. İzinler - normal kullanıcılar önemli dosyaları kaldıramaz. Bunu sudo ile atladın
  2. Dizinler - varsayılan olarak rm dizinleri kaldırmaz. Bunu -r bayrağıyla atladınız
  3. Korumalı dosyaları yazma - varsayılan olarak, rm, yazmaya karşı korumalı bir dosyayı silmeden önce onay ister (bu, tüm zararı durdurmaz, ancak sistem kurtarılamaz hale gelmeden önce bir bilgi istemi sağlamış olabilir). Bu korumayı -f bayrağıyla atladınız

Yerine çalışan yerine, bir klasörün tüm içeriğini kaldırmak için rm /path/to/folder/*yok, rm -rf /path/to/folderdaha sonra mkdir /path/to/folderbu tetikleyecek --preserve-rootkorumayı hem de klasöründe herhangi bir dotfiles çıkarmadan


3
"rm iyi bilinen bir davranışa sahip olması bekleniyor" ve aslında POSIX standardında belirtilen araçlardan biri. "o * joker karakter rm'ye geçirilmeden önce kabuk tarafından genişletilir" Tam olarak, bu nedenle gerçek dizinlere ve dosyalara bağlanan her tür parametre için kontroller eklemek /çok fazla kombinasyon ve dikkate alınabilir , bu yüzden pratik değil. Ve standartlar fikrine geri
dönersek

Tam olarak bu nedenle safe-rmbir sarıcı var rm: Bu yolla her argümanı (tüm rastgele komut satırı yerine) kontrol edebilir, yapılandırılabilir kara listede olmadığını doğrulayabilir ve ancak daha sonra rmdoğrulanmış argümanlarla arayabilir . Bu ne çok karmaşık ne de hatalara açık.
tatlı

59

safe-rmSafe-rm yükleyinrmYanlışlıkla silmeyi önlemek için komutun etrafındaki sarmalayıcı” ile tanışın

safe-rm rm, verilen argümanları, hiçbir zaman kaldırılmaması gereken, yapılandırılabilir bir kara listeye ve dizinlere karşı kontrol eden bir sargı ile değiştirerek, önemli dosyaların yanlışlıkla silinmesini önler .

Bu korunan dosyalardan veya dizinlerden birini silmeye çalışan kullanıcılar bunu yapamaz ve bunun yerine bir uyarı mesajı görüntülenir. ( man safe-rm)

Yukarıdaki yükleme bağlantısı sizin için işe yaramazsa, sudo apt install safe-rmyerine kullanın. Varsayılan yapılandırma sistem dizinlerini zaten içeriyor, rm /*örneğin deneyelim :

$ rm /*
safe-rm: skipping /bin
safe-rm: skipping /boot
safe-rm: skipping /dev
safe-rm: skipping /etc
safe-rm: skipping /home
safe-rm: skipping /lib
safe-rm: skipping /proc
safe-rm: skipping /root
safe-rm: skipping /sbin
safe-rm: skipping /sys
safe-rm: skipping /usr
safe-rm: skipping /var
…

Gördüğünüz gibi, bu /homekişisel dosyalarınızın saklandığını sandığım yerde silmenizi önler . Ancak, ~doğrudan silmeyi denerseniz , silmenizi veya alt dizinlerinden herhangi birini silmenizi engellemez . Eklemek için ~/precious_photossadece karar tildeli mutlak yolunu eklemek dizini safe-rmbireyin yapılandırma dosyası /etc/safe-rm.conf, mesela:

echo /home/dessert/precious_photos | sudo tee -a /etc/safe-rm.conf

Çalıştırdığınız durumlarda rmolmadan sudo1 ve -fbayrak o kadar iyi bir fikir bir eklemealias kabuğundan o markaları için rm'ın -ibayrağı varsayılan. Bu şekilde rmsilmeden önce her dosya için sorar:

alias rm='rm -i'

Benzer şekilde yararlı bir bayrak -I, sadece “üç dosyadan daha fazla dosyayı çıkarmadan önce veya yinelemeli olarak çıkarırken” yalnızca “ -içoğu hataya karşı koruma sağlarken ,“ daha az müdahaleci ”olduğu konusunda uyardığı için :

alias rm='rm -I'

Bu takma adların genel tehlikesi, sizi kurtarmak için onlara güvenme alışkanlığından kolayca kurtulabilmenizdir; bu, farklı bir ortam kullanırken kötü bir şekilde geri tepebilir.


1: sudoyoksaydıklarınız adlar , tek tanımlayarak bu çalışabilirsiniz alias sudo='sudo 'olsa


25

Onay zaten orada, sorun -fkomutta, yani --force; Kullanıcı bir işlemi zorladığında ne yaptıklarını bildikleri varsayılır (açıkçası bir hata her zaman eklenebilir).

Bir örnek:

 rm -r ./*
 rm: remove write-protected regular file './mozilla_mvaschetto0/WEBMASTER-04.DOC'? N
 rm: cannot remove './mozilla_mvaschetto0': Directory not empty
 rm: descend into write-protected directory './pulse-PKdhtXMmr18n'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-bolt.service-rZWMCb'? n
 rm: descend into write-protected directory './systemd-private-     890f5b31987b4910a579d1c49930a591-colord.service-4ZBnUf'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-fwupd.service-vAxdbk'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-minissdpd.service-9G8GrR'? 
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-ModemManager.service-s43zUX'? nn
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-rtkit-daemon.service-cfMePv'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-systemd-timesyncd.service-oXT4pr'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-upower.service-L0k9rT'? n

--forceSeçeneği farklı : Herhangi bir onay alamayacağım ve dosyalar silinir.

Sorun, komutu ve parametrelerini bilmektir, manörnekler için bir komutun içinde daha fazla gezinin (ayrıca komut bir öğreticide bulunursa): Komutu ilk gördüğümde tar xzf some.tar.gzkendime soruyorum "ne xzfdemek oluyor?" "

Sonra katran man sayfasını okudum ve keşfettim.


Bunun burada alakalı olduğunu sanmıyorum. Rm'nin ilk önce bir yazmaya karşı korumalı veya herhangi bir dosyayı istediği noktada, bir sürü önemli dosyayı silmiş olabilir.
Jonas Schäfer

1
Kişisel olarak, -fklasörleri silmek için her zaman gerekli olduğunu düşündüm . Onaylama ve şikayet etme talimatı bile açtım ancak -rbunun gerekli olduğunu öğrendim . Herhalde rm -rfbir senaryo sık sık görmek böylece (komut dosyası var olmayan şeyleri silmek için çalışıyoruz sırf başarısız istemiyorum) kadar yararlıdır çünkü norm haline gelmiştir, ama biz gerek varsayalım rm -rBir kabuğun içindeyken sadece “varsayılan” olarak kullanma konusunda uyanık olmak (anlaşılır bir şekilde, özellikle sudo ile anlamadığınız “varsayılan” varsayımlar olmamalıdır, ancak insanlar insan olacak ve en azından bu daha güvenli olacaktır).
Kaptan Adam

2
Rmdir, bir klasörü silmek için en güvenli yoldur
AtomiX84

rmVarsayılan olarak onay istemez, yalnızca yazmaya karşı korumalı dizinleri ve dosyaları sorar. Bu komutu makinenizde çalıştırdıysanız, muhtemelen kendi dosyalarınızın çoğunu sildiniz. Eğer gerekirse rmonay istemesini, sen geçmesi gerekiyor -iparametreyi. Örneğin:rm -ir ./*
Dan,

8

Yedekleme olmadan çalışmak, hiçbir zaman hata yapmamak için çok dikkatli olmanız gerektiği anlamına gelir. Ve umarım donanımınız asla başarısız olmaz. (RAID bile sizi hatalı RAM'in neden olduğu dosya sistemi bozulmalarından kurtaramaz.) İlk sorun budur. (Zaten farkına vardığınızı ve gelecekte yedekleme yapacağınızı varsayıyorum.)


Ancak bu gibi hataların olasılığını azaltmak için yapabileceğiniz şeyler var:

  • rm='rm -I'3'ten fazla şey siliyorsa sorulan takma ad .
  • takma mv ve cp mv -ive cp -i(bunlar için birçok Normal kullanımın söz yok bir hedef dosyanın üzerine dahil).
  • takma sudo='sudo 'ad ilk bağımsız değişkeni için takma ad genişletme yapmaksudo

Ben rm -Içok daha kullanışlı buluyorum rm -i. Normal kullanım sırasında genellikle sormaz, bu yüzden çok daha dikkat çekici / daha iyi bir uyarı olduğunu beklemiyorsanız, tetting istemi sordu. İle -i(keşfettiğim önce -I), ben yazarak alıştım \rmdevre dışı takma genişleme, emin olduktan sonra eğer doğru yazılı komutla ederim.

Seni kurtarmak için ona güvenme rm -iveya -Itakma ad alma alışkanlığına kapılmak istemezsin . Asla kullanılmayacağını umduğun güvenlik hattın. Aslında hangi silinecek eşleşmeleri etkileşimli olarak seçmek istersem veya globumun bazı ek dosyalarla eşleşip eşleşmediğinden emin değilim, el ile yazarım rm -i .../*whatever*. (Ayrıca, takma adınız olmayan bir ortamda bulunmanız durumunda iyi bir alışkanlık).

Önce Enteryazarakls -d /*foo* , sonra yukarı ok tuşlarına basarak yağ parmaklarına karşı savun ve rm -ryazmayı bitirdikten sonra bunu değiştir . Dolayısıyla komut satırı hiçbir zaman hiçbir yerde rm -rf ~/veya benzeri tehlikeli komutlar içermez . Yalnızca değiştirerek "kol" lsiçin rmsatırın başlangıcına gitmek için kontrol-a, alt-d ile ve ekleme -rveya -fyazmayı tamamlamadan sonra ~/some/sub/dir/komuta bölümünü.

Neyi sildiğinize bağlı olarak, aslında ls -dilkini çalıştırın veya sekme tamamlama ile gördüğünüze hiçbir şey eklemeyecek olsanız bile uygulamayın. rm( -rVeya olmadan -rf) ile başlayabilirsiniz, bu yüzden sadece control-a / control-right (veya alt + f) / space / -r.

(Hızlıca dolaşmak için, kontrol okları veya alt + f / b gibi kelimelerle dolaşmak ve alt + backspace veya alt + d veya control-w ile tüm kelimeleri öldürmek için bash / readline'ın güçlü düzenleme tuşlarına alışın -u çizginin başlangıcına kadar öldürmek için ve kontrol- / çok fazla bir adım atarsanız düzenlemeyi geri almak ve tabii ki kontrol-r / control-s ile arama yapabileceğiniz yukarı ok geçmişi.)

Salt okunur dosyaları kaldırma hakkındaki istemleri susturmanıza gerek-rf olmadıkça kaçının .

sudoKomuta geri dönmeden önce düşünmek için fazladan zaman ayırın . Özellikle tam yedeklemeniz yoksa veya şimdi onlardan geri yükleme yapmak için kötü bir zaman olurdu.


6

Kısa cevap, böyle bir komutu çalıştırmamaktır.

Uzun hikaye, özelleştirmenin bir parçası olmasıdır. Esasen burada oyunda iki faktör var. Birincisi, tüm dosyaları değiştirmekte özgürsünüz.

İkincisi, rm komutunun bir klasör altındaki tüm dosyaları silmek için yararlı sözdizimsel şeker sunmasıdır.

Etkili bir şekilde bu, Unix makinelerinin basit bir öğretisi olarak yeniden ifade edilebilir. Her şey bir dosyadır . Sorunları daha iyi hale getirmek için erişim kontrolleri vardır, ancak bunlar kullanımınız tarafından geçersiz kılınır.

sudo

Sanırım bunun asla çalıştırılmamasını sağlamak için bir takma ad veya işlev ekleyebilirsiniz.


4

Sistem dosyanızdaki alan kullanımı çok büyük değilse (ve bu günlerde 'çok büyük', 'yüzlerce gigabayt veya daha fazla' anlamına gelir), bazı sanal makine örnekleri oluşturun ve her zaman birinin içinde çalışın. Kurtarma işlemi yalnızca bir yedekleme örneği kullanılmasını gerektirir.

Veya chroot hapishane oluşturabilir ve içinde çalışabilirsiniz. Eğer çöpe atılırsa, hala biraz iyileşmeye ihtiyacınız olacak, fakat çalışan bir sistemle çalışmak daha kolay olacaktır.


Bu muhtemelen en etkili cevap, çünkü herhangi bir hasara karşı, hatta üçüncü taraf senaryolarına karşı koruma sağlayabiliyor. Sadece gerçek kötü amaçlı yazılımlar için endişelenmen gerekiyor.
PyRulez

Başka bir açıdan düşündüm. Neden her şeyden önce özyinelemeli silme işlemleri yapmanız gerektiğini sormaya değer. Belki de gerçekten ihtiyaç duyulan şey bir projeyi kaldırmak için bazı senaryolardır, vs.
Loren Rosen

“Neden en başta özyinelemeli silme işlemleri yapmanız gerektiğini sormaya değer.” Eh, sadece yerleşik bir emir olmadığından, hala hata yapamayacağın anlamına gelmez. Üçüncü taraf komut dosyaları, dosyaları bir dizinden birer birer silebilir. Ve sadece bir dosyaya dokunan sistemi etkilemenin başka yolları da var. Ancak, en azından, yardımcıları rmile değiştirilmesi safe-rm.
PyRulez

Senaryo hakkındaki fikrim, yerleşik bir 'proje' veya benzeri kavramına sahip olmasıydı. Belki de proje kökünde boş bir dosya denir .project_rootya da dosya sistemi destekliyorsa dizinin kendisinde bir öznitelik vardır. Ardından, komut dosyası proje kökünü arayan dosya ağacına gider ve mevcut dizinin bir projede bulunmadığından şikayet eder. Veya, eğer projelerin hepsi aynı yerde yaşıyorsa, senaryo bir projeyi isimlendirmenizi gerektirebilir. Yine de yanlış projeyi silebilir, ancak tüm sistemi tahrip edemezsiniz.
Loren Rosen

... ayrıca, bir çeşit chrootDocker gibi bir şey kullanmak olacaktır (ki bu aslında chrootkapakların altında kullandığını düşünüyorum ). Okumanız gereken diğer dosyalar için salt okunur bir dosya sistemi bağlayın.
Loren Rosen

3

rmçok eski bir Unix komutudur ve büyük olasılıkla kullanıcı dostu olması düşünülerek tasarlanmamıştır. Tam olarak ne istediğini, izinleri olduğunda sormaya çalışır. Pek çok yeni kullanıcı için bir sıkıntı, kodu sık sık birlikte görmeleri sudove kullanma hakkında fazla bir şey düşünmedikleridir. Doğrudan gibi dosyaları değiştirmek Fonksiyonlar rm, dd, chrootvb kullanımda çok dikkatli davranmak gerekmektedir.

Günümüzde çöp kutusundantrash (sudo olmadan) kullanmayı seviyorum . Yanlışlıkla silinen dosyaları kolayca alabilmeniz için Windows'tan Geri Dönüşüm Kutusu gibi işlev görür. Ubuntu zaten bir Çöp Kutusu klasörüne ve Dosyalar içinde yerleşik çöp kutusuna gitme işlevine sahiptir.

O zaman bile hata yapabilirsin, bu yüzden tüm dosya sisteminizi yedeklediğinizden emin olun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.