如何解决如何将变量输入回显到文件中
我需要从 Asterisk 拨号计划调用 shell 调用,以便将一些数据记录到文本文件中,所以我尝试了这个:
Set(log=[${STrftIME(${EPOCH},%Y-%m-%d %H:%M:%s)}] [${UNIQUEID}] ${ARG1})
SYstem(echo "${log}" >> /var/log/asterisk/log.txt)
(不能对 ARG1
的内容做任何假设。它可能包含单引号、双引号、与号或任何其他字符。)
这似乎有效,但我最近发现在他们的来电显示中包含 &
的呼叫在他们进入交换机后立即被挂断,因为函数崩溃并且呼叫挂断。
我尝试用单引号替换 echo
语句中的双引号,但如果调用方 ID 名称包含单引号,则该函数不会崩溃,但它根本不会回显任何内容。
这是我的困境:
- 我无法逃避任何事情(至少是手动逃避)。
ARG1
每次调用都是可变的,实际上可以是任何东西。因此,这不是一个静态字符串,我可以在其中简单地转义引号。 - 我不能使用 HEREDOC,这似乎是推荐的方法。我正在使用 SYstem() 调用 shell 调用,这给了我一次执行 shell 代码的机会。对于所有 EOF 内容,我不能有一堆单独的行。
- 我也不知道如何将它传递到 bash 脚本中来做到这一点。我需要将整个 $log 变量放入一个脚本中,以便在那里执行 HEREDOC 的工作,我将遇到与现在相同的问题 - 如何使整个内容完整无缺,而不会导致错误.
- 因为这是一个单一的 shell 调用,所以我运行的任何一个或多个命令都需要是一个 bash 单行。
变量日志本身在展开时不包含任何变量。这里有什么方法可以使回声按需要工作吗?
解决方法
为什么你认为你“无法逃避任何事情?”将字符串放在单引号中,您需要转义的只是 single quotes。这可以通过 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}
,
普通人。为什么要尝试重新邀请轮子?
只需在csv文件或QueueLog函数中使用CEL,使用系统调用前请三思。它具有巨大的安全风险。
https://wiki.asterisk.org/wiki/display/AST/Asterisk+12+CEL+Specification
(参见“用户定义”部分)
当然,您可以使用 Verbose 和 Log 应用程序并设置日志文件来在不同的文件中完成您的级别。
https://wiki.asterisk.org/wiki/display/AST/Logging
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。