Artikel:Tragedi rm

Tulisan ini sebetulnya dimaksudkan sebagai tulisan yang sifatnya ringan, berisi kumpulan anekdot pribadi, pengalaman rekan-rekan, maupun diskusi orang lain di milis/forum Internet seputar sebuah perintah yang amat familiar di Unix. Namun selain itu ke dalam tulisan ini saya juga berusaha menambahkan beberapa tip dan nasihat yang diharapkan dapat berguna. Semoga menghibur dan bermanfaat.

Berbagai bluper rm

Pengguna Unix/Linux, terutama yang menggunakan antarmuka command line, tentu kenal perintah rm (yang berarti ‘remove’) yang digunakan untuk menghapus file/direktori. Dan di antara para pengguna itu, saya berani bertaruh bahwa hampir semuanya pernah mengalami kecelakaan naas atau setidaknya menjengkelkan dengan perintah ini. Jika belum, maka kemungkinannya adalah si pengguna tersebut masih baru dengan Unix/Linux, dan tinggal menunggu waktu saja sampai kecelakaan pertama terjadi.

Berikut ini beberapa skenario kecelakaan yang dapat terjadi dengan perintah rm. Bayangkan Anda seperti sedang melihat acara seperti World’s Most Amazing Videos atau ‘Sports Disasters’.

Salah ketik

Anda tidak sengaja menekan tombol Shift, sehingga:

rm *.o

terketik menjadi:

rm *>o

Ups. Maksud hati ingin menghapus semua file objek hasil kompilasi, ternyata malah menghapus semua file. Dan tercipta sebuah file kosong bernama o. Ini karena > di shell berarti redireksi output, dan rm tidak menghasilkan output apa-apa ke stdout (kecuali jika ada opsi -v).

Anda tidak sengaja mengetik spasi di antara wildcard, sehingga perintah:

rm *~
rm *.bak
rm a* b* c*

menjadi:

rm * ~
rm * .bak
rm a* b* c *

Sial! Maksud hati ingin menghapus file-file backup saja (*~ atau *.bak) atau file-file yang diawali huruf tertentu (mis: a*) tapi malah kecelakaan menghapus semua file yang ada, karena * akan diekspansi oleh shell menjadi semua file yang ada di direktori saat itu.

Anda lupa mengetik titik. Sehingga perintah:

rm -r ./bin

yang maksudnya ingin menghapus secara rekursif subdirektori bin yang ada di direktori saat itu, menjadi:

rm -r /bin

yaitu perintah untuk menghapus isi direktori sistem penting /bin. Tidak masalah seandainya Anda tidak sedang bekerja sebagai root, tapi jika iya, wah. Ingin tahu efeknya jika direktori vital seperti/bin (yang berisi perintah-perintah penting seperti ls, login, atau para shell) hilang? Silakan dicoba.

Anda tidak sengaja salah ketik !. Misalnya:

!r

! adalah karakter default untuk melakukan ekspansi histori di shell seperti csh dan bash. Jika Anda sebelumnya pernah mengetikkan perintah rm, maka perintah di atas tadi akan mengulang perintah rm tadi. Bum! Bisa-bisa Anda mengulang menghapus file secara rekursif di waktu dan tempat yang salah.

Anda sedang mengeset keyboard ke US-internasional (biasanya jika sedang belajar bahasa-bahasa Eropa seperti Prancis dan Jerman, setting keyboard ini sering digunakan karena dapat memasukkan karakter-karakter berdiakritik seperti umlaut, aksen, dll). Anda bermaksud menghapus file-file backup:

rm *~

Tapi karena saat mengetik ~ yang pertama, belum muncul apa-apa, maka jika Anda kecelakaan juga menekan Enter, bisa-bisa perintahnya menjadi:

rm *

Waduh.

Salah histori

Anda ingin mencari ulang perintah sebelumnya yang telah diketik dengan tombol panah atas dan bawah keyboard (memanfaatkan fitur histori shell). Seingat Anda perintah yang Anda inginkan ada di 2 posisi sebelumnya, jadi Anda dengan gesit menekan cepat atas, atas, Enter. Ternyata Anda salah tebak. Dan perintah yang tereksekusi tidak sengaja adalah perintah rm -r. Tidaaak.

Salah spesifikasi wildcard

Anda mencoba menghapus sekelompok file tertentu dengan wildcard yang agak kompleks, namun ternyata perintah Anda salah. Misalnya, Anda ingin menghapus semua file yang mengandung spasi:

rm * *

Padahal seharusnya:

rm *\ *

atau:

rm *" "*

Aih aih. Ini pernah terjadi pada saya satu kali, dahulu kala.

