Rm ve joker karakter arasında kazayla boşluk yazarak kullanıcıyı önleyin


29

Niyet:

rm -rf string*

Sorun:

rm -rf string *

İlk vaka rm'nin meşru ve yaygın kullanımıdır, küçük bir yazım hatası ikinci durumda çok fazla soruna neden olabilir. Yanlışlıkla izleyen veya önde gelen bir joker karaktere karşı akıllıca korunmanın basit bir yolu var mı?


8
Yakın zamanda ve iyi yapılandırılmış bir kabuk ( zshveya bash) ile dönüş tuşuna basmadan önce sekme tuşuna basmayı (otomatik tamamlamayı tetiklemek için) alışkanlık
edinmeyi tercih ederim

2
touch -- -iDeğişkenlerinize bir joker karakter eklediğinizde parametre -iolarak iletilecek bir dosya oluşturur . rm-i
Monica’yı eski durumuna getirin - M. Schröder

@ MartinSchröder: Eğer dosyanın bulunduğu dizinde olursanız.
sonraki duyuruya kadar duraklatıldı.

@ MartinSchröder Bu sadece yazarsanız işe yarayacak rm *. Eğer yazarsanız rm name *, genişleyecektir rm name -i other names. -ibir seçenek olarak işlenmeyecektir çünkü dosya isimlerinden önce değildir.
Barmar,

1
Genellikle, bir kullanıcı bunu yalnızca bir kez yapar.
tedder42

Yanıtlar:


37

DEBUGŞüpheli görünen komutları iptal etmek için bir tuzak yazılabilir. Aşağıdaki veya buna benzer bir kod, bilgisayarınıza eklenebilir ~/.bashrc:

shopt -s extdebug
checkcommand() {
  if [[ $BASH_COMMAND = 'rm -r'*' *' ]]; then
    echo "Suppressing rm -r command ending in a wildcard" >&2
    return 1
  fi
  # check for other commands here, if you like
  return 0
}
trap checkcommand DEBUG

Tadı mantığı ayarlayın.

(Aslında bu yaklaşımın faydalı olmasını beklemiyorum - onları tek tek test etmek için yıkıcı bir komut vermek için çok fazla yol var - ama bu soruya tam anlamıyla bir cevap veriyor).


47

Tamamen kurşun geçirmez bir sistem yoktur. Ve "Emin misiniz?" bir şeyleri isterse hem üretkendir, hem de “Tabii ki eminim”. diz çökmesi reaksiyonları.

Geçtiğimiz yıllarda bir kitaptan aldığım bir numara ilk önce ls -R blah*o zaman yapmalı, rm -fr blah* eğer ortaya çıkan liste isabet etmek istesem isabet ederse , yapmalı ve yapmalı .

lsÖnce komutu yerine getirmek yeterince kolaydır , sonra sil ve ls -Rile değiştir rm -fr.

Son soru, "Eğer bilgi sizin için değerliyse, yedeğiniz nerede?"


4
Yukarı ok yerine kullanmak ^ls -R^rm -rf^ve belki bir takma ad olarak ayarlamak mümkündür
exussum

FWIW, bu ls -Rtemelde her zaman yaptığım şeydir, ancak bu noktada içgüdüseldir, bu yüzden cevapla oluşturduğumda bilinçli zihnimi kaydırdı. Yani bunun için +1.
JakeGould

Bu ayrıca, enter tuşuna basarsanız ya da farenizi basarsanız ve yeni satırlara sahip bir şeye yapıştırırsanız, zarar vermeyeceği avantajına sahiptir. Bazen sadece daha fazla güvenlik için işleri daha az verimli bir sırayla giriyorum, örneğin cat > .log, daha sonra geri dönün ve önce dosya adını yapıştırın veya yanklayın .log. Yani hiçbir noktada > valuablefilecmdline var.
Peter Cordes

