저는 Alpine Linux에서 작업 중인데 쉘의 다음 동작을 이해할 수 없습니다 sh
.
/ # vsftpd /etc/vsftpd/vsftpd.conf > /dev/null
500 OOPS: bad bool value in config file for: hide_ids
/ # vsftpd /etc/vsftpd/vsftpd.conf 2> /dev/null
500 OOPS: bad bool value in config file for: hide_ids
메시지는 어디에 인쇄되나요? 예 stdout
, 아니면 stderr
?
답변1
소스는 vsftpd
상수를 VSFTP_COMMAND_FD
숫자 0으로 정의합니다. 이것은 잘못된 파일 설명자가 쓰여진 것입니다.
$ grep -F VSFTP_COMMAND_FD defs.h
#define VSFTP_COMMAND_FD 0
아무리 이상해 보일지라도 코드는 표준에 오류 메시지를 쓰고 있습니다.입력하다개울.
void
bug(const char* p_text)
{
/* Rats. Try and write the reason to the network for diagnostics */
vsf_sysutil_activate_noblock(VSFTP_COMMAND_FD);
(void) vsf_sysutil_write_loop(VSFTP_COMMAND_FD, "500 OOPS: ", 10);
(void) vsf_sysutil_write_loop(VSFTP_COMMAND_FD, p_text,
vsf_sysutil_strlen(p_text));
(void) vsf_sysutil_write_loop(VSFTP_COMMAND_FD, "\r\n", 2);
vsf_sysutil_exit(2);
}
시험:
$ ./vsftpd >/dev/null
500 OOPS: vsftpd: must be started as root (see run_as_launching_user option)
$ ./vsftpd 2>/dev/null
500 OOPS: vsftpd: must be started as root (see run_as_launching_user option)
$ ./vsftpd </dev/null
$
따라서 /dev/null
응용 프로그램으로 리디렉션하면 오류가 제거됩니다. 또한 이를 사용하여 0>/dev/null
애플리케이션이 해당 특정 파일 설명자로 보낸 출력을 삭제하려는 의도를 나타낼 수도 있습니다.
답변2
vsftpd
inetd
일반적으로 클라이언트의 TCP 명령 소켓인 fd 0(stdin)을 통해 호출됩니다 .
여기에 상태 메시지가 기록됩니다.
다음을 수행할 수 있습니다.
vsftpd configfile < /dev/null
유용한 일을 하게 두기보다는 사라지게 만드세요.
답변3
첫째, 메시지가 셸에서 나오지 않습니다. hide_ids
은 쉘 구성 옵션이 아닌 vsftpd 구성 옵션이므로 쉘이 이를 참조하는 모든 것을 인쇄할 것이라고 가정할 이유가 없습니다. (예, 차이가 있으며 중요합니다.)
둘째, vsftpd가 시작될 때 stdout과 stderr이 모두 리디렉션되고 /dev/null
여전히 표시되므로 메시지가 다음으로 인쇄된다고 가정해야 합니다.어느 것도 아니다.
/dev/tty
일부 유틸리티는 일반적으로 가능한 리디렉션을 방해하지 않고 사용자 상호 작용이 필요한 작업을 수행하기 위해 현재 터미널에 대한 새 핸들을 명시적으로 열어 이를 수행합니다 . 이는 stdout과 stderr이 모두 리디렉션되더라도 SSH 클라이언트가 비밀번호를 묻는 방식입니다.
그러나 여기서도 그렇지 않습니다. ~처럼쿠사라난다가 대답했다., vsftpd는 fd 명령( VSFTP_COMMAND_FD
소스 코드에 지정됨)에 치명적인 오류를 인쇄합니다. 아마도 동일한 fd를 사용하여 명령을 읽는 것으로 추정되며 fd 0으로 정의됩니다.표준 입력. 모든 stdin, stdout 및 stderr은 일반적으로 읽기 및 쓰기용으로 열리므로 이는 작동합니다. Linux에서는 /proc/<pid>/fd
정상적으로 시작되는 프로세스에 대한 진입 권한을 보면 이를 확인할 수 있습니다. 가장 간단한 방법은 다음과 같습니다 ls
.
$ ls -l /proc/self/fd
total 0
lrwx------ 1 ilkkachu ilkkachu 64 Jan 1 13:54 0 -> /dev/pts/18
lrwx------ 1 ilkkachu ilkkachu 64 Jan 1 13:54 1 -> /dev/pts/18
lrwx------ 1 ilkkachu ilkkachu 64 Jan 1 13:54 2 -> /dev/pts/18
lr-x------ 1 ilkkachu ilkkachu 64 Jan 1 13:54 3 -> /proc/8955/fd/
0, 1, 2가 모두 표시되어 rwx
읽기-쓰기 모드로 열립니다. (여기서 이 비트가 무엇을 의미하는지 잘 모르겠습니다 x
.)
답변4
stdout
.so 로 리디렉션하는 것은 /dev/null
불가능합니다 stdout
. 이것은 머물렀다 stderr
.
이 가설을 테스트하려면 stderr
으로 이동하세요 ./dev/null