Pourquoi la commande “: () {: |: &} ;:” a-t-elle tellement retardé mon système que j'ai dû redémarrer?


286

DANGER!

N'exécutez pas cette commande pour la "tester" sauf si vous êtes préparé à un crash et / ou à un redémarrage forcé du système.

J'étais dans ma Virtualbox en train d'exécuter 12.04 pour essayer de compiler une application, et en attendant, je suis tombé par hasard sur un forum où un commentaire disait:

Essayez :(){ :|: & };:
Fun, aussi, et n'avez pas besoin de root.

Sans réfléchir, je l'ai couru dans mon gnome-terminal. Cela a tellement retardé mon 12.04 (dans Virtualbox) que j'ai dû l'éteindre.

Ma question est qu'est-ce que cette commande fait?

: () {: |: &} ;:



1
Voir aussi un ancien fil de discussion: ubuntuforums.org/showthread.php?t=1392511
Paddy Landau


duplication possible sur plusieurs sites de: stackoverflow.com/questions/515844/…
Ciro Santilli a publié le 21/08

9
"lag so badly" est plutôt optimiste.
pstadler

Réponses:


372

Ceci s'appelle une bombe de fourche .

:() signifie que vous définissez une fonction appelée :

{:|: &}signifie exécuter la fonction :et envoyer sa sortie à la :fonction à nouveau et l'exécuter en arrière-plan.

L' ;est un séparateur de commande.

: exécute la fonction la première fois.

En gros, vous créez une fonction qui s'appelle deux fois par appel et n'a aucun moyen de se terminer. Il continuera à doubler jusqu'à ce que vous manquiez de ressources système.

Exécuter dans Virtualbox était très judicieux, sinon vous auriez dû redémarrer votre ordinateur.


27
Cette réponse semble indiquer que le redémarrage est le seul recours. Mais en fait, cette fourche piégée peut être tuée sans redémarrage, et j’ai en fait observé que cela ne fonctionnait pas correctement sur certains systèmes (car leur limite de réapparition est définie de manière raisonnable).
Konrad Rudolph

27
En fait, pour une explication complète, cela devrait probablement mentionner qu’il ;s’agit d’un séparateur de commandes. La { ... }partie est simplement le contenu de la fonction.
un CVn

@ MichaelKjörling +1 Je n'ai même pas compris la syntaxe avant de prendre en compte vos commentaires.
Jumpnett

1
@SuperMatt Je ne sais pas si cette question est toujours d'actualité, mais je voulais quand même savoir ce qui se passe |et ce qu'il &fait. Je comprends que vous ayez assuré le fonctionnement de la fonction mais je voulais savoir ce que font ces deux-là
Noober le

1
@Noober si vous vous posez encore des questions (comme je le suis dans ce trou noir de la documentation laconique et cryptique de Linux), je le sais! | est un tuyau qui est placé après une commande pour envoyer cette commande en sortie comme entrée de la commande suivante. & est un fork, il crée un nouveau thread pour la commande précédente, laissant le thread actuel pour continuer à exécuter plus de commandes
flurbius

179

Ceci est une soi-disant bombe à fourche mise en œuvre dans un shell.

de 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
Bien que ce soit un point tangentiel et que le terme 'désavoué' puisse être surchargé, techniquement, un processus mis en arrière-plan n'est pas désavoué et peut toujours être mis au premier plan à l'aide de la commande 'fg', et le ou les processus s'interrompront si l'utilisateur se déconnecte (s'il reste des ressources disponibles pour effectuer une déconnexion) ... sauf si et jusqu'à ce que l'une d'entre elles soit exécutée sur le processus ou l'ID de travail. Après cela, il est effectivement désavoué: la déconnexion ne se termine pas et fg n’a aucun effet.
Rondo

1
Bien qu'il ne s'agisse que d'un point mineur, les parenthèses ne signifient pas qu'il n'y a pas de paramètres dans les coquilles de type bash, elles ne sont que des décors laissés par les langages de style C.
Charlie Harding

75

Cette commande est une version bien connue de la bombe à la fourche

photo de bombe de wikipedia

Cela entraîne un manque de mémoire sur votre ordinateur en forçant un processus à l'infini. Il existe certaines garanties que vous pouvez également utiliser contre cela:

Les systèmes de type Unix ont généralement une limite de processus, contrôlée par une commande shell ulimit ou son successeur, setrlimit. Les noyaux Linux définissent et appliquent le RLIMIT_NPROC rlimit ("limite de ressources") d'un processus. Si un processus tente d'effectuer un fork et que l'utilisateur propriétaire de ce processus possède déjà des RLIMIT_NPROCprocessus, le fork échoue. De plus, sous Linux ou * BSD, le pam_limitsfichier de configuration peut être modifié /etc/security/limits.confdans le même sens. Cependant, le pam_limitsmodule n'est pas installé par défaut dans toutes les distributions de Linux .


18

Selon cela :(){ :|: & };: s'appelle

Forkbomb est une sorte de créateur de virus poétique

... Le petit programme sournois lui ordonne de faire plusieurs copies de lui-même, déclenchant une réaction en chaîne et épuisant ainsi rapidement les ressources du système ...

Il est donc conseillé de ne pas l'exécuter, cela risquerait d'endommager le matériel, car cela provoquerait une exécution en boucle, pourrait provoquer un échauffement facile des ordinateurs portables.

Un autre lien explique à travers les captures d'écran ici .


59
Si une bombe à fourche endommage le matériel , le problème est beaucoup plus grave et plus profond.
un CVn

38
Peut-être parlait-il d’une bombe en forme de fourche pouvant exploser près de votre PC?
Dysoco

2
Le lien pour la capture d'écran est cassé.
IMustBeSomeone

0

Comme on l'explique ci-dessus, il s'agit d'une « bombe à la fourchette ». Une autre façon de procéder consiste à utiliser une exécution en arrière-plan plutôt que des canalisations:

:(){ :&:;};:
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.