Salah lokasi

Salah direktori. Anda ingin menghapus file, tapi Anda lupa/salah mengira Anda sedang ada di direktori mana. Nah lho. Ini pernah terjadi pada salah seorang rekan kantor saya dan mengakibatkan banyak file dan direktori hilang. Pada saat itu, file yang terhapus jumlahnya hingga belasan ribu, dan dia baru menyadari hal ini setelah beberapa saat, sehingga Ctrl-C tidak sempat dilakukan awal-awal. Ribuan file pun lenyaplah. Upaya pemulihan selama beberapa jam kemudian hanya dapat mengembalikan kurang dari separuh file-file ini.

Salah server. Anda mungkin sedang membuka lebih dari satu window terminal (seperti konsole atau gnome-terminal) untuk login remote ke beberapa server, dan melakukan kopi-paste perintah. Tapi ternyata sebuah perintah dipaste ke terminal yang salah (atau ke komputer diri sendiri). Aduh.

Terus terang, kadang-kadang ini masih terjadi pada saya, walaupun jarang untuk perintah rm.

Keberadaan file-file dash

Walaupun jarang, bisa saja terjadi di direktori Anda terdapat file-file dash (file-file yang namanya diawali dengan karakter minus/setrip). Khususnya yang berbahaya adalah yang bernama:

-r

sehingga jika Anda mengetikkan:

rm *

oleh ekspansi wildcard shell, bisa saja menjadi:

rm -r dir1 dir2 file1 file2 file3

jika di direktori Anda terdapat file-file dan direktori tersebut. Sehingga tanpa sengaja Anda menambahkan opsi -r (rekursif). Ck ck ck.

Bersih-bersih

Anda menyalin file-file dari partisi (atau medium) A ke B, misalnya dari harddisk ke flashdisk. Lalu karena berhasrat bersih-bersih, Anda segera menghapus file-file di tempat lama (A) dengan rm -rf. Ternyata, karena satu dan lain hal, salinan yang ada di B rusak/hilang, atau ternyata tidak lengkap/salah salin karena Anda salah menyalin. Asem!

Melamun

Anda sedang capek, mengantuk atau melamun. Tiba-tiba saja tanpa sadar Anda dengan sendirinya mengetik perintah rm. Entah maksudnya ingin menghapus file-file backup, file-file tidak perlu, atau tangan gatal. Tahu-tahu Anda sudah menghapus file-file yang diperlukan.

Saya berani mengakui bahwa ini pernah saya lakukan. Tapi saya yakin saya bukan satu-satunya yang pernah begini.

Sejarah dan masa depan rm

rm memang salah satu sisi gelap di dunia Unix/Linux. Ia telah memakan begitu banyak korban, baik itu pemula maupun mahir. Tak heran, di buku Unix Haters’ Handbook perintah ini mendapat kecaman dan cemoohan yang ekstra spesial pake telor.

Betapa tidak. Meskipun kemajuan teknologi beberapa puluh tahun ini begitu pesat, perintah rm di Unix/Linux masih begitu-begitu saja. Belum ada suatu perbaikan drastis yang membuatnya ‘idiotproof’ atau ‘accidentproof’. Editor teks paling sederhana pun punya ‘multiple undo’, tidak dengan rm. Bahkan aplikasi web seperti Gmail sudah punya pengecek ejaan atau pemeriksa kesalahan-kesalahan umum, tidak dengan rm. Mengembalikan file yang terhapus dengan rm sampai sekarang masih bersifat untung-untungan, atau buntung-buntungan.

Beberapa distro seperti Redhat sejak dulu memang menambahkan alias:

alias rm='rm -i'

dengan tujuan agar rm selalu menanyakan lewat prompt dulu setiap ingin menghapus sebuah file. Namun cara ini menjengkelkan pemakai mahir (sehingga umumnya alias-nya dihapus/dikomen). Juga, tidak semua distro mempraktikkan ini sehingga, jika Anda berganti distro, “ilusi keamanan semu” ini akan menjadi bumerang karena Anda berasumsi kelakuan default rm adalah opsi -i aktif, padahal tidak.

Filesystem Unix/Linux yang popular saat ini yaitu ext3 juga tidak memiliki fasilitas perlindungan terhadap kecelakaan penghapusan. Misalnya recycle bin atau Trash seperti halnya di GUI. (Catatan: di filesystem Windows pun sebetulnya sama, recycle bin hanya ada di level desktop).

