Artikel:Tragedi rm
[draft artikel infolinux]
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.
Anda ingin mencari ulang sebelumnya dengan tombol panah atas dan bawah
keyboard. 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 revert untuk 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>.
Komentar pembaca cara membuat recycle bin sendiri di linux (alex, alamat IP dan email tercatat, 2008-04-15 16:40:49)mas...
gimana sih cara membuat recycle bin sendiri di linux?
gimana caranya memberi expired file di recycle bin di linux? (jadi kalo dah expired file tsb terhapus dengan sendirinya)
TOLONG yach MAS....
nb. please email me..
Re: cara membuat recycle bin sendiri di linux (Steven Haryanto, alamat IP dan email tercatat, 2008-04-16 18:43:28)di desktop seperti KDE, GNOME, dll biasanya ada sistem recycle bin atau Trash (mis: ditaruh di ~/.Trash). utk memberi expired, setahu saya gak ada opsinya, tapi bisa dilakukan sendiri misalnya dengan perintah "/usr/sbin/tmpreaper ~/.Trash" atau semacamnya.
|
|