当您通过 SSH 连接到您的服务器时,这可能会起作用。网络服务器用户很可能与您登录的用户不同。网络服务器在 Linux 机器上运行的流行用户 ID/组是 http、www-data、nobody 等。
从这一点开始,您有两个选择。
您可以确保您尝试从 PHP 运行的脚本(以及它的所有子项,如果有的话)能够由网络服务器用户运行。
您可以修改您的 /etc/sudoers 文件,该文件使网络服务器用户可以访问以仅提升该脚本的权限。(注意:这可能会打开安全漏洞,所以要小心)。
要找出您的网络服务器运行的用户,请执行以下操作:ps aux
查看输出,输出中的第一列列出了该进程正在运行的用户。这是我的一个盒子上的网络服务器(nginx)的摘录:
www-data 26852 0.0 0.0 29768 3840 ? S Jun04 0:50 nginx: worker process
您可以在此处看到 nginx 以用户 www-data 运行。您还可以使用 grep 执行该命令,以帮助您更快地找到该过程。Grep 只会向您显示与您发送给它的内容相匹配的那些行。这是一个例子:ps aux | grep nginx
好的,现在您知道网络服务器正在以哪个用户身份运行,让我们尝试授予该用户对脚本的访问权限。假设您的脚本位于foo
并且位于/usr/local/bin
. 您将执行以下命令:
chown www-data /usr/local/bin/foo
更改文件的所有权后,尝试从您的 PHP 页面再次重新运行您的命令,看看它是否有效。
为了完整起见,我还说您可以授予您的网络服务器用户 sudo 对该文件的权限。为此,您需要将以下行附加到/etc/sudoers
文件底部:
www-data ALL= NOPASSWD: /usr/local/bin/foo
然后你的 shell_exec 命令可以切换到这个:
shell_exec('sudo /usr/local/bin/foo');
请记住,这样做将允许您的网络服务器用户运行脚本,因为root
这在各种情况下都非常危险。但是,相机可能需要提升权限才能工作。我不确定您尝试调用的相机设置的权限要求是什么。
祝你好运。希望这可以帮助!