С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. Источники 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
, чтобы показать свое намерение отказаться от любых выходных данных, отправленных приложением в этот конкретный файловый дескриптор.
Вы перенаправили stdout
на /dev/null
. Так не может быть stdout
. Это оставляет stderr
.
Перенаправьте stderr
на /dev/null
, чтобы проверить эту гипотезу.
Во-первых, это сообщение исходит не от оболочки. 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
, если вообще что-то.)
vsftpd
обычно вызывается inetd
с его fd 0 (stdin ), являющимся командным сокетом TCP от клиента.
Вот куда он записывает это сообщение о состоянии.
Вы могли бы сделать:
vsftpd configfile < /dev/null
чтобы заставить его уйти, не то, чтобы это сделало что-то полезное.