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

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

我需要从 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?