Mengapa skrip berikut menghapusnya sendiri?


84

Jika Anda membuat file yang dapat dieksekusi dengan konten berikut, dan menjalankannya, itu akan menghapus dirinya sendiri.
Bagaimana cara kerjanya?

#!/bin/rm


@DigitalTrauma Heh, itu adalah pikiran pertama saya ketika saya melihat ini.
— kucing

ini bukan tentang rm, ini tentang #!. Pertanyaannya dapat diulang kembali menjadi bagaimana cara kerja skrip yang dapat dieksekusi dengan sebuah #!karya.
— njzk2

1
Bagaimana Anda bisa menemukan ini?
— user1717828

1
Itu pasti pertanyaan epik. Saya menyesal bahwa saya dapat membenarkan itu hanya sekali.
— Danila Kiver

Jawaban:


112

Kernel menginterpretasikan baris yang dimulai dengan #!dan menggunakannya untuk menjalankan skrip, meneruskan nama skrip; jadi ini akhirnya berjalan

/bin/rm scriptname

yang menghapus skrip. (Sebagai Stéphane Chazelas menunjukkan , scriptnamedi sini adalah cukup untuk menemukan script - jika Anda tentukan path relatif atau absolut, yang disahkan pada as-adalah, jika tidak jalan apa pun yang ditemukan di PATHprepended, termasuk mungkin emptry string jika Anda PATHmengandung itu dan skrip ada di direktori saat ini. Anda dapat bermain-main dengan skrip gema - #!/bin/echo- untuk melihat bagaimana ini bekerja.)

Seperti yang ditunjukkan oleh hobbs , ini berarti skrip Anda sebenarnya adalah rmskrip, bukan bashskrip - skrip akan dimulai dengan #!/bin/bash.

Lihat Bagaimana program dijalankan untuk detail tentang bagaimana ini bekerja di Linux; komentar pada artikel itu memberikan detail untuk platform lain. #!disebut shebang, Anda akan menemukan banyak informasi dengan mencari istilah itu (terima kasih kepada Aaron untuk sarannya). Seperti yang ditunjukkan jlp , Anda juga akan menemukannya disebut sebagai "pound bang" atau "hash bang" ( #umumnya dikenal sebagai "pound" - di negara-negara yang tidak menggunakan £- atau "hash", dan !sebagai "bang") ). Wikipedia memiliki lebih banyak informasi.


9
Nama lain untuk "#!" Anda mungkin mendengar "pound bang" dan "hash bang". Lihat en.wikipedia.org/wiki/Shebang_(Unix) untuk detailnya.
— jlp

@ jlp Pound bang? Apakah itu seperti "bang for your buck"? Heh ...
— cat

Mengingatkan saya pada ol ' CrunchBang
— Xen2050

1
Secara teknis, argumen untuk rmakan menjadi jalan menuju skrip, yaitu argumen pertama ke panggilan sistem execve () yang dibuat oleh proses. Biasanya, jika Anda menjalankan skrip sebagai ./scriptname, itu akan menjadi ./scriptnamedan jika Anda memanggilnya scriptname, itu akan menjadi /path/to/scriptnametempat /path/toentri di $PATHmana skrip itu ditemukan. Biasanya, hanya dengan scriptnamejika Anda memiliki string kosong $PATHdan Anda telah memanggil skrip sebagai scriptnamedan scriptnameada di direktori saat ini.
— Stéphane Chazelas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.