3

我是新手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 命令行手动运行它时,它正在工作。我想从拨号计划运行它并在变量中使用返回的值,我什么也没得到(没有返回值)

我的星号版本是 Asterisk 1.6.2.20

4

5 回答 5

4

您的拨号计划不起作用,因为星号在星号用户下运行并且无法读取根目录中的脚本。要解决脚本问题,我建议停止星号并在控制台中启动它

asterisk -vvvgc 

这样您将看到脚本生成的错误。

由于 shell 启动和 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})

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

于 2013-01-05T01:54:19.383 回答
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*
于 2013-01-03T18:02:13.573 回答
0

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

于 2013-01-03T19:28:47.243 回答
0

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

chown星号/文件夹

chgrp 星号/文件夹

另请记住,您可以像这样运行命令:

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

于 2014-08-20T07:44:39.600 回答
0

还要始终确保您的星号用户确实有外壳。

cat /etc/passwd | grep asterisk

就我而言,出于安全原因,我有 /bin/false 。所以下面的命令不起作用:

su asterisk -c 'whoami'
于 2014-10-02T12:21:38.820 回答