非root用户的星号CLI

问题描述

我正在开发一个Web应用程序来管理我的星号服务器(添加扩展名,添加用于管理客户端的上下文等。)我正在使用PHP,Mysql来做到这一点,我使用数据库来添加客户端,但是对于扩展,我仍然使用文件extensions.conf。 假设我从Web应用程序向extensions.conf文件添加了许多扩展名,接下来我应该重新加载Dialplan,我知道的唯一方法是在Asterisk CLI中键入以下命令:

dialplan reload

因此,如果我想从Web应用程序重新加载拨号计划,我应该在某个地方运行:

shell_exec ( "asterisk -rx 'dialplan reload'" );

问题在于此命令asterisk -rx需要root特权。 有没有办法让apache用户运行此命令。

编辑:

这是我的/etc/asterisk/asterisk.conf文件的内容

[directories](!)
astetcdir => /etc/asterisk
astmoddir => /usr/lib/asterisk/modules
astvarlibdir => /var/lib/asterisk
astdbdir => /var/lib/asterisk
astkeydir => /var/lib/asterisk
astdatadir => /var/lib/asterisk
astagidir => /var/lib/asterisk/agi-bin
astspooldir => /var/spool/asterisk
[options]
astrundir => /var/run/asterisk
astlogdir => /var/log/asterisk
astsbindir => /usr/sbin
runuser = asterisk ; The user to run as. The default is root.
rungroup = asterisk ; The group to run as. The default is root

解决方法

您可以使用sudoers(不推荐)来允许特定用户的执行运行:

sudo asterisk -rx 'dialplan reload'

您可以从您的用户那里拨打电话,尽管如果这是您的网络用户,这很危险...

或者您可以使用AMI

要通过Asterisk Manager Interface (AMI)执行命令,您可以在manager.conf中创建用户,然后从PHP使用脚本进行身份验证并执行命令。示例:

<?php
    $socket = fsockopen("127.0.0.1","5038",$errno,$errstr,10);
    if (!$socket){
        echo "$errstr ($errno)\n";
    }else{
        fputs($socket,"Action: Login\r\n");
        fputs($socket,"UserName: myusername\r\n");
        fputs($socket,"Secret: mypassword\r\n\r\n");

        fputs($socket,"Action: Command\r\n");
        fputs($socket,"Command: dialplan reload\r\n\r\n");

        fputs($socket,"Action: Logoff\r\n\r\n");
        while (!feof($socket)){
            echo fgets($socket).'<br>';
        }
        fclose($socket);
    }
?>

,

您的命令不需要root特权。

检查/etc/asterisk/asterisk.conf中使用的文件和权限。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...