Я отправляю этот ответ в надежде, что он может помочь кому-то в будущем, возможно, мне, поскольку я страдал от решения этой проблемы.
У меня неправильно установлен local_root
в файле /etc/vsftpd/vsftpd.conf
. Параметр указывает на папку, которой не существует.
Через меня я увидел сбой команды пароля в FileZilla, поэтому я подумал, что пароль ей не понравился. Что заставило меня задуматься в правильном направлении, так это то, что я нашел время, чтобы исследовать, почему я не получаю подробные журналы. Я не получил логов. Как только я начал получать журналы отладки, в которых я видел протоколы FTP, я увидел, что FTP-сервер сказал OK на пароль. К сожалению, никакой регистрации не было, но я натолкнулся на мысль, что согласование локального корня будет следующим курсом действий после аутентификации пароля. Я был прав, и это привело меня к проблеме.
Вот фрагмент кода в файле /etc/vsftpd/vsftpd.conf
, содержащий локальный корень.
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
# (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
# the user does not have write access to the top level directory within the
# chroot)
chroot_local_user=YES
#local_root=/mnt/raid1
local_root=/ftproot
#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list
Вот как я наконец включил подробное ведение журнала, хотя сейчас я отключу его, чтобы сэкономить место на диске и повысить производительность.
# Activate logging of uploads/downloads.
xferlog_enable=YES
#
# If you want, you can have your log file in standard ftpd xferlog format.
# Note that the default log file location is /var/log/xferlog in this case.
xferlog_std_format=NO
log_ftp_protocol=YES
#
# Activate logging of uploads/downloads.
xferlog_enable=YES
IMHO, я бы посчитал этот комментарий ошибкой, поскольку xferlog_enable - это больше, чем фактическая загрузка и скачивание файлов. Это свойство также включает ведение журнала. Исследование Google доказывает, что log_ftp_protocol = YES
требует xferlog_enable = YES
.
Возникновение проблемы, с которой вы столкнулись, связано со способом токенизации командной строки. В данном конкретном случае, задолго до раскрытия $(echo 'echo | tac')
, оболочка уже выяснила, что вы собираетесь выполнить команду ( echo {…}
) и передать его вывод через конвейер ( |
) другой команде ( xargs -n 2 $(…)
).
Затем на следующем этапе происходит заполнение $(…)
и раскрытие фигурной скобки {…}
для создания фактических команд, которые необходимо выполнить. И на этом этапе, если это приводит к характеру трубы, ну и что, уже слишком поздно, и он явно опоздал на автобус.
Теперь он будет рассматриваться не как специальный метасимвол, а будет включен в командную строку xargs
как обычный (=> неметасимвольный) символ.
Если вы хотите попробовать еще раз, вам нужно оценить
его.
eval "echo {0..9} | xargs -n 2 $(echo 'echo | tac')"
Это выведет то, что вы ожидаете.
помимо того, что Роман сказал, ваша команда должна быть такой
echo {0..9}| xargs -n 2 | tac
это производит
8 9
6 7
4 5
2 3
0 1
с бессмысленным $(echo 'echo') это вызывает ошибку
PS. Для длинного ответа |
перенаправляет вывод одной команды на следующую, поэтому echo {0..9}
выдает:
0 1 2 3 4 5 6 7 8 9
xargs -n 2
принимает этот ввод и производит
0 1
2 3
4 5
6 7
8 9
и, наконец, tac
принимает этот ввод и производит обратное выражение:
8 9
6 7
4 5
2 3
0 1
Я надеюсь, что это немного яснее.
РЕДАКТИРОВАТЬ:
echo {0..9} | xargs -n 2 $(echo 'echo | tac')
+ echo 0 1 2 3 4 5 6 7 8 9
++ echo 'echo | tac'
+ xargs -n 2 echo '|' tac
| tac 0 1
| tac 2 3
| tac 4 5
| tac 6 7
| tac 8 9
Это команда, которую вы отправляете в bash с вашим начальным синтаксисом, довольно ясно, что происходит, в конце вы отправляете xargs -n 2 echo '|' так
Риск оказаться излишним (но я не вижу, чтобы кто-то еще прямо сказал об этом ), причина, по которой ваш
echo {0..9} | xargs -n 2 $(echo 'echo | tac')
Команда делает то, что она делает, так это то, что она эквивалентна
echo {0..9} | xargs -n 2 'echo' '|' 'tac'
Сравните с
echo {0..9} | xargs -n 2 echo foo bar
Это происходит потому, что $(echo …)
оценивается после общей структуры командной строки(echo (something) | xargs (args)
)был проанализирован, поэтому вывод из $(echo …)
может быть только добавьте аргумент (s )в команду xargs
. Чтобы делать то, что вы хотите, так, как вы хотите, вам нужно сказать
echo {0..9} | eval xargs -n 2 $(echo 'echo | tac')
Обратите внимание, что eval
может быть опасным. Поищите на этом сайте предупреждения об этом и прислушайтесь к ним.