如何将变量输入回显到文件中

How to echo variable input into a file

我需要从 Asterisk 拨号方案调用 shell 来将一些数据记录到文本文件中,所以我尝试了这个:

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

(无法对 [=11= 的内容进行假设。它可能包含单引号、双引号、& 符号或任何其他字符。)

这似乎可行,但我最近发现来电显示中包含 & 的呼叫在进入交换机后立即被挂断,因为函数崩溃并且呼叫中断。

我尝试用单引号替换 echo 语句中的双引号,但是如果来电显示名称包含单引号,函数不会崩溃,但它根本不会回显任何内容。

这是我的困境:

变量log本身展开后不包含任何变量。这里有什么方法可以使回声按要求工作吗?

为什么你认为你“什么都逃不掉”?把字符串放在单引号里,转义就是single quotes. This could be done with the REPLACE function.

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

但我认为更简洁的解决方案是改用 the FILE function

FILE(/var/log/asterisk/log.txt,,,a)=${log}

普通人。为什么要尝试重新邀请 wheel?

只需在csv 文件或QueueLog 函数中使用CEL,在使用系统调用之前请三思。它具有巨大的安全风险。

https://wiki.asterisk.org/wiki/display/AST/Asterisk+12+CEL+Specification

(参见“用户定义”部分)

当然,您可以使用 Verbose 和 Log 应用程序以及设置日志文件来在不同的文件中完成您的关卡。
https://wiki.asterisk.org/wiki/display/AST/Logging