将bash返回值转换为星号拨号方案

时间:2013-01-03 16:58:03

标签: bash shell asterisk

我是asterisk的新手,需要帮助。我有一个bash脚本,我需要从我的拨号计划运行并获取从它返回的值并将其放入我的拨号计划中的变量。

例如我的bash脚本是test.sh

#! /bin/bash

echo "61"

我的拨号计划:

exten => 3333,1,Set(result=${shell(/root/test.sh)}) 
exten => 3333,2,Verbose(result is: ${result})

该脚本具有777权限,当我从shell命令行手动运行它时,它正在运行。我想从dialplan运行它并在变量中使用返回的值,我什么都没有回来(没有返回值)

我的星号版本是Asterisk 1.6.2.20

5 个答案:

答案 0 :(得分:3)

您的拨号方案不起作用,因为asterisk在星号用户下运行,无法在根目录中读取您的脚本。要解决脚本问题,我建议停止星号并在控制台中将其作为

启动
asterisk -vvvgc 

这样你就会看到脚本产生的错误。

但是

由于shell start和agi脚本启动之间的cpu成本没有任何差异,我建议你使用AGI脚本。

为此,您已将脚本放在/ var / lib / asterisk / agi-bin /

#!/bin/bash

echo 'SET VARIABLE result "61" '

拨号方案

exten => 3333,1,AGI(test.sh) 
exten => 3333,2,Verbose(result is: ${result})

p.s最佳实践是不使用脚本,因为启动shell是高成本操作,它不能很好地扩展。大多数任务都可以在拨号方案中完成,包括复杂的检查和数据库查询/更新任务。

答案 1 :(得分:1)

尝试使用$ {SHELL(date)}来检查它是否有效。

来自我的extensions.conf:

exten => 4002,1,Answer
exten => 4002,n,Set(RESULT=${SHELL(date)})
exten => 4002,n,NoOp(${RESULT})
exten => 4002,n,Hangup

在调用4002之后从asterisk.log开始:

  == Using SIP RTP CoS mark 5
    -- Executing [4002@demo2:1] Answer("SIP/100-00000585", "") in new stack
    -- Executing [4002@demo2:2] Set("SIP/100-00000585", "RESULT=Thu Jan  3 20:00:08 EET 2013
") in new stack
    -- Executing [4002@demo2:3] NoOp("SIP/100-00000585", "Thu Jan  3 20:00:08 EET 2013
") in new stack
    -- Executing [4002@demo2:4] Hangup("SIP/100-00000585", "") in new stack
  == Spawn extension (demo2, 4002, 4) exited non-zero on 'SIP/100-00000585'*emphasized text*

答案 2 :(得分:0)

您是否启用了SELinux? SELinux通常会阻止对shell脚本的这种访问。

答案 3 :(得分:0)

在/ etc / asterisk /或星号具有permisions的其他文件夹中创建脚本:

chown asterisk / folder

chgrp星号/文件夹

另请注意,您可以像这样运行命令:

exten => 3333,1,Set(result = $ {shell(echo 61)})

答案 4 :(得分:0)

始终确保您的星号用户确实有一个shell。

cat /etc/passwd | grep asterisk

在我的情况下,出于安全原因,我有/ bin / false。所以以下命令不起作用:

su asterisk -c 'whoami'