Tại sao lệnh Lát: () {: |: &};: Làm cho hệ thống của tôi bị lag rất nặng, tôi phải khởi động lại?


286

NGUY HIỂM!

Không chạy lệnh này để 'kiểm tra' nó trừ khi bạn chuẩn bị cho sự cố và / hoặc buộc khởi động lại hệ thống của bạn.

Tôi đã ở trong Virtualbox của mình chạy 12.04 khi cố gắng biên dịch một ứng dụng và trong khi chờ đợi, tôi tình cờ gặp một diễn đàn nơi một bình luận cho biết:

Hãy thử :(){ :|: & };:
Vui vẻ, và không cần root.

Không cần suy nghĩ, tôi chạy nó trong gnome-terminal của mình. Nó làm cho 12.04 (trong Virtualbox) của tôi bị lag rất nhiều, tôi phải tắt nó đi.

Câu hỏi của tôi là lệnh này làm gì?

: () {: |: &};:



1
Cũng xem một chủ đề cũ: ubuntuforums.org/showthread.php?t=1392511
Paddy Landau


trang web chéo có thể trùng lặp của: stackoverflow.com/questions/515844/ Từ
Ciro Santilli 改造 心 心 事件

9
"lag quá tệ" là khá lạc quan.
pstadler

Câu trả lời:


372

Đây được gọi là bom ngã ba .

:() có nghĩa là bạn đang xác định một hàm được gọi là :

{:|: &}có nghĩa là chạy chức năng :và gửi đầu ra của nó cho :chức năng một lần nữa và chạy nó trong nền.

Đây ;là một dấu phân cách lệnh.

: chạy chức năng lần đầu tiên.

Về cơ bản, bạn đang tạo một hàm tự gọi hai lần mỗi cuộc gọi và không có cách nào tự chấm dứt. Nó sẽ tiếp tục tăng gấp đôi cho đến khi bạn hết tài nguyên hệ thống.

Chạy trong Virtualbox thực sự khá hợp lý nếu không bạn sẽ phải khởi động lại máy tính của mình.


27
Câu trả lời này dường như gợi ý rằng khởi động lại là cách duy nhất . Nhưng trên thực tế, quả bom nĩa này có thể bị giết mà không cần khởi động lại, và tôi thực sự đã quan sát thấy rằng nó không hoạt động đúng trên một số hệ thống (vì giới hạn sinh sản của chúng được đặt hợp lý).
Konrad Rudolph

27
Trên thực tế, để giải thích đầy đủ, điều này có lẽ nên đề cập đến đó ;là một dấu phân cách lệnh. Phần { ... }đơn giản là nội dung của hàm.
một CVn

@ MichaelKjorling +1 Tôi thậm chí không hiểu cú pháp cho đến khi tôi xem xét nhận xét của bạn.
jumpnett

1
@SuperMatt Tôi không biết câu hỏi này có còn hoạt động không, nhưng dù sao tôi cũng muốn biết những gì làm |&làm. Tôi hiểu rằng bạn đã cung cấp chức năng hoạt động nhưng tôi muốn biết hai người này làm gì
Noober

1
@Noober nếu bạn vẫn đang tự hỏi (như tôi trong lỗ đen của tài liệu ngắn gọn và khó hiểu đó là linux) Tôi biết! | là một đường ống, nó được đặt sau một lệnh để gửi đầu ra lệnh đó làm đầu vào cho lệnh tiếp theo. & là một ngã ba, nó tạo ra một luồng mới cho lệnh trước đó để lại luồng hiện tại để tiếp tục thực thi nhiều lệnh hơn
flurbius

179

Đây là một cái gọi là bom ngã ba được thực hiện trong vỏ.

từ 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:

3
Mặc dù đó là một điểm tiếp tuyến và thuật ngữ 'từ chối' có thể bị quá tải, nhưng về mặt kỹ thuật, một quy trình được đặt trong nền không bị từ chối và luôn có thể được đưa lên tiền cảnh bằng lệnh 'fg' và quá trình sẽ chấm dứt nếu người dùng đăng xuất (nếu vẫn còn tài nguyên để hoàn thành đăng xuất) .... trừ khi và cho đến khi một người chạy 'disown' trên tiến trình hoặc jobid. Sau đó, nó thực sự bị từ chối: đăng xuất sẽ không chấm dứt và fg không có hiệu lực.
Rondo

1
Mặc dù đó chỉ là một điểm nhỏ, nhưng dấu ngoặc đơn không có nghĩa là không có tham số trong các vỏ giống như bash, chúng chỉ là trang trí còn sót lại từ các ngôn ngữ kiểu C.
Charlie Harding

75

Lệnh đó là một phiên bản nổi tiếng của bom ngã ba

pic bom ngã ba từ wikipedia

Nó làm cho máy tính của bạn hết bộ nhớ bằng cách vô hiệu hóa một quá trình. Có tồn tại một số biện pháp bảo vệ bạn cũng có thể sử dụng để chống lại nó:

Các hệ thống kiểu Unix thường có giới hạn quy trình, được điều khiển bởi lệnh shell ulimit hoặc người kế thừa của nó, setrlimit. Các hạt nhân Linux đã thiết lập và thi hành RLIMIT_NPROC rlimit ("giới hạn tài nguyên") của một quy trình. Nếu một quy trình cố gắng thực hiện một ngã ba và người dùng sở hữu quy trình đó đã sở hữu RLIMIT_NPROCcác quy trình đó, thì ngã ba đó sẽ thất bại. Ngoài ra, trên Linux hoặc * BSD, người ta có thể chỉnh sửa pam_limitstệp cấu hình /etc/security/limits.confđể có hiệu lực tương tự. Tuy nhiên, không phải tất cả các bản phân phối của Linux đều có pam_limitscài đặt mô-đun theo mặc định.


18

Theo đó :(){ :|: & };: được gọi là

Forkbomb là một loại người tạo ra virus thơ

... Chương trình nhỏ lệch lạc ra lệnh cho nó tạo ra nhiều bản sao của chính nó, tạo ra phản ứng dây chuyền và do đó nhanh chóng làm cạn kiệt tài nguyên của hệ thống ...

Vì vậy, không nên chạy cái này, có thể gây hư hỏng cho phần cứng vì nó gây ra sự thực thi theo vòng lặp, có thể gây nóng dễ dàng trong máy tính xách tay.

Một liên kết khác giải thích thông qua ảnh chụp màn hình ở đây .


59
Nếu một quả bom ngã ba gây ra thiệt hại phần cứng , thì bạn có một vấn đề lớn hơn và sâu hơn nhiều.
một CVn

38
Có lẽ anh ta đang nói về một quả bom có ​​hình nĩa có thể phát nổ gần PC của bạn?
dysoco

2
Liên kết cho ảnh chụp màn hình bị hỏng.
IMustBeSomeone

0

Nó được gọi là một chiếc nĩa ném bom khác , như đã giải thích ở trên, và một cách khác để làm điều này là sử dụng thực thi nền thay vì đường ống:

:(){ :&:;};:
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.