我有一个在ubuntu服务器上运行的Web服务。这个Web服务有一个方法:
...
main()
{
soap_serve(soap_new());
}
ns_call(std::string who, std::string &result)
{
int j;
j=system ("asterisk -rx "reload"");
return SOAP_OK;
}
在客户端,返回是可以的,但命令行没有执行。为什么?请帮忙。我堆叠
我假设该命令实际上正在运行,但它无法连接到Asterisk并发出重载命令,因为运行web服务器的用户没有连接到Asterick的权限。
两种解决方案。推荐使用第一种。
sudo
配置sudo
以允许web服务器用户作为asterisk
用户执行特定命令"asterisk -rx reload
":
www-data (asterisk) NOPASSWD: /usr/sbin/asterisk -rx reload
然后将其用作传递给system()
:的命令
system("sudo -u asterisk /usr/sbin/asterisk -rx reload");
套接字权限
asterisk -r
使用UNIX域套接字连接到Asterisk服务器。插座的位置可能因系统而异,但要查找类似/var/run/asterisk.ctl
的东西。默认情况下,可能会设置此套接字的权限,以便只有asterisk
用户(或root)可以连接。
您需要安排web服务器用户具有对此套接字的读写权限。例如,您可以将套接字chmod
a+rwx
,以使系统上的任何用户都可以使用它。(如果系统上有不受信任的用户,请不要这样做!)或者,您可以将组写入权限授予此套接字,并将其chgrp
授予web服务器运行的组。
无论您如何操作,请注意,您正在为代表您的Asterisk服务器执行潜在危险操作授予权限。