Padahal sejak puluhan tahun lalu sistem operasi seperti VMS sudah memiliki versioning filesystem yang menyimpan setiap versi perubahan file sehingga kecelakaan hapus/edit/timpa dapat diundo dengan mudah. Filesystem di masa depan dapat menjanjikan snapshot murah atau versioning namun nampaknya kita masih harus menunggu beberapa tahun lagi sampai ini menjadi kenyataan sehari-hari.

Tip-tip

Jadi bagaimana solusinya? Kecelakaan memang bisa terjadi di mana saja, tapi bagaimana meminimalisasi atau menghindarinya? Berikut ini kumpulan beberapa tip yang dapat Anda ingat dan praktikkan.

tidak memakai rm

Salah satu cara adalah dengan menjauhi perintah rm secara langsung sama sekali. Untuk melakukan penghapusan Anda menggunakan GUI, atau membuat alias misalnya del yang didefinisikan sebagai rm -i.

Sayangnya, kebiasaan lama sulit dihilangkan. rm biar mematikan sekalipun, tapi cepat dan simpel. Saat ini belum ada alternatif yang sama-sama ampuh dan fleksibel, namun ekstra aman.

cek ulang perintah

Setiap sebelum menekan Enter, periksa ulanglah perintah yang Anda ketikkan. Wildcard yang agak ruwet atau meragukan dapat Anda cek dulu misalnya dengan mengganti perintah rm-nya dengan ls atau echo. Dengan demikian Anda dapat mengetes bagaimana hasil ekspansi shell terhadap wildcard Anda.

matikan ekspansi histori

Fitur ekspansi histori menurut saya pribadi agak berbahaya, dan di lain sisi juga jarang dimanfaatkan. Anda bisa mematikan fitur ini dengan menambahkan baris:

export histchars=

di file startup shell Anda (mis: di ~/.bashrc).

prompt dan warna

Agar tidak salah lokasi direktori dan/atau server, set prompt shell Anda agar menampilkan informasi hostname dan direktori aktif (jika distro Anda belum melakukannya untuk Anda secara default). Misalnya di bash:

export PS1='\u@\h:\w\$ '

Sehingga jika Anda sedang login sebagai user steven di host bernama builder dan Anda sedang berada di direktori /usr/bin, maka prompt shell Anda akan seperti ini:

steven@builder:/usr/bin$

Anda juga dapat mewarnai window terminal dengan warna-warna berbeda untuk setiap server.

Dan tentunya tidak ada salahnya mengecek ulang Anda sedang berada di mana dengan perintah pwd atau hostname, sebelum melakukan sesuatu yang penting atau berbahaya.

gunakan skrip

Untuk penghapusan rutin dan spesifik, buatlah skrip-skrip. Misalnya untuk menghapus file-file backup atau temporer secara rekursif, saya biasanya menggunakan skrip delbackups seperti ini:

#!/usr/bin/perl
use File::Find;
finddepth sub {
    do { print "$File::Find::dir/$_\n"; unlink $_ } if -f and
        (/.(\.\$\$\$|\.bak|~)$/i or
         /^#.+#$/i);
}, ".";

Dengan demikian Anda tidak perlu berkutat lagi dengan wildcard.

backup

Sudah cukup jelas. Sayangnya, belum cukup banyak dipraktikkan orang.

version control system

Meskipun versioning filesystem belum popular di Unix/Linux maupun Windows, namun version control system seperti Subversion, Bazaar, atau git sudah popular dipakai orang. Sekarang seluruh file catatan, skrip, dan tentunya proyek software saya ditaruh dalam VCS. Ini menjadikan kecelakaan hapus atau timpa dapat di-undo dengan mudah (biasanya dengan perintah seperti revertuntuk membalikkan ke kondisi asal).

jangan jadi root

Jangan bekerja sebagai root kecuali benar-benar perlu.

proteksi file-file penting

Untuk melindungi lokasi penting seperti /usr/bin Anda dapat memisahkan /usr ke partisi terpisah lalu me-mount-nya read-only. Atau Anda juga bisa melakukan chattr +i pada file-file sistem penting. Kedua cara ini memberikan perlindungan ekstra, tapi juga merepotkan proses instalasi/uninstalasi aplikasi.

jangan kerja selagi mengantuk

Terakhir tapi tak kalah penting: jangan bekerja selagi capek atau mengantuk. Bekerja selagi capek atau bekerja terlalu panjang dalam satu waktu bukan hanya tidak produktif, tapi juga bisa menghasilkan kerja negatif, misalnya menghapus atau mengacaukan kerjaan-kerjaan sebelumnya. Salah satunya dengan kecelakaan penggunaan rm. Jadi, jika capek atau mengantuk, istirahat dululah!

Komentar atau masukan ke <steven@masterweb.net>.

Resita has written 705 articles