Где напечатано это сообщение?

Сzsh:

autoload age # best in ~/.zshrc if you use that often
ls -ldS -- *(De:age 2018-06-01 2018-06-30:OL[1,20])
  • -S:сортировать по размеру. С GNU ls(, найденным в RedHat 5.3 ), вы можете использовать -Uдля отказа от сортировки, так как zshуже отсортировал список с помощью OL.
  • (...):квалификатор глоба
  • D:не игнорировать точечные файлы.
  • e:code:оцените код, чтобы решить, следует ли выбирать файл
  • age date1 date2:возвращает true для файлов с mtime в этом диапазоне (без временной части, по умолчанию 00 :00 :00)
  • OL:обратная сортировка по длине (размеру)
  • [1,20]:выберите только первые 20.
1
01.01.2021, 13:37
4 ответа

Источники vsftpdопределяют константу VSFTP_COMMAND_FDкак число ноль. Это дескриптор файла, в который записываются ошибки.

$ 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
18.03.2021, 22:39

Вы перенаправили stdoutна /dev/null. Так не может быть stdout. Это оставляет stderr.

Перенаправьте stderrна /dev/null, чтобы проверить эту гипотезу.

-1
18.03.2021, 22:39

Во-первых, это сообщение исходит не от оболочки. hide_ids— это параметр конфигурации vsftpd, а не оболочки, поэтому нет причин предполагать, что оболочка напечатает все, что на нее ссылается. (Да, разница есть, и да, она важна.)

Во-вторых, вы показали, что vsftpd запущен с перенаправлением stdout и stderr на /dev/null, и он все еще виден, поэтому мы должны предположить, что сообщение печатается на и не .

Некоторые утилиты явно открывают новый дескриптор текущего терминала через /dev/tty, часто для того, чтобы сделать что-то, что требует взаимодействия с пользователем, не нарушая возможных перенаправлений. Вот как, например. клиент SSH может запросить ваш пароль, даже если и stdout, и stderr перенаправлены.

Однако и здесь это не так. Как ответ Кусалананды говорит , vsftpd печатает подобные фатальные ошибки команде fd, названной VSFTP_COMMAND_FDв источнике. Предположительно, он также использует тот же fd для чтения команд, и он определен как fd 0 или stdin . Это действительно работает,так как все 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, если вообще что-то.)

0
18.03.2021, 22:39

vsftpdобычно вызывается inetdс его fd 0 (stdin ), являющимся командным сокетом TCP от клиента.

Вот куда он записывает это сообщение о состоянии.

Вы могли бы сделать:

vsftpd configfile < /dev/null

чтобы заставить его уйти, не то, чтобы это сделало что-то полезное.

2
18.03.2021, 22:39

Теги

Похожие вопросы