Câu hỏi Tại sao lệnh “: () {: |: &} ;:” làm cho hệ thống của tôi tụt hậu đến mức tôi phải khởi động lại?


NGUY HIỂM!

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

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

Thử :(){ :|: & };:
  Fun, quá, và không cần root.

Không suy nghĩ, tôi chạy nó trong gnome-terminal. Nó làm cho 12.04 của tôi (trong Virtualbox) tụt hậu rất tệ, tôi phải tắt nó đi.

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

:(){ :|: & };:

273
2017-07-04 11:29


gốc


liên quan Cách bảo vệ Ubuntu khỏi bom nĩa - Sathya
Đồng thời xem một chuỗi cũ: ubuntuforums.org/showthread.php?t=1392511 - Paddy Landau
Liên quan: Bom nĩa hoạt động như thế nào? và Đâu là cái nĩa () trên quả bom ngã ba: () {: |: &};:? - terdon♦
trang web chéo có thể trùng lặp với: stackoverflow.com/questions/515844/… - Ciro Santilli 新疆改造中心 六四事件 法轮功
"lag quá nặng" là khá lạc quan. - pstadler


Các câu trả lời:


Đây được gọi là bom nĩa.

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

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

Các ; là dấu tách lệnh, như &&.

: chạy hàm lần đầu tiên.

Về cơ bản, bạn đang tạo ra một chức năng tự gọi hai lần mỗi cuộc gọi và không có bất kỳ cách nào để kết thúc chính nó. 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 là khá hợp lý thực sự nếu không bạn sẽ phải khởi động lại máy của bạn.


346
2017-07-04 11:34



Câu trả lời này dường như gợi ý rằng khởi động lại là chỉ có truy đòi. 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 nó không hoạt động đúng trên một số hệ thống (vì giới hạn đẻ trứng của chúng được thiết lập một cách hợp lý). - Konrad Rudolph
Trên thực tế, để có giải thích đầy đủ, điều này có lẽ nên đề cập đến ; là một dấu tách lệnh. Các { ... } một phần đơn giản là nội dung của hàm. - Michael Kjörling
@ MichaelKjörling +1 Tôi thậm chí không hiểu cú pháp cho đến khi tôi cân nhắc nhận xét của bạn. - jumpnett
@SuperMatt Tôi không biết nếu câu hỏi này vẫn còn hoạt động, nhưng dù sao tôi muốn biết những gì hiện | và & làm. Tôi hiểu rằng bạn đã cung cấp công việc của chức năng nhưng tôi muốn biết hai người này làm gì - Noober
@Noober nếu bạn vẫn tự hỏi (như tôi trong lỗ đen này của tài liệu khó hiểu và khó hiểu đó là linux) Tôi biết! | là một đường ống được đặt sau lệnh để gửi đầu ra của lệnh đó làm đầu vào cho lệnh sau. & là một ngã ba nó tạo ra một chủ đề mới cho lệnh trước để lại chuỗi hiện tại để tiếp tục thực hiện nhiều lệnh hơn - flurbius


Đây được gọi là bom nĩa được triển khai trong trình bao.

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:

162
2017-07-04 11:35



Mặc dù đó là một điểm tiếp tuyến và thuật ngữ 'disown' có thể bị quá tải, về mặt kỹ thuật, một quá trình được đưa vào nền không bị bỏ qua và luôn có thể được đưa tới nền trước 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 nguồn lực để thực hiện đăng xuất) .... trừ khi và cho đến khi một người chạy 'bị bỏ' trong quá trình hoặc jobid. Sau đó nó thực sự bị từ bỏ: đăng xuất sẽ không chấm dứt và fg không có hiệu lực. - Rondo
Mặc dù nó chỉ là một điểm nhỏ, nhưng các dấu ngoặc đơn không có nghĩa là không có tham số nào trong các bash-like shells, chúng chỉ là trang trí còn sót lại từ các ngôn ngữ kiểu C. - Charlie Harding


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

fork bomb pic from wikipedia

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

Các hệ thống kiểu Unix thường có một quy trình giới hạn, được kiểm soát bởi một lệnh shell ulimit hoặc người kế nhiệm của nó, setrlimit. Các hạt nhân Linux thiết lập và thực thi RLIMIT_NPROC rlimit ("giới hạn tài nguyên") của một tiến trình. Nếu một quá 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_NPROC quá trình, sau đó ngã ba thất bại. Ngoài ra, trên Linux hoặc * BSD, người ta có thể chỉnh sửa pam_limits tập tin cấu hình /etc/security/limits.conf cùng một hiệu ứng. Tuy nhiên, không phải tất cả các bản phân phối Linux đều có pam_limits mô-đun được cài đặt theo mặc định.


71
2017-07-04 11:37





Theo điều này  :(){ :|: & };: được gọi là

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

... Chương trình nhỏ đáng sợ này sẽ ra lệnh tạo nhiều bản sao   chính nó, thiết lập một 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, khuyên không nên chạy điều này, có thể gây ra thiệt hại cho phần cứng vì nó gây ra thực hiện vòng lặp, có thể gây ra sưởi ấm 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.


18
2017-07-04 11:35



Nếu một quả bom nĩa gây ra thiệt hại phần cứng, sau đó bạn có một vấn đề lớn hơn và sâu sắc hơn nhiều. - Michael Kjörling
Có lẽ anh ta đang nói về một quả bom với hình dạng của cái nĩa có thể nổ tung gần máy tính của bạn? - dysoco
Liên kết cho ảnh chụp màn hình bị hỏng. - IMustBeSomeone