Как проверить, существует ли папка, используя регулярное выражение в Bash?

Я думаю, то, что вы просите, возможно только частично, поскольку два требования (принимать (и пересылать) административные письма и отклонять письма от других пользователей) не ортогональны.

например, что произойдет, если служба захочет отправить письмо на root через mail() интерфейс PHP? должно ли это быть разрешено? запрещено? что произойдет (как это обычно бывает), если служба будет запущена от имени непривилегированного пользователя, а не root?

итак, я полагаю, что вы действительно хотите использовать MTA только для отправки административных писем с вашей локальной машины.

это можно сделать, настроив MTA на выполнение следующих действий (это общие инструкции по настройке MTA, не относящиеся к postfix):

  • только принимать сообщения от локального хоста (таким образом, он не будет принимать сообщения от вне ); сделайте это, настроив MTA на прослушивание 127. 0.0.1 и/или установив брандмауэр, который блокирует весь входящий трафик на порту 25.

  • только принимать сообщения для административных учетных записей (root, webmaster, postmaster, abuse,...) и устанавливать псевдоним для пересылки этих сообщений на me@example.com

, учитывая, что вы контролируете свой собственный сервер, мало пользы в блокировке определенных приложений (например, в случае, если вы используете брандмауэр, который заблокирует все входящие сообщения, вы можете использовать брандмауэр, который заблокирует все входящие сообщения на порту 25. Например, php) от отправки писем через Ваш собственный почтовый сервер. Просто настройте эти приложения на использование другого почтового сервера (если необходимо), или заново оцените Ваши требования.

0
03.04.2019, 22:30
3 ответа

Я бы подсчитал, сколько параметров появилось в результате раскрытия подстановочного знака. Во-первых, я бы установил nullglob, чтобы при отсутствии совпадений мы получали ожидаемый ноль вместо самого подстановочного знака.

shopt -s nullglob

Затем запросите расширение желаемого паттерна и установите их в качестве текущих параметров:

set -- /opt/presto-server-*/

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

Тогда спроси, сколько их:

[ "$#" -gt 0 ] && echo "There are one or more presto-server- directories"
3
28.01.2020, 02:14

Если переключение на zshявляется опцией:

if ()(($# > 0)) /opt/presto-server-*(N/); then
  echo there are directories matching that pattern
fi

Где

  • () compound-command args— анонимная функция с аргументами
  • ((...)):составная команда, которая оценивает ...арифметическое выражение и возвращает успех , если результатом является число, отличное от 0.
  • $# > 0:арифметическое выражение, которое принимает значение 1, если$#(количество аргументов этой анонимной функции )больше 0.
  • (N/):квалификаторы glob:Nдля включения nullglobдля этого одного glob, /для выбора только файлов типа каталог(изменить на -/, чтобы также включать символические ссылки на каталоги ).

Это не очень эффективно, так как вычисляется весь список каталогов (, для которых zshнеобходимо выполнить lstat()для каждого совпадающего файла ), которые впоследствии сортируются, в то время как поиск только одного каталога был бы достаточный.

Вы можете изменить *на <->-<->, чтобы точно соответствовать последовательности чисел, разделенных -.

Конечно, в пределах bashвы всегда можете сделать:

if zsh -c '()(($# > 0)) /opt/presto-server-<->-<->(N/)'; then
  echo there are directories matching that pattern
fi
1
28.01.2020, 02:14

Вы можете определить функцию has_dirsкак:

has_dirs() {
  for f do
    [ -d "$f" ] && return
  done
  false
}

И использовать как:

if has_dirs /opt/presto-server-*; then
  echo there are matching dirs
fi

Это для каталогов или символических ссылок на каталоги. Только для каталогов вам понадобится:

    [ -d "$f" ] && [ ! -L "$f" ] && return

Для более точного сопоставления prestor-server-<number>-<number>с bashвы можете выполнить:

shopt -s extglob # to enable a subset of ksh extended globs
has_dirs /opt/presto-server-+([[:digit:]])-+([[:digit:]])

Хотя следует помнить, что это может привести к ложному срабатыванию, если существует каталог с буквальным названием /opt/presto-server-+([[:digit:]])-+([[:digit:]])(, параметры failglobили nullglobмогут обойти это ).

2
28.01.2020, 02:14

Теги

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