Sejak kapan POSIX dan GNU rm tidak menghapus /?

23

Selama beberapa tahun sekarang, rmutilitas GNU tidak akan menghapus /kecuali ia dipanggil dengan --no-preserve-rootopsi. Namun, perintah rm -rf /itu telah bersarang di alam bawah sadar kolektif sebagai berbahaya untuk waktu yang sangat lama dan orang masih sering mengutipnya sebagai perintah "menakutkan".

Saya bertanya-tanya kapan aturan ini yang rmtidak bisa dihapus /pertama kali muncul. Saya memeriksa spesifikasi POSIX, dan saya bisa melihat bahwa sementara POSIX: 2008 termasuk fitur keamanan ini, POSIX: 2001 tidak. Karena versi online dari spesifikasi POSIX diperbarui dari waktu ke waktu, dengan setiap sub-rilis baru, saya juga memeriksa mesin wayback dan menemukan halaman yang relevan dari POSIX: 2008 dari 2010 dan dapat mengkonfirmasi bahwa aturan yang rmtidak dapat menghapus /sudah terdaftar saat itu.

Jadi, pertanyaan saya adalah:

  • Kapan aturan yang rmtidak bisa dihapus /ditambahkan ke spesifikasi POSIX? Apakah itu dalam edisi 2008 asli dari Single UNIX spesifikasi versi 4 atau itu ditambahkan dalam revisi?
  • Kapan batasan ini ditambahkan ke GNU rm? Saya cukup yakin itu sebelum ditambahkan ke POSIX, tetapi kapan itu terjadi?
terdon
sumber
2
Lihat juga Apakah 'rm. *' Pernah menghapus direktori induk?
Stéphane Chazelas
1
Terkait: Austin Group Interpretation # 019 (2003), yang menjelaskan (tetapi tidak mengimplementasikan) perubahan tersebut.
Michael Homer
4
2003-11-09 git.savannah.gnu.org/gitweb/…
ilkkachu

Jawaban:

28

Anda dapat menemukan versi HTML dari semua edisi POSIX 2008 online:

Itu ditambahkan dalam edisi 2008.

Corrigenda teknis umumnya tidak menambahkan fitur baru.

Anda dapat melihat versi sebelumnya ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/rm.html ) (POSIX 2004) tidak memiliki teks itu.

Teks baru diterima dalam konferensi grup austin 2003-05-09 untuk dimasukkan dalam revisi standar nanti.

Itu diminta oleh John Beck dari Sun Microsystems pada bulan Maret di tahun yang sama (tautan memerlukan registrasi kelompok terbuka, lihat juga Permintaan Peningkatan Nomor 5 di sini ).

John Beck menulis, pada Selasa 11 Maret 2003:

@ 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 rmditambahkan --preserve-rootdan --no-preserve-rootopsi di komit 2003-11-09 ini , tetapi --preserve-roothanya menjadi default di komit 2006-09-03 ini , jadi di coreutils 6.2

FreeBSD telah mempertahankan slash sejak komit 2004-10-04 (dengan "Cari tahu bagaimana nyala api celana dalam saya sebenarnya" log komit), tetapi awalnya tidak ketika di bawahPOSIXLY_CORRECT , sampai mereka ingat untuk memeriksa satu dekade kemudian bahwa POSIX sekarang mengamanatkannya pada titik mana hal itu dilakukan juga dalam mode POSIX .

Komitmen awal FreeBSD menyebutkan Solaris sudah melakukannya pada saat itu.

@JdePB (dalam komentar di bawah) menemukan bahwa tautan ke cerita orang dalam Sun menguatkan dan memberikan rincian lebih lanjut tentang asal Solaris dan menyarankan Solaris sudah memiliki perlindungan di tempat sebelum mereka mengajukan permintaan kepada kelompok Austin.

Ini menjelaskan alasan untuk menambahkan pengecualian itu. Sementara orang hanya bisa menyalahkan diri sendiri jika mereka melakukannya rm -rf /, ada kasus di mana skrip dapat melakukannya jika melakukan rm -rf -- "$1/$2"tanpa memeriksa bahwa $1/ $2itu disediakan yang merupakan hal yang memukul beberapa pelanggan Sun buruk ketika salah menerapkan patch Solaris (menurut tautan itu).

Larangan penghapusan .dan ..ditambahkan jauh sebelum itu dan sekali lagi untuk melindungi terhadap potensi kecelakaan. rmmasih merupakan perintah yang berbahaya. Itu melakukan apa yang seharusnya dilakukan: menghapus apa yang Anda katakan.

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/*

Juga akan menghapus semuanya. Penyempurnaan nama file Shell diketahui menyebabkan masalah seperti itu saat Anda melakukannya

rm -rf someth<Tab>/*

Diperluas ke:

rm -rf something /*

Karena somethingkebetulan bukan menjadi direktori.

Kerang suka tcshatau zshakan menambahkan prompt tambahan ketika mencoba menelepon rmdengan *wildcard ( tcshtidak secara default).

Stéphane Chazelas
sumber
1
Sebagai co-op muda SA, saya mencoba menghapus file yang tersembunyi di direktori pengguna di SunOS w / rm -rf .*dari dir rumahnya. Tak lama setelah itu, semua saluran telepon menyala ...
Aaron D. Marasco
Saya bertaruh $ rm -rf. * = Rm -rf / dengan cara berbelit-belit untuk sampai ke sana.
Escoce
@GuruAdrian yakin, * berarti cocok dengan semuanya. * = .Filename tetapi juga ../ dan karena itu ../ .. dan ../../ .. ad infinatum sampai Anda kehabisan bitpace untuk perintah.
Escoce
mungkin di kulit modern. Tidak selalu seperti itu. Saya meninggalkan kedalaman administrasi dan pengembangan sistem lebih dari 15 tahun yang lalu
Escoce