首页 > 解决方案 > 非 root 用户的星号 CLI

问题描述

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

dialplan reload

所以如果我想从网络应用程序重新加载拨号方案,我应该在某个地方运行:

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

标签: phpcentos7asteriskpbx

解决方案


您可以使用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);
    }
?>


推荐阅读