Pertanyaan Mengapa perintah ": () {: |: &} ;:" membuat sistem saya sangat macet sehingga saya harus reboot?


BAHAYA!

Jangan menjalankan perintah ini untuk 'mengujinya' kecuali Anda siap untuk crash dan / atau memaksa-reboot sistem Anda.

Saya berada di VirtualBox saya menjalankan 12.04 mencoba untuk menyusun aplikasi, dan sambil menunggu saya kebetulan pada sebuah forum di mana komentar mengatakan:

Mencoba :(){ :|: & };:
  Asyik juga, dan tidak perlu root.

Tanpa berpikir, saya menjalankannya di terminal gnome saya. Itu membuat 12.04 (di VirtualBox) saya sangat tertinggal, saya harus mematikannya.

Pertanyaan saya adalah apa yang dilakukan perintah ini?

:(){ :|: & };:

272
2017-07-04 11:29


asal


terkait Bagaimana melindungi Ubuntu dari bom fork - Sathya
Lihat juga utas lama: ubuntuforums.org/showthread.php?t=1392511 - Paddy Landau
Terkait: Bagaimana cara kerja bom garpu? dan Di mana garpu () di fork bomb: () {: |: &};:? - terdon♦
kemungkinan duplikat lintas situs: stackoverflow.com/questions/515844/… - Ciro Santilli 新疆改造中心 六四事件 法轮功
"lag sangat buruk" cukup optimis. - pstadler


Jawaban:


Ini disebut a bom fork.

:() berarti Anda mendefinisikan fungsi yang disebut :

{:|: &} berarti menjalankan fungsi : dan mengirim hasilnya ke : berfungsi lagi dan jalankan itu di latar belakang.

Itu ; adalah pemisah perintah, seperti &&.

: menjalankan fungsi untuk pertama kalinya.

Pada dasarnya Anda membuat fungsi yang memanggil dirinya dua kali setiap panggilan dan tidak memiliki cara untuk mengakhiri sendiri. Ini akan terus berlipat ganda hingga Anda kehabisan sumber daya sistem.

Menjalankan di VirtualBox cukup masuk akal jika tidak Anda harus me-restart komputer Anda.


345
2017-07-04 11:34



Jawaban ini tampaknya menunjukkan bahwa me-reboot adalah hanya jalan lain. Tetapi sebenarnya bom fork ini dapat dibunuh tanpa reboot, dan saya benar-benar mengamati bahwa bom tersebut tidak berfungsi dengan baik pada beberapa sistem (karena batas bertelur mereka diatur dengan tepat). - Konrad Rudolph
Sebenarnya, untuk penjelasan lengkap ini mungkin harus menyebutkan itu ; adalah pemisah perintah. Itu { ... } bagian hanyalah isi dari fungsi. - Michael Kjörling
@ MichaelKjörling +1 Saya bahkan tidak mengerti sintaksnya sampai saya mempertimbangkan komentar Anda. - jumpnett
@SuperMatt Saya tidak tahu apakah pertanyaan ini masih aktif, tetapi saya ingin tahu apa yang terjadi | dan & melakukan. Saya mengerti Anda telah menyediakan fungsi itu tetapi saya ingin tahu apa yang dilakukan kedua orang ini - Noober
@Noober jika Anda masih bertanya-tanya (seperti saya di lubang hitam dokumentasi singkat dan rahasia yang linux) saya tahu! | adalah sebuah pipa yang diletakkan setelah perintah untuk mengirim perintah output sebagai input ke perintah yang mengikuti. & fork itu membuat utas baru untuk perintah sebelumnya yang meninggalkan utas saat ini untuk melanjutkan mengeksekusi lebih banyak perintah - flurbius


Ini disebut bom fork diimplementasikan dalam shell.

dari wikipedia:

:(){ :|:& };:
\_/| |||| ||\- ... the function ':', initiating a chain-reaction: each ':' will start    two more.
 | | |||| |\- Definition ends now, to be able to run ...
 | | |||| \- End of function-block
 | | |||\- disown the functions (make them a background process), so that the children    of a parent
 | | |||   will not be killed when the parent gets auto-killed
 | | ||\- ... another copy of the ':'-function, which has to be loaded into memory.
 | | ||   So, ':|:' simply loads two copies of the function, whenever ':' is called
 | | |\- ... and pipe its output to ...
 | | \- Load a copy of the function ':' into memory ...
 | \- Begin of function-definition
 \- Define the function ':' without any parameters '()' as follows:

161
2017-07-04 11:35



Meskipun ini adalah titik tangensial dan istilah 'disown' mungkin kelebihan beban, secara teknis, sebuah proses yang dimasukkan ke latar belakang tidak tidak diakui dan selalu dapat dibawa ke latar depan dengan perintah 'fg', dan proses akan berakhir jika pengguna logout (jika masih ada sumber daya yang tersedia untuk menyelesaikan logout) .... kecuali kalau dan sampai seseorang menjalankan 'memungkiri' pada proses atau pekerjaan itu. Setelah itu memang tidak diakui: logout tidak akan berhenti dan fg tidak berpengaruh. - Rondo
Meskipun hanya titik kecil, tanda kurung tidak berarti tidak ada parameter dalam cangkang mirip bash, hanya hiasan yang tersisa dari bahasa C-style. - Charlie Harding


Perintah itu adalah versi yang terkenal bom fork

fork bomb pic from wikipedia

Ini menyebabkan komputer Anda kehabisan memori dengan menggunakan proses tanpa batas. Ada beberapa perlindungan yang bisa Anda gunakan untuk melawannya juga:

Sistem tipe Unix biasanya memiliki batas proses, yang dikendalikan oleh perintah shell ulimit atau penerusnya, setrlimit. Kernel Linux mengatur dan menegakkan RLIMIT_NPROC rlimit ("batas sumber daya") dari suatu proses. Jika sebuah proses mencoba melakukan fork dan pengguna yang memiliki proses itu sudah memiliki RLIMIT_NPROC proses, maka garpu gagal. Selain itu, di Linux atau * BSD, seseorang dapat mengedit pam_limits file konfigurasi /etc/security/limits.conf untuk efek yang sama. Namun, tidak semua distribusi Linux memiliki pam_limits modul terinstal secara default.


70
2017-07-04 11:37





Menurut ini  :(){ :|: & };: disebut

Forkbomb adalah semacam pencipta virus puitis

... Program kecil licik memerintahkannya untuk membuat banyak salinan   itu sendiri, memulai reaksi berantai dan dengan demikian cepat melelahkan   sumber daya sistem ...

Jadi disarankan untuk tidak menjalankan ini, dapat menyebabkan kerusakan pada perangkat keras karena menyebabkan eksekusi loopwise, dapat menyebabkan pemanasan dengan mudah di laptop.

Tautan lain menjelaskan melalui tangkapan layar sini.


18
2017-07-04 11:35



Jika penyebab bom garpu kerusakan perangkat keras, maka Anda memiliki masalah yang jauh lebih besar dan lebih dalam. - Michael Kjörling
Mungkin dia berbicara tentang bom dengan bentuk garpu yang dapat meledak di dekat PC Anda? - dysoco
Tautan untuk tangkapan layar rusak. - IMustBeSomeone