【问题标题】:How to echo variable input into a file如何将变量输入回显到文件中
【发布时间】:2021-04-03 00:20:19
【问题描述】:

我需要从 Asterisk dialplan 调用 shell 调用,以便将一些数据记录到文本文件中,所以我尝试了这个:

Set(log=[${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)}] [${UNIQUEID}] ${ARG1})
SYSTEM(echo "${log}" >> /var/log/asterisk/log.txt)

(不能对ARG1 的内容做出任何假设。它可能包含单引号、双引号、& 或任何其他字符。)

这似乎可行,但我最近发现呼叫者 ID 中包含 & 的呼叫在进入开关后立即被丢弃,因为函数崩溃并且呼叫被丢弃。

我尝试用单引号替换echo语句中的双引号,但是如果调用方ID名称包含单引号,该函数不会崩溃但它根本不会回显任何内容。

这是我的困境:

  • 我无法逃脱任何事情(至少手动)。 ARG1 每次调用都是可变的,实际上可以是任何东西。因此,这不是我可以简单地转义引号的静态字符串。
  • 我不能使用 HEREDOC,这似乎是推荐的方法。我正在使用 SYSTEM() 调用 shell 调用,这让我有机会执行 shell 代码。我不能为所有 EOF 内容设置一堆单独的行。
  • 我也不知道如何将其传递到 bash 脚本中来执行此操作。我需要将整个 $log 变量放入脚本中,以便在那里执行 HEREDOC 的工作,并且我将遇到与现在相同的问题 - 如何让整个事情完好无损,而不会导致错误.
  • 由于这是一个单一的 shell 调用,因此我运行的任何命令都需要是 bash 单行代码。

变量日志本身在展开时不包含任何变量。这里有什么方法可以使回显按需要工作吗?

【问题讨论】:

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

标签: shell asterisk quotes single-quotes


【解决方案1】:

普通人。为什么要尝试重新邀请轮盘?

只需在 csv 文件或 QueueLog 函数中使用 CEL,在使用系统调用之前请三思而后行。它存在巨大的安全风险。

https://wiki.asterisk.org/wiki/display/AST/Asterisk+12+CEL+Specification

(参见“用户定义”部分)

当然,您可以使用 Verbose 和 Log 应用程序并设置日志文件在不同的文件中执行您的级别。
https://wiki.asterisk.org/wiki/display/AST/Logging

【讨论】:

    【解决方案2】:

    为什么你认为你“什么都逃不掉”?将字符串放在单引号中,您需要转义的只是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}
    

    【讨论】:

    • FILE 函数正是这里所需要的——完美!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 2021-05-28
    • 2017-11-12
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    相关资源
    最近更新 更多