Rm aliased kullanıyorum rm -i, bu yüzden sık sık sadece rm komutumu yapıyorum ve sonra \ satırın başına bir satır koyuyorum . ( \rmkelimenin bir kısmı alıntı yapıldığı için rm için takma ad genişlemesini önler). Bir -rya da ihtiyacım olursa -f, evet, bazen lsyerine başlamakla başladım rmya da sadece parçamdan ayrıldım -rf. ? (düzenleme, nasıl bir ters eğik çizgi alabilirim kod formatlama bquote bslash bslash bquote başarısız olur.
Peter Cordes

8

rmrfYerine kullanmak için kendinizi eğitir misiniz rm -rf?

Öyleyse, bu bash işlevi, komutu onaylamadan önce gerçekte ne olacağını görmek için size bir şans sağlayacaktır:

rmrf() { echo rm -rf "$@"; read -p "Proceed (y/N)? "; [ "${REPLY,,}" = y ] && rm -rf "$@"; }

Bu işlevi kalıcı hale getirmek için, bu satırı kullandığınız ~/.bashrcher bilgisayardaki dosyaya ekleyin .

Ortak rmtakma adla karşılaştırma

Bir takma ad tanımlamak yaygındır:

alias rm='rm -i'

Bunun iki sınırlaması var:

  1. Bu takma adıma bağlı kalırsanız, o zaman bir makinedeyken veya sizde olmayan bir ortamda şok alırsınız. Aksine, rmrfbu işlevi olmayan bir makinede çalışmayı denemek zararsız bir sonuç verecektir command not found.

  2. Bu takma ad, sizin durumunuzda yardımcı olmaz, çünkü -fkomut satırında sağladığınız -iseçenek, takma addaki seçeneği geçersiz kılar .


4
Fena fikir değil. Ancak, bu fonksiyonun, kullanıcının kullandığı herhangi bir sistemde kurulu ve mevcut olmasına bağlıdır. Öyleyse, bazı işler için uzaktaki bir sunucuya giriş yaptıklarını ve yanlış rm -rfkomutu verdiklerini varsayalım , ne olur? Bunun gibi sahte fonksiyonlar yaratmak, basit bir çözümü karmaşıklaştırır: Sadece daha dikkatli olun ve izinlerin ne olduğunu anlayın.
JakeGould

4
@JakeGould Gerçekten gerekmedikçe rm -f kullanmayın .
bir CVn

1
Neden rmrfsadece rmargümanları kontrol eden bir kabuk işlevi yaratmanın aksine, -rveya -rfbu durumda özel bir mantığı harekete geçirir, yoksa doğrudan command rm "$@"gerçek rmkomutu çağırmak için çağırıyorsunuz ?
Charles Duffy

3
Farklı bir isim kullanırsınız, böylece geçersiz kılmanız yokken kendinizi ayakla vurmazsınız. Ve ben @ MichaelKjörling ile katılıyorum, yoksa gerek -fyok -i. Ayrılmak -f, örneğin salt okunur bir dosyayı kaldırmadan önce size ekstra uyarı verir.
Peter Cordes

6

Yanlış dosyaları silerek çok büyük bir olay, ben gibi is a çöp tenekesi klasör oluşturun yaptık şeylerden biridir bir durumda olursam mkdir trashcano zaman, ben bir komut dosyası var rmTrashcanbir sahip rm -rf trashcan/*veya rm -rf *veya benzer, çok dikkatli yazılı ve birkaç kez kontrol edildi.

Bu şekilde, eğer bir hata yaparsam, hata bir mvemir üzerinde değil rmemirdir. Bir kez yapıp tam olarakls sildiklerimden emin olduğumda, aslında kirli işleri güvenli bir şekilde yapıyor.rmTrashcan

Ayrıca yedekleri silmek zorunda kaldığım bir durum için de müthiş uygun oldu. Ben olabilir mvçöp tenekesi içine yedekleme bütün bir ay, mvkaç ben geri yedeklemeler içine sonra (ayın 1. günü, ayın 15.) tutmak istedim rmTranshcangerisini. Benzer bir komut yapmak rmkendi başınıza yapmak zordur ve bu şekilde yapmak lsyedeklemelerin hangi dosyaları geride bıraktığımdan emin olmamı sağlar (yalnızca silmek istediğim dosyaları sıralamak yerine)


4

İki komutla ( lsve rm) rahatsız etmek yerine, kullanımın daha basit ve daha kolay bir yol olduğunu düşünüyorum find:

find . -maxdepth 1 -name "string*" -delete

Yanlışlıkla yazarsanız ve ( ve istediğiniz şekilde) isimli "string *"dosyaları silecektir , ancak bir kabuktaki gibi her dosyayı almayacaktır.string charsstring letters*

Ayrıca, -deletehangi dosyaları sileceğini görmek için bırakabilirsiniz , daha sonra oka -deletebasıp, yazmaktan ^ls -R^rm -rfveya başka bir saçmalıktan daha kolay yazabilirsiniz .


A find, komut satırında belirtilen yalnızca açık parametreler yerine eşleşen dosyalar için yuvalanmış bir arama yapar. Bence bu işareti özlüyor. Yine de yanlış olabilirim.
katilist

3

Yanlışlıkla izleyen veya önde gelen bir joker karaktere karşı akıllıca korunmanın basit bir yolu var mı?

Pek sayılmaz. Başka bir cevapta, bir görevi yerine getirmeden önce bilgi istemi eklemek için özel bir komut oluşturabileceğiniz önerildi. Ancak bu özel komut ile ilgili sorun, üzerinde çalıştığınız sistemlere bilinçli olarak kurulmalıdır. Takılı olsa bile sorun, başınıza ygelen görevi gerçekleştirmek için vurulacak refleksinizdir .

Yani bu, bir metin / komut satırı düzeyinde olsa bile, tüm bir kullanıcı arayüzü sorunudur. Sizi yapmamanız gereken bir şeyden korumak için kaç güvenlik ağı olmasını bekliyorsunuz? Makas çifti gibi bir şey: Bir şekilde ihmal edersiniz ve elinizi keserken kâğıt veya kâğıt kesmeyi düşünürken elinizi kaydırıp kesiyorsanız, kim hatalı? Ya da trafik ışıkları ve durma işaretleri: Bir sürücünün ışık yakmasını ya da bu tür riskli davranışlarda bulunurlarsa neler olabileceğinin akut farkındalığı dışında trafik işaretleri görmezden gelmesini durduracak hiçbir şey yoktur.

Bu, en iyi ve gerçekçi çözümün kullanıcılar ve gruplar için sistem izinlerinde yattığını söyledi. Bu, bir kullanıcıyı kendisinden korumak için en iyi / tek gerçek güvenlik ağıdır.

Sadece ona erişen bir sistem üzerinde çalışıyorsanız, sadece chmod 777her şey için cazip gelebilirsiniz , ancak rasyonel bir sistem kurmanın yolu bu değildir. Bunun yerine izinler 755tüm dizinler için ve 644çalıştırılamayan tüm dosyalar için olduğu gibi olmalıdır . Yürütülebilir dosyalar 755en azından olmalıdır , ancak belki de 744yalnızca başkalarının okumasını ancak dosyaları çalıştırmasını istemeseniz bile .


2

İlk rmkomutunuzu bayraksız oluşturmayı deneyin -f, ancak -ibunun yerine, rmsilmek istediğiniz her dosya için sormanızı sağlar. Küçük özyinelemeli silme işlemleri için, ykomutun doğru yazıldığından emin olduktan sonra tuşu basılı tutabilirsiniz . Büyük silme için, işlemi iptal edebilir ve kullanım komut geçmişi dikkatle değiştirmek için -ibir etmek -f.


Aslında y[RETURN]her dosyaya basmanız gerekiyor, GNU rm ile tutabileceğiniz hiçbir şey yok. -iKomutu doğru bir şekilde yazdıktan sonra , düzenlemenin yolu budur. Sonra sadece bir salt okunur dosyada ve belki başka şeylerde bir istemi olsun.
Peter Cordes

1
Sadece bir rm -Ikez, sadece potansiyel olarak tehlikeli silme işlemleri için (yani birçok dosya için)
Nick Matteo

1
Daha az yapıcı forumlarda cevabım, "Yazma / okuma yeniden yazma işleminiz o kadar kötüyse, joker karakterlerle 'rm -rf' yi kullanan bir işiniz yok" satırındaki bir cevap olurdu. -I anahtarını bilmiyordum ... <20 yıl önce yerleştirilmiş olmalı; 'Ama ben son kez' adam rm 'yaptım. :)
Nevin Williams,

2

rm vardır -ive -Iher kaldırılmadan önce onaylayın bayraklar. Geçmişte, bazı dağıtımlar varsayılan olarak bunları açmıştır. Bu korkunç bir fikir. Kullanıcıya normal işlemler için çok fazla onaylama diyaloğu verin ve alışkanlıklarla onaylamaya başlayacaktır. Bu sadece yeni ve daha sinir bozucu bir diyaloga "dikkatli olma" (her zaman kırmızı bayrak) gereksinimini değiştirir. "Evet. Evet. Evet. Evet! EVET! Allah kahretsin, aptal bilgisayar dosyaları sil. YESYESYESYESYES - CRAP HAYIR HEDEF! NOOOOOOO!" Bu, "Evet ama hayır demek istemedim" diyalog problemi. Bu cevap, onaylama diyaloglarının neden yanlış zamanda geldiğinin görsel bir açıklamasını sunar .

Anlattığınız hata türü bir kayma , "amaçlanmayan bir eylemin performansı" dır . Kullanıcı genellikle hatayı hemen tanır ve nasıl düzeltileceğini tam olarak bilir. Ne yazık ki, Unix kullanıcıya fırsat vermez, rm dosyayı hemen siler. Diğer tüm işletim sistemleri bu sorunu, en azından bir süre için Çöp Kutusu kullanılarak silme işlemlerine izin vererek çözer.

Unix için çeşitli çöp sistemleri vardır ve bu cevap önerileriyle doludur .

Soru, rm alias rm ya da değil alias rm. Rm aliasing Artıları ...

  1. Rm alternatifini kullanmayı unutmayı başaramazsınız.

Rm aliasing Eksileri ...

  1. Sahip olmayan sistemlere güvenebilirsiniz.
  2. Disk neredeyse dolu olduğunda sorunlara neden olabilir.
  3. Çöpleri periyodik olarak boşaltmak için altyapıya ihtiyacınız var.
  4. Programlarda beklenen rm davranışını engellememelisiniz.
  5. RPM'yi tam olarak taklit etmeyebilir.

İlk argümanı çok fazla takip ederseniz, vi (vim, vi), csh (tcsh, csh değil) ve diğer eski yardımcı programları kullanarak sararsınız çünkü evrensel olarak kullanılabilirler. Yine de, ortamınızı aşırı kişiselleştirme tehlikesi vardır. Yardımcı programlarımı yanımda götürmeyi ve bunu mümkün olduğunca kolaylaştırmayı tercih ederim. YMMV.

İki ve üç teknik sorunlar. Onlar benzer çöp boyutunu kontrol eder ve periyodik şeyleri temizler akıllı orak makinesi işi ile çözülebilir tmpreaper . Bu bir cron işi olabilir veya daha akıllıca bir sürüm, birçok masaüstü Linux dağıtımında bulunan çeşitli dosya sistemi olay altyapılarını kullanabilir. Bu basit değildir ve verimli bir şekilde yapılması bile zordur. Var olan bir sistemi bulmak, kendi sisteminizi oluşturmaya çalışmaktan iyidir.

Dördüncüsü, yeni rm'nizi bir kabuk takma adı yaparak ele alınabilir alias rm='trash', o zaman programları etkilemeyecektir.

Beşincisi, okuyucunun çözmesi için bıraktığım bir sorun. rm'de çok fazla anahtar yok.


Rm takma adını rm -ikullandım, ancak çoğu zaman \rmistenmeyen davranışı elde etmek için kullanıyorum. Ben rm -iherhangi bir zaman yazarım, argümanlardan birine hayır diyeceğim. Bazen komutu komut lsolarak çalıştırıyorum , ardından sadece işim bittiğinde \ rm'yi koyuyorum. Bu yüzden yanlışlıkla rm -rf /yerine geri dönüşü vurmak mümkün değil/.../file
Peter Cordes

rm -Iya rm --interactive=onceda çok, çok daha az sinir bozucu rm -ive hala tehlikeli olan herşeyi yakalamakta (sadece 3 dosyadan fazlası olduğunda ya da özyinelemeliyse ve sadece HER BİR DOSYA İÇİN BİR KEÇE olur.)
Nick Matteo

@Kundor Evet ve denklemi değiştirmez. Muhtemelen kullanıcının onu görmezden gelmesini daha olası kılar. Kullanıcının bir hedefi var: silme. Bilgi istemi "az önce silmemi istediğiniz şeyleri silmek istediğinize emin misiniz?" Kullanıcı hala bir şeyleri silme hedefiyle sabitlendi, neyin silineceğini doğrulamıyor, bu yüzden düşünmeden "evet" diyorlar. -iKullanıcıya hedeflerini değiştirmesi için zaman verebilir. İlgili bir soruya verilen bu cevap her şeyi ortaya koyuyor.
Schwern,

@Schwern: ancak hiç kimse rm -ikapatmadan 30 saniyeden fazla bir süre yaşayamaz . Oysa rm -Isadece batırdığın zaman sorar; bilgi istemi yalnızca büyük silme işlemleri için ortaya çıkıyor. Birkaç şeyi silmeye çalıştığınızda istem istendiğinde, şaşırırsınız ve yanlışlıkla "foo *" yazdığınızı fark edersiniz.
Nick Matteo,

@Kundor Üçten fazla dosyayı silme ve yinelemeli olarak silme (doğrulama, -rfyeni keşfettiğim alışkanlık tarafından devre dışı bırakılır ) olası bir bozulma tespit etmek için kötü proxy'lerdir. Bir alt dizini silmek istemek muhtemel bir bozulma değildir. Mesaj, kullanıcının doğrulamak istemediği bir noktada yararlı bilgiler eklemeden ne yapması gerektiğini onayladığı için yardımcı olmaz. "rm: 1 argümanını yinelemeli olarak kaldır?" “Evet, dizini sil, sadece bunu yapmanı söyledim! ... bekle, hangi dizin o? CRAP !!!”
Schwern

2

Herkese !$son komut numarasındaki = son argüman hakkında bilgi veririm :

% ls job[XYZ].*
jobX.out1
jobX.out2
[rest of the matches]

% rm !$

Bu, joker genleşme genişlemesinin incelenmesine ve daha sonra, bir boşluk eklenmesi olasılığı olmadan tam olarak aynı küre şeklinin kullanılmasına izin verir *.

Ayrıca, insanların potansiyel olarak tahrip edici bir komut satırına hiçbir zaman küresel bir joker desen çizip yapıştırmalarını önermiyorum. Çünkü kendi ellerimle sorun oldu :)

Laboratuvarımdaki bir teknik az önce bu hatayı yaptı (3 aylık çalışma) - ve evet (1 gün geride) yedek olduk.


0

Herkes "Daha dikkatli ol", "Bir takma ad / onay istemi yapmayın çünkü ona dikkat etmeme alışkanlığına sahip olacaksınız" gibi görünüyor.

Cool ve her şey. Demek istediğim, bunun için bir takma ad oluşturmanız gerektiğini düşünmüyorum rm( rmrfçünkü bunu kolayca batırıp gerçek komutu yazabildiğiniz için).

Fakat neden bir takma ad / komut dosyası oluşturamıyor ve onu söyleyemiyor, söyleyemiyor removeve sadece bir argüman besleyemiyorsunuz (ör. $ 1)? Joker karakter istemeden yapılan boşluk nedeniyle ($?) 2 dolar olmalıdır ve bu nedenle komut dosyası / sarmalayıcı / diğer adınız ikincisiyle beslenmeyecektir. Evet, bir seferde yalnızca bir silme kümesi (joker karakter ile) yapabilirsiniz, ancak bu ödeyeceğiniz bedeldir.

Güzel bir şey yazıyor olsaydım, bana silmeyi planladığı dosya ve dizinlerin sayısını ve silmeyi planladığım toplam büyüklüğünü ve sonra onaylamanızı isteyip istemediğini söyleyebilirim, ancak bu durum akışınızı engelleyebilir. Belki bunu bir bayrak seçeneği yaparsın remove? (-ben). Bunun sadece tek bir joker karakter olup olmadığını görmek için 1 dolarlık bir kontrol yapmak ve onay istemek ve gerçekte hangi dizinde olduğunuzu listelemek isteyebilirsiniz.


Bir kenara, orada birkaç rmyedek var. Birçoğu UI masaüstü çöp kutusuyla uyumlu olmaya çalışıyor. Bunlardan bazıları araştırılmaya değer olabilir.


6
"Kaldır" takma adınız hiçbir zaman birden fazla dosyayı kaldırmaz. Bir joker kullanamazsınız, çünkü kabuk onu görmeden önce genişletir.
saat

Öyleyse bir değerlendirme yap ve bunu senaryo içine çek.
user3082

Yani yazmak ister misin remove \*? Komut dosyanız kabuğun girdisini genişlemesine izin veriyorsa, bunun çok yardımcı olduğunu görmüyorum.
Peter Cordes

0

Çok basit bir püf noktası -rfsona erdirmektir: rm whatever* -rf
Bu, hata oranını önemli ölçüde azaltır, çünkü daha sonra daha fazla karakter *yazdığınız için yazım hatalarını görmek için daha fazla zamanınız olur.
Bu her şeyi çözmez. Sadece basit bir günlük hile.

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.