Mengapa perintah “: () {: |: &} ;:” membuat sistem saya sangat buruk sehingga saya harus reboot?

286

BAHAYA!

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

Saya berada di Virtualbox saya menjalankan 12,04 mencoba untuk mengkompilasi aplikasi, dan sambil menunggu saya kebetulan kebetulan di sebuah forum di mana komentar mengatakan:

Coba :(){ :|: & };:
Fun juga, dan tidak perlu root.

Tanpa pikir panjang, saya menjalankannya di terminal gnome saya. Itu membuat 12,04 saya (dalam Virtualbox) sangat buruk, saya harus mematikannya.

Pertanyaan saya adalah apa yang dilakukan perintah ini?

: () {: |: &} ;:

blade19899
sumber
36
terkait Bagaimana melindungi Ubuntu dari bom fork
Sathyajith Bhat
1
Lihat juga utas lama: ubuntuforums.org/showthread.php?t=1392511
Paddy Landau
kemungkinan duplikat lintas situs: stackoverflow.com/questions/515844/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
9
"lag sangat buruk" cukup optimis.
pstadler

Jawaban:

372

Ini disebut bom fork .

:() berarti Anda mendefinisikan fungsi yang disebut :

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

Ini ;adalah pemisah perintah.

: menjalankan fungsinya pertama kali.

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

Menjalankan di Virtualbox cukup masuk akal jika tidak Anda harus me-restart pc Anda.

SuperMatt
sumber
27
Jawaban ini tampaknya menunjukkan bahwa me-reboot adalah satu - satunya jalan. Tetapi pada kenyataannya bom fork ini dapat dibunuh tanpa me-reboot, dan saya telah benar-benar mengamati bahwa itu tidak bekerja dengan baik pada beberapa sistem (karena batas spawn mereka diatur secara masuk akal).
Konrad Rudolph
27
Sebenarnya, untuk penjelasan lengkap ini mungkin harus menyebutkan bahwa itu ;adalah pemisah perintah. Bagian { ... }ini hanyalah isi dari fungsi.
CVn
@ MichaelKjörling +1 Saya bahkan tidak mengerti sintaksis sampai saya mempertimbangkan komentar Anda.
jumpnett
1
@SuperMatt Saya tidak tahu apakah pertanyaan ini masih aktif, tetapi saya ingin tahu apa yang dilakukan |dan &dilakukan. Saya mengerti Anda telah menyediakan fungsi ini tetapi saya ingin tahu apa yang mereka berdua lakukan
Noober
1
@Noober jika Anda masih bertanya-tanya (seperti saya di dalam lubang hitam dokumentasi singkat dan samar yang merupakan linux) Saya tahu! | adalah pipa yang diletakkan setelah perintah untuk mengirim output perintah sebagai input ke perintah yang mengikuti. & is a fork, ia membuat utas baru untuk perintah sebelumnya dan meninggalkan utas saat ini untuk terus mengeksekusi lebih banyak perintah
flurbius
179

Ini adalah bom fork yang disebut 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:
Michał Šrajer
sumber
3
Meskipun ini adalah titik tangensial dan istilah 'disown' mungkin kelebihan beban, secara teknis, proses yang diletakkan di latar belakang tidak ditolak dan selalu dapat dibawa ke latar depan dengan perintah 'fg', dan proses tersebut akan berakhir jika pengguna logout (jika masih ada sumber daya yang tersedia untuk menyelesaikan logout) .... kecuali dan sampai seseorang menjalankan 'penolakan' pada proses atau jobid. Setelah itu memang tidak diakui: logout tidak akan berakhir dan fg tidak berpengaruh.
Rondo
1
Meskipun ini hanya titik kecil, tanda kurung tidak berarti tidak ada parameter dalam shell seperti bash, mereka hanya hiasan yang tersisa dari bahasa C-style.
Charlie Harding
75

Perintah itu adalah versi terkenal dari bom fork

garpu bom fork dari wikipedia

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

Sistem tipe unix biasanya memiliki batas proses, dikendalikan oleh perintah shell ulimit atau penggantinya, setrlimit. Kernel Linux mengatur dan menegakkan RLIMIT_NPROC rlimit ("batas sumber daya") dari suatu proses. Jika suatu proses mencoba melakukan garpu dan pengguna yang memiliki proses itu sudah memiliki RLIMIT_NPROCproses, maka garpu tersebut gagal. Selain itu, di Linux atau * BSD, orang dapat mengedit pam_limitsfile konfigurasi /etc/security/limits.confdengan efek yang sama. Namun, tidak semua distribusi Linux memiliki pam_limitsmodul yang diinstal secara default.

Nemo
sumber
18

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

Forkbomb adalah sejenis pencipta virus puitis

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

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

Tautan lain menjelaskan melalui tangkapan layar di sini .

atenz
sumber
59
Jika bom fork menyebabkan kerusakan perangkat keras , maka Anda memiliki masalah yang jauh lebih besar dan lebih dalam.
CVn
38
Mungkin dia sedang berbicara tentang bom dengan bentuk garpu yang bisa meledak di dekat PC Anda?
dysoco
2
Tautan untuk tangkapan layar rusak.
IMustBeSomeone
0

Ini disebut " bom fork ", seperti yang dijelaskan di atas, dan cara lain untuk melakukan ini adalah dengan menggunakan eksekusi latar belakang daripada pipa:

:(){ :&:;};:
karlsebal
sumber