提问人:InterLinked 提问时间:12/24/2020 最后编辑:miken32InterLinked 更新时间:12/26/2020 访问量:474
如何将变量输入回显到文件中
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)
(不能对 的内容做出任何假设。它可能包含单引号、双引号、与号或任何其他字符。ARG1
这似乎有效,但我最近发现,呼叫者 ID 中的呼叫在进入交换机后立即被丢弃,因为该功能崩溃并且呼叫中断。&
我尝试用单引号替换语句中的双引号,但是如果主叫方 ID 名称包含单引号,则该函数不会崩溃,但根本不会回显任何内容。echo
这是我的困境:
- 我无法逃避任何事情(至少是手动的)。 每次调用都是可变的,实际上可以是任何东西。因此,这不是一个静态字符串,我可以简单地转义引号。
ARG1
- 我不能使用 HEREDOC,这似乎是推荐的方法。我正在使用 SYSTEM() 调用 shell 调用,这让我有机会执行 shell 代码。我不能为所有这些EOF的东西提供一堆单独的行。
- 我也不明白如何将其传递到 bash 脚本中来做到这一点。我需要将整个 $log 变量放入脚本中才能在那里执行 HEREDOC 工作,并且我会遇到与现在相同的问题 - 如何将整个内容完好无损地保存在那里,而不会引起错误。
- 由于这是一个单一的 shell 调用,因此我运行的任何命令都需要是 bash 单行命令。
变量 log 本身在展开时不包含任何变量。这里有什么方法可以使回声按预期工作吗?
答:
1赞
miken32
12/25/2020
#1
为什么你认为你“无法逃避任何事情”?将字符串放在单引号中,您只需要转义单引号即可。这可以通过 REPLACE
函数来完成。
Set(log=[${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)}] [${UNIQUEID}] ${REPLACE(${ARG1},','"'"')})
SYSTEM(echo '${log}' >> /var/log/asterisk/log.txt)
但我认为更简洁的解决方案是改用 FILE
函数。
FILE(/var/log/asterisk/log.txt,,,a)=${log}
评论
0赞
InterLinked
12/25/2020
FILE 功能正是这里所需要的 - 完美!
0赞
arheops
12/26/2020
#2
人。为什么要尝试重新邀请轮?
只需在 csv 文件或 QueueLog 函数中使用 CEL,在使用系统调用之前请三思而后行。它有巨大的安全风险。
https://wiki.asterisk.org/wiki/display/AST/Asterisk+12+CEL+Specification
(请参阅“用户定义”部分)
当然,您可以使用详细和日志应用程序并设置日志文件来执行不同文件中的级别。
https://wiki.asterisk.org/wiki/display/AST/Logging
评论