Exim + sh + condition
Модератор: xM
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
-
- рядовой
- Сообщения: 17
- Зарегистрирован: 2013-01-23 17:21:05
Exim + sh + condition
Задача - отвергать письмо при условии, которое задается внешним скриптом (0 - отвергать, остальное - принимать)
deny message = Nafig!
set acl_m1 = ${run{/usr/local/script.sh}{$value}{error}}
condition = ${if eq{$acl_m1}{0}}
Сам скрипт script.sh, допустим:
#!/bin/sh
echo 0
Проблема вот в чем - скрипт запускается, но в переменную acl_m1 не помещается значение стандартного вывода скрипта, т.е. 0. Ну или 1, или не важно что там выставить. Сам скрипт экзимом дергается, но пропускает все письма, т.к. в любом случае условие не true.
Ткните плиз в ошибку, моск кипит уже
deny message = Nafig!
set acl_m1 = ${run{/usr/local/script.sh}{$value}{error}}
condition = ${if eq{$acl_m1}{0}}
Сам скрипт script.sh, допустим:
#!/bin/sh
echo 0
Проблема вот в чем - скрипт запускается, но в переменную acl_m1 не помещается значение стандартного вывода скрипта, т.е. 0. Ну или 1, или не важно что там выставить. Сам скрипт экзимом дергается, но пропускает все письма, т.к. в любом случае условие не true.
Ткните плиз в ошибку, моск кипит уже
Услуги хостинговой компании Host-Food.ru
Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/
-
- рядовой
- Сообщения: 17
- Зарегистрирован: 2013-01-23 17:21:05
Re: Exim + sh + condition
что, никто не подскажет?
- liet
- мл. сержант
- Сообщения: 78
- Зарегистрирован: 2012-01-04 13:47:43
- Откуда: UA, Kiev
- Контактная информация:
Re: Exim + sh + condition
привет бион.
а чего там по поводу прав и иже с ними?
а чего там по поводу прав и иже с ними?
xxx: Иногда лучше сказать: "Я не знаю", чем пытаться что-то донести до дурака.
-
- рядовой
- Сообщения: 17
- Зарегистрирован: 2013-01-23 17:21:05
Re: Exim + sh + condition
Ы, и ты тут хай.liet писал(а):привет бион.
а чего там по поводу прав и иже с ними?
Прав на что? за сш? ставил и 777. Юзверь/группа тот же, под каким и exim. Да и дело не в том, ибо сам скрипт запускается, но вот $value (как я понял она отвечает за результат деятельности скрипта), которая должна раскрытся и передаццо на acl_m1 - не передается.
-
- проходил мимо
Re: Exim + sh + condition
а с какого лешего $value а не $zalupe...откуда имя такое?
-
- рядовой
- Сообщения: 17
- Зарегистрирован: 2013-01-23 17:21:05
Re: Exim + sh + condition
Не поверите из документации по Exim.mak_v_ писал(а):а с какого лешего $value а не $zalupe...откуда имя такое?
-
- проходил мимо
Re: Exim + sh + condition
Ну так почитайте документацию по stdout
-
- рядовой
- Сообщения: 17
- Зарегистрирован: 2013-01-23 17:21:05
Re: Exim + sh + condition
Что вы хотите этим сказать?mak_v_ писал(а):Ну так почитайте документацию по stdout
-
- проходил мимо
Re: Exim + sh + condition
Ссылку на гуглтранслейт дать?
Код: Выделить всё
${run{<command> <args>}{<string1>}{<string2>}}
The command and its arguments are first expanded separately, and then the command is run in a separate process, but under the same uid and gid. As in other command executions from Exim, a shell is not used by default. If you want a shell, you must explicitly code it.
The standard input for the command exists, but is empty. The standard output and standard error are set to the same file descriptor. If the command succeeds (gives a zero return code) <string1> is expanded and replaces the entire item; during this expansion, the standard output/error from the command is in the variable $value. If the command fails, <string2>, if present, is expanded and used. Once again, during the expansion, the standard output/error from the command is in the variable $value.
If <string2> is absent, the result is empty. Alternatively, <string2> can be the word “fail” (not in braces) to force expansion failure if the command does not succeed. If both strings are omitted, the result is contents of the standard output/error on success, and nothing on failure.
The return code from the command is put in the variable $runrc, and this remains set afterwards, so in a filter file you can do things like this:
if "${run{x y z}{}}$runrc" is 1 then ...
elif $runrc is 2 then ...
...
endif
If execution of the command fails (for example, the command does not exist), the return code is 127 – the same code that shells use for non-existent commands.
Warning: In a router or transport, you cannot assume the order in which option values are expanded, except for those preconditions whose order of testing is documented. Therefore, you cannot reliably expect to set $runrc by the expansion of one option, and use it in another.
The redirect router has an option called forbid_filter_run which locks out the use of this expansion item in filter files.
-
- рядовой
- Сообщения: 17
- Зарегистрирован: 2013-01-23 17:21:05
Re: Exim + sh + condition
Именно этим текстом я и руководствуюсь, отсюда же "during this expansion, the standard output/error from the command is in the variable $value" - и переменная $value, в которой и должен сохранятся "выхлоп" скрипта. Но почему-то не работает.mak_v_ писал(а):Ссылку на гуглтранслейт дать?
Причем
Код: Выделить всё
set acl_m1 = ${run{/usr/local/script.sh}{$value}fail}
-
- проходил мимо
Re: Exim + sh + condition
Читать внимательно
Код: Выделить всё
The standard output and standard error are set to the same file descriptor. If the command succeeds (gives a zero return code) <string1> is expanded and replaces the entire item; during this expansion, the standard output/error from the command is in the variable $value. If the command fails, <string2>, if present, is expanded and used. Once again, during the expansion, the standard output/error from the command is in the variable $value.
-
- рядовой
- Сообщения: 17
- Зарегистрирован: 2013-01-23 17:21:05
Re: Exim + sh + condition
Если честно - читал несколько раз. Но все равно, имхо, написано мутновато. На сколько я понял, если скрипт выполнился успешно, то по дефолту передается значение об успешности выполнения. Если успешно и есть <string1> - то оно раскрывается, если не успешно, то раскрывается <string2>.mak_v_ писал(а):Читать внимательноКод: Выделить всё
The standard output and standard error are set to the same file descriptor. If the command succeeds (gives a zero return code) <string1> is expanded and replaces the entire item; during this expansion, the standard output/error from the command is in the variable $value. If the command fails, <string2>, if present, is expanded and used. Once again, during the expansion, the standard output/error from the command is in the variable $value.
-
- проходил мимо
Re: Exim + sh + condition
Код: Выделить всё
Стандартный вывод и стандартная ошибка устанавливается на тот же дескриптор файла. Если команда выполняется успешно (возвращенный код равен нулю) <string1> раскрывается и замещает весь элемент; во время этого расширения, стандартный вывод / ошибка из команды в переменной $ значение. Если команда не выполняется, <string2>, если присутствует, расширен и использован. Еще раз, во время расширения, стандартный вывод / ошибка из команды в переменной $ значение.
stdout
если выполнился успешно - то в stdout будет 0, если неуспешно, то1. Соответственно подставиться значение либо <первые стринги> либо <вторые панталоны>
-
- рядовой
- Сообщения: 17
- Зарегистрирован: 2013-01-23 17:21:05
Re: Exim + sh + condition
А.. И что, никак нельзя выхлоп sh скрипта подставить?mak_v_ писал(а):Хугле не ясно?Код: Выделить всё
Стандартный вывод и стандартная ошибка устанавливается на тот же дескриптор файла. Если команда выполняется успешно (возвращенный код равен нулю) <string1> раскрывается и замещает весь элемент; во время этого расширения, стандартный вывод / ошибка из команды в переменной $ значение. Если команда не выполняется, <string2>, если присутствует, расширен и использован. Еще раз, во время расширения, стандартный вывод / ошибка из команды в переменной $ значение.
stdout
если выполнился успешно - то в stdout будет 0, если неуспешно, то1. Соответственно подставиться значение либо <первые стринги> либо <вторые панталоны>
-
- проходил мимо
Re: Exim + sh + condition
наверное можно каким-то костылем: записать в файл\базу результат, а потом считать его в проверке
-
- рядовой
- Сообщения: 17
- Зарегистрирован: 2013-01-23 17:21:05
Re: Exim + sh + condition
Не подскажете, как правильно подобное написать?mak_v_ писал(а):наверное можно каким-то костылем: записать в файл\базу результат, а потом считать его в проверке
-
- проходил мимо
Re: Exim + sh + condition
я ж не знаю задачи...реализацию вы выдумали и показали...отколь я знаю что вы хотите.
-
- рядовой
- Сообщения: 17
- Зарегистрирован: 2013-01-23 17:21:05
Re: Exim + sh + condition
Мне необходимо что бы при приходе каждого письма запускался скрипт, который отдает значение "да" или "нет", и исходя из этого значения письмо или отвергалось или проходило.mak_v_ писал(а):я ж не знаю задачи...реализацию вы выдумали и показали...отколь я знаю что вы хотите.
-
- проходил мимо
Re: Exim + sh + condition
Код: Выделить всё
set acl_m1 = ${run{/usr/local/script.sh}{true}{false}}
-
- проходил мимо
Re: Exim + sh + condition
Код: Выделить всё
echo $?
Например
Код: Выделить всё
cat VASYA
#cat: VASYA: No such file or directory
#echo $?
1
#cat: vasya
text from file vasya
#echo $?
0
-
- рядовой
- Сообщения: 17
- Зарегистрирован: 2013-01-23 17:21:05
Re: Exim + sh + condition
Кхм. И что же оно будет возвращать в переменную acl_m1 ? Удачно ли оно запустилось?mak_v_ писал(а):Код: Выделить всё
set acl_m1 = ${run{/usr/local/script.sh}{true}{false}}
Я имел в виду - отрабатывает скрипт, на выхлопе которого каким-то образом будет "да" / "нет".
Т.е. к примеру в скрипте такое:
Код: Выделить всё
#!/bin/sh
AVAIL=`df -m | grep $1 | awk '{ print $4 }'`
if [ "$AVAIL" -gt 10 ]
then
echo 0
else echo 1
fi
-
- проходил мимо
Re: Exim + sh + condition
Вы что, по диагонали читаете?
Можете преобразовать скрипт к виду:
Тогда скрипт вывалится с "command not found" и в stdout будет 0, acl_m1 будет равен false, т.е. "вторым стрингам" .
Не очень красиво, но работать будет
Кстати надо имя команды "вапыцуролываорфывлою" запатентовать после этого :-)
Ваш скрипт всегда будет выполнен успешно, т.е всегда в stdout будет 1, а acl_m1 будет равен true, т.е. первым стрингамЕсли команда выполняется успешно (возвращенный код равен нулю) <string1> раскрывается и замещает весь элемент; во время этого расширения, стандартный вывод / ошибка из команды в переменной $ значение. Если команда не выполняется, <string2>, если присутствует, расширен и использован. Еще раз, во время расширения, стандартный вывод / ошибка из команды в переменной $ значение.
Можете преобразовать скрипт к виду:
Код: Выделить всё
#!/bin/sh
AVAIL=`df -m | grep $1 | awk '{ print $4 }'`
if [ "$AVAIL" -gt 10 ]
then
вапыцуролываорфывлою.
else echo 1
fi
Не очень красиво, но работать будет
Кстати надо имя команды "вапыцуролываорфывлою" запатентовать после этого :-)
-
- рядовой
- Сообщения: 17
- Зарегистрирован: 2013-01-23 17:21:05
Re: Exim + sh + condition
Тогда еще вопрос, можно ли подставить аргумент?
не срабатывает, ни так, ни в кавычках.
Полностью правило такое:
Код: Выделить всё
${run{/usr/local/etc/hostcontrol/scripts/disk_space_check.sh $domain}{0}{1}}
Полностью правило такое:
Код: Выделить всё
acl_check_rcpt:
deny message = net mesta!
set acl_m1 = ${run{/usr/local/check.sh $domain}{0}{1}}
condition = ${if eq{$acl_m1}{0}}
-
- проходил мимо
Re: Exim + sh + condition
простите, а пользователю из под которого работает екзим можно ваш скрипт выполнять?
-
- рядовой
- Сообщения: 17
- Зарегистрирован: 2013-01-23 17:21:05
Re: Exim + sh + condition
конечно можно, права соблюдены Ну и сам скрипт выполняется, проверял методом echo Работает >> /var/log/лалал.логmak_v_ писал(а):простите, а пользователю из под которого работает екзим можно ваш скрипт выполнять?