我在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;
}
在客户端返回是OK但是没有执行命令行。为什么?请帮忙。我堆积了
答案 0 :(得分:1)
我假设该命令实际上正在运行但它无法连接到Asterisk并发出reload命令,因为运行Web服务器的用户无权连接到Asterisk。
两种解决方案。建议使用第一个。
配置sudo
以允许Web服务器用户以asterisk -rx reload
用户身份执行特定命令“asterisk
”:
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服务器执行潜在危险操作的权限。