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

How to echo variable input into a file

提问人:InterLinked 提问时间:12/24/2020 最后编辑:miken32InterLinked 更新时间:12/26/2020 访问量:474

问:

我需要从 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 本身在展开时不包含任何变量。这里有什么方法可以使回声按预期工作吗?

Shell 星号 报价单 引号

评论

0赞 Lety 12/24/2020
您是否尝试过转义特殊字符或使用 printf 而不是 echo?这可能会有所帮助:stackoverflow.com/questions/15783701/...
0赞 InterLinked 12/24/2020
@Lety我确实研究了 printf %q 的东西,这似乎很有希望,但也无法让它起作用。与只做 echo '${log}' 一样的问题。我认为问题在于它不是一个 bash 变量,它是我正在使用的程序中的一个变量,当它到达 SYSTEM/shell 调用时,它已经被替换了,因此 bash 看到的只是一个字符串文字没有正确引用。
1赞 InterLinked 12/25/2020
@oguzismail我可以,但我想记录原始来电显示号码和姓名。

答:

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