如何将变量输入回显到文件中
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
语句中的双引号,但是如果来电显示名称包含单引号,函数不会崩溃,但它根本不会回显任何内容。
这是我的困境:
- 我无法逃避任何事情(至少手动)。
ARG1
每次调用都是可变的,实际上可以是任何东西。因此,这不是我可以简单地转义引号的静态字符串。
- 我不能使用 HEREDOC,这似乎是推荐的方法。我正在使用 SYSTEM() 调用 shell 调用,这让我有机会执行 shell 代码。我不能为所有 EOF 内容设置一堆单独的行。
- 我也不知道如何将其传递到 bash 脚本中来执行此操作。我需要将整个 $log 变量放入脚本中以便在那里执行 HEREDOC 内容,并且我将遇到与现在相同的问题 - 如何完整地获取整个内容,而不会导致错误.
- 因为这是一个 shell 调用,所以我 运行 的任何一个或多个命令都需要 bash 一行。
变量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
我需要从 Asterisk 拨号方案调用 shell 来将一些数据记录到文本文件中,所以我尝试了这个:
Set(log=[${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)}] [${UNIQUEID}] ${ARG1})
SYSTEM(echo "${log}" >> /var/log/asterisk/log.txt)
(无法对 [=11= 的内容进行假设。它可能包含单引号、双引号、& 符号或任何其他字符。)
这似乎可行,但我最近发现来电显示中包含 &
的呼叫在进入交换机后立即被挂断,因为函数崩溃并且呼叫中断。
我尝试用单引号替换 echo
语句中的双引号,但是如果来电显示名称包含单引号,函数不会崩溃,但它根本不会回显任何内容。
这是我的困境:
- 我无法逃避任何事情(至少手动)。
ARG1
每次调用都是可变的,实际上可以是任何东西。因此,这不是我可以简单地转义引号的静态字符串。 - 我不能使用 HEREDOC,这似乎是推荐的方法。我正在使用 SYSTEM() 调用 shell 调用,这让我有机会执行 shell 代码。我不能为所有 EOF 内容设置一堆单独的行。
- 我也不知道如何将其传递到 bash 脚本中来执行此操作。我需要将整个 $log 变量放入脚本中以便在那里执行 HEREDOC 内容,并且我将遇到与现在相同的问题 - 如何完整地获取整个内容,而不会导致错误.
- 因为这是一个 shell 调用,所以我 运行 的任何一个或多个命令都需要 bash 一行。
变量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