1

我已经放弃尝试使用 system() 来调用带有来自 Asterisk 13 的参数的 BASH 脚本。

结果在 Asterisk 13.22.0 System() 下有效,但前提是您不尝试将任何参数传递给被调用的脚本。

这有效,并且可靠地调用脚本:

same=>n,System(/bin/bash /usr/src/bash/setData.sh)

但是,当您执行此操作时:

same=>n,System(/bin/bash /usr/src/bash/setData.sh ${CHANNEL(accountcode)})

你得到

WARNING[30982][C-00000238] app_system.c: Unable to execute '/usr/src`/bash/setData.sh'`

因此,我尝试使用 SHELL() 来做我试图用 SYSTEM() 做的事情。

这也不起作用,因为 SHELL() 显然只能解析发送给它的字符串中的一个星号参数。其余的都作为空白发送。

如果我这样做:

same=>n,Set(nothing=${SHELL(/usr/src/verdi/bash/verdiLogIncomingCall.sh NA 201807270838t49hgzs SIP/centra-out-00006d9a IN SIP/3027-00006db1 SIP/3027-00006db1 ApiLogIncomingCall.java 1)})

该脚本在拨号计划执行时看到:

[root@acasterisk bash]# cat passed_param.txt
http://127.0.0.1/api/logIncomingCall?account_reference=NA&call_reference=201807270838t49hgzs&originating_channel_id=SIP/centra-out-00006d9a&direction=IN&requested_endpoint=SIP/3027-00006db1&caller_id=SIP/3027-00006db1&sourced_from=ApiLogIncomingCall.java&successfully_sent_to_server=1
[root@acasterisk bash]#

例如。所有参数都存在 - 因为不需要解析变量引用。

如果我使用这个:

[macro-verdianswer]
exten=>s,1,NoOp(Entering Verdi answer macro - picked up by ${CHANNEL}) 
same=>n,NoOp(Source Channel: ${sourceChannel}) 
same=>n,NoOp(Answering Channel: ${CHANNEL}) 
same=>n,NoOp(Lodging CDR accountcode: ${curIncAccCode} as an incoming call from ${numbersource} with VerDi and answered by ${CHANNEL}...)
same=>n,Set(CHANNEL(accountcode)=${curIncAccCode})
same=>n,Set(nothing=${SHELL(/usr/src/verdi/bash/verdiLogIncomingCall.sh NA ${curIncAccCode} ${sourceChannel} IN ${CHANNEL} ${numbersource} ApiLogIncomingCall.java 1)})
same=>n,MacroExit()

在执行时给出这个:

-- SIP/3002-000070c2 answered SIP/centra-out-000070bf
    -- Executing [s@macro-verdianswer:1] NoOp("SIP/3002-000070c2", "Entering Verdi answer macro - picked up by SIP/3002-000070c2") in new stack
    -- Executing [s@macro-verdianswer:2] NoOp("SIP/3002-000070c2", "Source Channel: SIP/centra-out-000070bf") in new stack
    -- Executing [s@macro-verdianswer:3] NoOp("SIP/3002-000070c2", "Answering Channel: SIP/3002-000070c2") in new stack
    -- Executing [s@macro-verdianswer:4] NoOp("SIP/3002-000070c2", "Lodging CDR accountcode: 2018072709061hrriyu
    --  as an incoming call from xxxxxxxxxx with VerDi and answered by SIP/3002-000070c2...") in new stack
    -- Executing [s@macro-verdianswer:7] Set("SIP/3002-000070c2", "nothing=Incoming call NOT stored. Contact software support.
    -- ") in new stack

例如,我的变量已填充,如果我不操作它们,它们就有值。

在这种情况下,通过 SHELL() 调用的脚本会看到:

[root@acasterisk bash]# cat passed_param.txt http://127.0.0.1/api/logIncomingCall?account_reference=NA&call_reference=2018072709061hrriyu&originating_channel_id=&direction=&requested_endpoint=&caller_id=&sourced_from=&successfully_sent_to_server=

例如。SHELL() 显然只解析作为字符串传递给它的 FIRST Asterisk 变量,而从不解析后续变量引用。

任何人都可以确认或提出解决方案吗?

我迫切需要能够以某种方式执行外部 BASH 脚本并将多个参数传递给它们。在 1.8 中没有任何东西在 13 中有效...

谢谢!

斯特凡

4

1 回答 1

0

这是我的一个相关问题,其原因完全相同,并以完全相同的方式解决

好的,这就解决了。

原来问题是我传递给 Asterisk 13.22.0 SHELL() 拨号计划函数的变量之一包含换行符(\n 或十六进制 0x0a)字符。

这也恰好是我传递给 SHELL() 调用的第一个变量。

所以看起来 SHELL 只解析了一个参数 - 它是 - 但它没有解析以下参数并为 Asterisk 通道数据评估它们的原因是第一个 Asterisk 13.22.0 通道变量 I 中存在这个尾随 \n正在传递给 SHELL()。

解决这个问题很简单,我只是从第一个 Asterisk 通道变量中删除了尾随 \n 传递给 Asterisk 13.22.0 中的 SHELL() ,并且 SHELL() 开始按预期工作。

因此,对于 SYSTEM() 和 SHELL() 应用程序,Asterisk 1.8 和 Asterisk 10 / 11 / 12 / 13 之间的密切区别显然是,如果在传递给 SYSTEM() 和 SHELL() 的参数字符串中评估任何参数引用,则解析并且对所述 SYSTEM() 或 SHELL() 参数字符串的评估在遇到换行符的地方停止。

所以我所要做的就是,在生成 UUID 的脚本中,我作为第一个参数传入 - 它破坏了 SYSTEM() 和 SHELL() - 是省略尾随 \n。

我的脚本从 BASH 发送了这样的数据:

echo $uuid

我所要做的就是把这条线改成

echo -n $uuid

在 UUID 生成器 BASH 脚本中。

完成后,Asterisk 13.22.0 SYSTEM() 和 SHELL() 拨号方案应用程序和拨号方案功能开始像在最初开发代码的 Asterisk 1.8.32.3 中那样运行和工作。

因此,在使用 Asterisk 13 及更高版本时,请注意任何换行 - 特别是在解析和评估的通道变量引用中 - 隐含在发送到 SYSTEM() 或 SHELL() 的参数字符串中 - 显然它们会在他们停止解析和评估变量的那一刻遇到 \n 或换行符。

据我所知,1.8.32.3 及以下版本的 Asterisk 并非如此。

希望这可以帮助某人。

于 2018-07-27T15:06:59.190 回答