Ne zamandan beri POSIX ve GNU rm silinmiyor /?


23

Birkaç yıl boyunca, GNU rmyardımcı programı /, --no-preserve-rootseçenekle birlikte çağrılmadıkça silmez . Bununla birlikte, bu emir rm -rf /, kollektif bilinçaltında çok uzun zamandır tehlikeli olarak kabul edildi ve insanlar hala çoğu zaman “korkutucu” emir olarak belirtiyorlar.

Önce rmsilinemeyen bu kuralın ne zaman /ortaya çıktığını merak ediyordum . POSIX özelliklerini kontrol ettim ve görüyorum ki POSIX: 2008 bu güvenlik özelliğini içeriyor, POSIX: 2001 ise. POSIX özelliklerinin çevrimiçi sürümleri zaman zaman güncellendiğinden, her yeni alt sürümde bir geri dönüş makinesini de kontrol ettim ve 2010'dan itibaren POSIX: 2008'in ilgili sayfasını buldum ve kuralın rmkaldıramadığını doğruladım. /o zaman zaten listelendi.

Yani benim sorularım:

  • POSIX özelliklerine rmkaldırılamayan kural ne zaman /eklendi? Single UNIX Spesifikasyonu sürüm 4'ün orjinal 2008 baskısında mıydı yoksa revizyona eklenmiş mi?
  • Bu sınırlama GNU'ya rmne zaman eklendi ? POSIX'e eklenmeden önce olduğundan eminim, ama ne zaman oldu?


1
İlişkili: Değişikliği tanımlayan (ancak uygulamayan) Austin Group Yorumlama # 019 (2003).
Michael Homer,

Yanıtlar:


28

POSIX 2008'in tüm sürümlerinin HTML sürümünü çevrimiçi olarak bulabilirsiniz:

Bu 2008 baskısında eklendi.

Teknik corrigenda genellikle yeni özellikler eklemiyor.

Önceki sürümü görebilirsiniz ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/rm.html ) (POSIX 2004) bu metne sahip değildi.

Yeni metin, standardın daha sonra gözden geçirilmesine dahil edilmek üzere 2003-05-09 austin grubu konferansında kabul edildi .

Bu edildi Aynı yıl Mart ayında Sun Microsystems John Beck tarafından talep edilen (link ayrıca bkz, kayıt Opengroup gerektirir Geliştirme İsteği Number 5 burada ).

John Beck, 11 Mar 2003, Salı yazdı:

@ page 820 line 31681-31683 section rm comment {JTB-1}

Problem:

Defect code :  3. Clarification required

An occasional user mistake, with devastating consequences, is to
write a shell script with a line such as:
      rm -rf $VARIABLE1/$VARIABLE2
or
      rm -rf /$VARIABLE1
without verifying that either variable is set, which can lead to
      rm -rf /
being the resulting command.  Since there is no plausible
circumstance under which this is the desired behavior, it seems
reasonable to disallow this.  Such a safeguard would, however,
violate the current specification.

Action:

Either extend the exceptions for . and .. on the noted lines
to list / as well, or specify that the behavior of rm if an
operand resolves to / is undefined.

GNU rmeklendi --preserve-rootve --no-preserve-rootseçenekler bu 2003-11-09 işlemek , ancak --preserve-rootyalnızca varsayılan haline bu 2006-09-03 taahhüt coreutils 6.2 kadar,

FreeBSD edilmiş eğik çizgi koruyarak beri o 2004/10/04 taahhüt (bir "iç çamaşırım gerçekten ne yanmaz öğrenin" günlüğünü işlemek), ancak ne zaman altında başlangıçta değilPOSIXLY_CORRECT onlar POSIX şimdi oldu sonra o on yıl kontrol etmek hatırlayana kadar, bunu zorunlu hangi POSIX modunda da yapıldığını işaret .

FreeBSD'nin ilk taahhüdü Solaris’in o zamanlar zaten yaptığını söylüyor.

@JdePB (aşağıda yapılan yorumda) , Solaris'in kökeni hakkında daha fazla detay ve ayrıntı veren ve Solaris'in Austin grubuna talepte bulunmadan önce yerinde önlem aldığını öne süren bir Sun insider öyküsüne bağlantı olduğunu buldu .

Bu dışlamanın eklenmesinin gerekçesini açıklar. Eğer yaparlarsa biri yalnızca kendini suçlayabilir iken rm -rf /, yapıyor bir komut dosyasının yapabileceğini bir vaka var rm -rf -- "$1/$2"olduğunu kontrol etmeden $1/ $2Solaris yama (bu bağlantı göre) misapplying bazı Sun müşterileri feci çarptı şeydir sağlandı.

Silinmesine yasaklayan .ve ..çok daha önce eklenmiş potansiyel aksilikler karşı koruma oluşturmak amacıyla tekrar. rmhala tehlikeli bir emirdir. Yapması gerekeni yapar: ne söylediğini kaldırın.

rm -rf /*
cd /tmp &&  rm -rf .*/   # on some systems where rm -rf ../ still removes
                         # the content of ../ and shells that still
                         # may include . and .. in glob expansions.
rm -rf -- "$diretcory"/* # note the misspelled variable name
dir='foo '; rm -rf $dir/*

Ayrıca her şeyi kaldırırdım. Kabuk dosya adının tamamlanmasının böyle sorunlara neden olduğu biliniyor

rm -rf someth<Tab>/*

Şunlara genişletildi:

rm -rf something /*

Çünkü somethingböyle bir dizin olmadı.

Gibi kabuklar tcshveya bir joker ile zsharamaya çalışırken bir istemi ekler ( varsayılan olarak değil).rm*tcsh



1
Genç bir kooperatif SA'sı olarak, SunOS'taki bir kullanıcının dizinindeki gizli dosyaları rm -rf .*ev dizininden silmeyi denedim . Kısa süre sonra, tüm telefon hatları aydınlandı ...
Aaron D. Marasco

Ben $ rm -rf. * = Rm -rf / oraya gitmek için kıvrımlı bir şekilde bahse girerim.
Escoce

@GuruAdrian emin, * her şeyle eşleşir anlamına gelir.
Escoce

belki modern mermilerde. Her zaman böyle değildi. 15 yıldan daha uzun bir süre önce bu sistem yönetimi ve geliştirmenin derinliğini bıraktım
Escoce
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.