Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

Выполнение скрипта от пользователя Астериск [Решено]

0

Решил переименовать тему, т.к. появились новые данные.

Доброе время суток! Прошу помощи ибо сам уже ничего не понимаю. Ситуация такая: есть скрипт, который получает СМС, обрабатывает его текст и выдает ответ, который должен получить Астер. Выглядит эта команда так: Set(answ=${SHELL(/home/serv/sms-code.sh ${SMS})}); Проблема заключается в том, что Астериск напрочь отказывается передавать переменную ${SMS} скрипту. При запуске с консоли (./sms-code.sh 56611523), все работает на ура, скрипт выдает ответ. Но если его запускает Астериск, то скрипт выдает ошибку т.к. не передается переменная. Ясным делом начал думать что проблема с владельцем папки или правами, владельца ставил разного от serv:serv до root:root, так же было и asterisk:asterisk. Ничего не помогло, так же ставил chmod 777, просто не знаю что делать и куда смотреть. Пробовал разобраться сам, убил 1.5 дня, но выхода так и не нашел.

++ Чуть позже оказалось что дело не в переменной, а в том что скрипт не может эту переменную записать в файл и разобрать на символы, если он запущен от пользователя Астериск, если запустить Астериск с ключем -vvgc то скрипты он выполняет от РУТа и все проходит на ура. Собственно вопрос, почему скрипт запущенный под пользователем Аsterisk не может создать файл если сам скрипт и директория в которой он лежит имеет chmod 777?!

OS:Debian, Aterisk:1.8

Буду благодарен за любой совет. Заранее спасибо!!


Ответ на головоломку прост как никогда! Всегда в скрипте нужно писать именно полный путь к файлу, будь то ЛОГ или временный файл или скрипт. Всем спасибо!!

удалить закрыть спам изменить тег редактировать

спросил 2013-10-16 11:53:58 +0400

vlad.v Gravatar vlad.v
377 28 5 21

обновил 2013-10-17 18:56:56 +0400

Comments

Убил 0.027 дня, но не понял конкретно, откуда и как появляется значение переменной ${SMS}

switch ( 2013-10-16 13:41:08 +0400 )редактировать

что мешает проверить, что ${SMS} именно не передается, а не пустое? Set(answ=${SHELL(/home/serv/sms-code.sh 56611523)})

borispr ( 2013-10-16 16:24:26 +0400 )редактировать

switch, Вы мне уже не раз помогали, насколько я помню, за что отдельное спасибо и низкий поклон, но так же могу сказать, что Вы троль еще тот! И если бы мой вопрос был тупым, я бы посмеялся вместе с Вами, в данном случае считаю троллинг не уместным. Или вы считаете, что я должен тут выложить весь диалплан, т.к. кроме переменной ${SMS}, там есть еще много разных. Я как бы не гуру, но и не полный нуб тоже. К borispr. Спасибо, до этого не додумался, проверю. Но все таки думаю что переменная не пустая, NoOp(${SMS}); показывает что переменная со значением.

vlad.v ( 2013-10-16 17:04:29 +0400 )редактировать

Настроение было, вот и высказал предложение посмотреть есть ли там переменная. Я с командой SHELL не работал. Попробуйте сделать su asterisk и под этим пользователем запустить скрипт.

switch ( 2013-10-17 15:40:00 +0400 )редактировать

почему почему. потому что файл у вас в который пишится принадлежит руту. вы ж от рута тестили. надо либо права менять либо chown.

meral ( 2013-10-17 18:42:03 +0400 )редактировать

1 Ответ

1

я думаю что вы неверно определи саму проблему. тоесть скорее всего все же ошибка в скрипте а не в "передаче" переменной.

как это вылавливается.

1) чиатете вот это для общего развития http://asterisk-support.ru/question/38386/kak-poniat-chto-proiskhodit-na-asteriske/

2) останавливаете астриск. запускаете его с консоли asterisk -vvvvgc после этого у вас на консоли будут ошибки выданные скриптом. наслаждаетесь.

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

ссылка удалить спам редактировать

ответил 2013-10-16 17:42:24 +0400

meral Gravatar meral flag of Ukraine
23347 24 20 177
http://pro-sip.net/

Comments

