Как отразить ввод переменной в файл

Мне нужно вызвать вызов оболочки из диалплана Asterisk, чтобы записать некоторые данные в текстовый файл, поэтому я попробовал это:

Set(log=[${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)}] [${UNIQUEID}] ${ARG1})
SYSTEM(echo "${log}" >> /var/log/asterisk/log.txt)

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

Кажется, это сработало, но недавно я обнаружил, что вызовы, у которых в идентификаторе вызывающего абонента было &, сбрасывались, как только они входили в коммутатор, потому что функция давала сбой, и вызов сбрасывался.

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

Вот моя дилемма:

  • Я ничего не могу избежать (по крайней мере, вручную). ARG1 является переменной для каждого вызова и может быть буквально чем угодно. Таким образом, это не статическая строка, в которой я могу просто избежать кавычек.
  • Я не могу использовать HEREDOC, который, по-видимому, является рекомендуемым подходом. Я вызываю вызов оболочки, используя SYSTEM(), который дает мне один шанс выполнить код оболочки. У меня не может быть кучи отдельных строк для всего этого EOF.
  • Я тоже не понимаю, как я могу передать это в сценарий bash. Мне нужно было бы получить всю переменную $ log в скрипт, чтобы делать там вещи HEREDOC, и у меня будет та же проблема, что и сейчас - как получить все это там целым, не вызывая ошибки .
  • Поскольку это один вызов оболочки, любая команда или команды, которые я запускаю, должны быть однострочными bash.

Сам журнал переменных не содержит никаких переменных при раскрытии. Есть ли способ заставить эхо работать по желанию?

вы пытались избежать специального символа или использовать printf вместо эха? Это может помочь: stackoverflow.com/questions/15783701/…

Lety 24.12.2020 16:37

@Lety Я изучил вещь printf %q, которая казалась многообещающей, но тоже не могу заставить ее работать. Та же проблема, что и при выполнении echo '${log}'. Я думаю, проблема в том, что это не переменная bash, это переменная в программе, которую я использую, и когда она попадает в вызов SYSTEM/shell, она уже заменена, так что все, что видит bash, это строковый литерал, который не заключен в кавычки верно.

InterLinked 24.12.2020 16:43

@oguzismail Я мог бы, но я хочу записать исходный номер и имя вызывающего абонента.

InterLinked 24.12.2020 19:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
417
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Почему вы думаете, что «ничего не можете избежать»? Поместите строку в одинарные кавычки, и все, что вам нужно для экранирования, — это одинарные кавычки . Это можно сделать с помощью функции ЗАМЕНИТЬ.

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}

Функция ФАЙЛ здесь как раз то, что нужно — идеально!

InterLinked 24.12.2020 19:01

Обычные люди. Почему вы пытаетесь повторно пригласить колесо?

Просто используйте CEL в файле csv или функцию QueueLog, подумайте дважды, прежде чем использовать системный вызов. Это имеет ОГРОМНЫЙ риск для безопасности.

https://wiki.asterisk.org/wiki/display/AST/Asterisk+12+CEL+Спецификация

(см. раздел «Определяется пользователем»)

Конечно, вы можете использовать приложения Verbose и Log и настроить файлы журналов, чтобы выполнить свой уровень в другом файле.
https://wiki.asterisk.org/wiki/display/AST/Logging

Другие вопросы по теме