Мне нужно вызвать вызов оболочки из диалплана Asterisk, чтобы записать некоторые данные в текстовый файл, поэтому я попробовал это:
Set(log=[${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)}] [${UNIQUEID}] ${ARG1})
SYSTEM(echo "${log}" >> /var/log/asterisk/log.txt)
(Никаких предположений о содержимом ARG1
делать нельзя. Оно может содержать одинарные кавычки, двойные кавычки, амперсанд или любые другие символы.)
Кажется, это сработало, но недавно я обнаружил, что вызовы, у которых в идентификаторе вызывающего абонента было &
, сбрасывались, как только они входили в коммутатор, потому что функция давала сбой, и вызов сбрасывался.
Я попытался заменить двойные кавычки в операторе echo
одинарными, но если имя идентификатора вызывающего абонента содержит одинарную кавычку, функция не сработает, но вообще ничего не выводит.
Вот моя дилемма:
ARG1
является переменной для каждого вызова и может быть буквально чем угодно. Таким образом, это не статическая строка, в которой я могу просто избежать кавычек.Сам журнал переменных не содержит никаких переменных при раскрытии. Есть ли способ заставить эхо работать по желанию?
@Lety Я изучил вещь printf %q, которая казалась многообещающей, но тоже не могу заставить ее работать. Та же проблема, что и при выполнении echo '${log}'. Я думаю, проблема в том, что это не переменная bash, это переменная в программе, которую я использую, и когда она попадает в вызов SYSTEM/shell, она уже заменена, так что все, что видит bash, это строковый литерал, который не заключен в кавычки верно.
@oguzismail Я мог бы, но я хочу записать исходный номер и имя вызывающего абонента.
Почему вы думаете, что «ничего не можете избежать»? Поместите строку в одинарные кавычки, и все, что вам нужно для экранирования, — это одинарные кавычки . Это можно сделать с помощью функции ЗАМЕНИТЬ.
Set(log=[${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)}] [${UNIQUEID}] ${REPLACE(${ARG1},','"'"')})
SYSTEM(echo '${log}' >> /var/log/asterisk/log.txt)
Но я думаю, что более чистое решение — использовать функцию ФАЙЛ.
FILE(/var/log/asterisk/log.txt,,,a)=${log}
Функция ФАЙЛ здесь как раз то, что нужно — идеально!
Обычные люди. Почему вы пытаетесь повторно пригласить колесо?
Просто используйте CEL в файле csv или функцию QueueLog, подумайте дважды, прежде чем использовать системный вызов. Это имеет ОГРОМНЫЙ риск для безопасности.
https://wiki.asterisk.org/wiki/display/AST/Asterisk+12+CEL+Спецификация
(см. раздел «Определяется пользователем»)
Конечно, вы можете использовать приложения Verbose и Log и настроить файлы журналов, чтобы выполнить свой уровень в другом файле.
https://wiki.asterisk.org/wiki/display/AST/Logging
вы пытались избежать специального символа или использовать printf вместо эха? Это может помочь: stackoverflow.com/questions/15783701/…