이 메시지는 어디에 인쇄되었습니까? [복사]

이 메시지는 어디에 인쇄되었습니까? [복사]

저는 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

vsftpdinetd일반적으로 클라이언트의 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

관련 정보