Порядок подстановки команд Linux

Я отправляю этот ответ в надежде, что он может помочь кому-то в будущем, возможно, мне, поскольку я страдал от решения этой проблемы.

У меня неправильно установлен 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 .

4
13.08.2017, 14:27
3 ответа

Возникновение проблемы, с которой вы столкнулись, связано со способом токенизации командной строки. В данном конкретном случае, задолго до раскрытия $(echo 'echo | tac'), оболочка уже выяснила, что вы собираетесь выполнить команду ( echo {…}) и передать его вывод через конвейер ( |) другой команде ( xargs -n 2 $(…)).

Затем на следующем этапе происходит заполнение $(…)и раскрытие фигурной скобки {…}для создания фактических команд, которые необходимо выполнить. И на этом этапе, если это приводит к характеру трубы, ну и что, уже слишком поздно, и он явно опоздал на автобус.

Теперь он будет рассматриваться не как специальный метасимвол, а будет включен в командную строку xargsкак обычный (=> неметасимвольный) символ.

Если вы хотите попробовать еще раз, вам нужно оценитьего.

eval "echo {0..9} | xargs -n 2 $(echo 'echo | tac')"

Это выведет то, что вы ожидаете.

4
27.01.2020, 20:50

помимо того, что Роман сказал, ваша команда должна быть такой

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 '|' так

3
27.01.2020, 20:50

Риск оказаться излишним (но я не вижу, чтобы кто-то еще прямо сказал об этом ), причина, по которой ваш

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может быть опасным. Поищите на этом сайте предупреждения об этом и прислушайтесь к ним.

0
27.01.2020, 20:50

Теги

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