"Останавливаете астриск. запускаете его с консоли asterisk -vvvvgc после этого у вас на консоли будут ошибки выданные скриптом. наслаждаетесь." Пробовал раньше, что-то ничего я не увидел. Сейчас еще раз попробую. С дебагом скриптов знаком, и думаю что все таки это не скрипт, хотя бы из-за того что этот скрипт взят с другого Астериска и там он работает. Буду проверять еще раз через asterisk -vvvvgc. Спасибо!

vlad.v ( 2013-10-17 10:51:37 +0400 )редактировать

Наверное запускал asterisk -vvvvgc, без предварительной остановки Астериска. Сейчас же действительно увидел как отрабатывает скрипт! И проблема в том, что он Работает!!!, но стоило мне выйти с режима "gc" и сделать "sudo service aterisk start" и зайти в cli командой asterisk -rvvv, как скрипт снова не работает, я уже не делаю акцент на переменную или другую мистику, просто с gc он работает, а при стандартом запуске - нет! Уже бубен порвал!!

vlad.v ( 2013-10-17 12:05:38 +0400 )редактировать

Сам спросил, сам ответил. Скрипт успешно выполняется при запуске asterisk -vvvvgc, из-за того, что Астериск выполняет его от РУТа. При стандартном запуске, он выполняется от Asterisk. Но я все равно не могу понять чего он не может его выполнить, ведь chmod стоит 777...

vlad.v ( 2013-10-17 13:32:54 +0400 )редактировать

а тело скрипта можно? просто может там есть какието специфичные команды которые только root может делать.

romariosar ( 2013-10-17 14:54:29 +0400 )редактировать

Вот скрипт:

echo $1 > code.sat

#выделяем буквенный код

l1=head -c1 code.sat

l2=head -c2 code.sat |tail -c1

latpass=echo $l1$l2

#выделяем пароль

X=head -c3 code.sat |tail -c1

Y=head -c8 code.sat |tail -c1

pass=echo $X$Y

#сравниваем буквенный пароль

if [[ "$latpass" == SA ]]

then

  answ=ok

  echo $answ

else

    answ=`echo "Bad_pass"`

echo $answ

  rm code.sat

  exit 1

fi

#сравниваем пароль

if [ $pass = 77 ]

then

  answ=ok

  echo $answ

else

  answ=`echo "Bad_pass"`

echo $answ

  rm code.sat

  exit 1

fi

exit 0

vlad.v ( 2013-10-17 15:15:02 +0400 )редактировать

echo $1 > code.sat

а прав сюда писать хватает ?

Selinux не включили случайно на своем дебиане ?

komrad123 ( 2013-10-17 17:23:26 +0400 )редактировать

запускайте астриск от пользователя астриск. как у вас тсртовый скрипт запускает. ну как дети ейбогу.

meral ( 2013-10-17 18:06:43 +0400 )редактировать

Спасибо всем, отдельное спасибо komrad123! Совсем забыл что при запуске с консоли и при запуске с Астериск путь к файлу code.sat будет разным. И да, прав действительно не хватает для записи в файл. Выход простой:

codefile=/home/serv/script/smscode.sat

#разбираем полученный код на пароль и код

echo $1 > $codefile

#выделяем буквенный код

l1=head -c1 $codefile

l2=head -c2 $codefile |tail -c1

latpass=$l1$l2

И все! Вот только одного не могу понять, как этот же скрипт сейчас работает на другой АТС с тем же "echo $1 > code.sat" Ну да ладно!! Спасибо всем еще раз!!

vlad.v ( 2013-10-17 18:52:32 +0400 )редактировать

на другой атс он может записать в том директории из котоого запускается астериск. но вот видите, вы приобрели безценные навыки по дебагу.. применять только не забывайте.

meral ( 2013-10-18 00:27:00 +0400 )редактировать

Действительно бесценный! Всегда говорил что теория без практики - бессмысленна.

vlad.v ( 2013-10-18 10:53:11 +0400 )редактировать

Ваш ответ

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!
[скрыть предварительный просмотр]

Закладки и информация

Добавить закладку

подписаться на rss ленту новостей

Статистика

Задан: 2013-10-16 11:53:58 +0400

Просмотрен: 2,989 раз

Обновлен: Oct 17 '13

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.