我已经放弃尝试使用 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 中有效...
谢谢!
斯特凡