正在 raspbian 从 PHP 执行 bash 脚本
Executing bash script from PHP on raspbian
我有一个脚本调用 fswebcam 来使用我的 USB 相机捕捉 jpg。我已经使用 "chmod +x webcam.sh" 使其可执行:
文件:/var/www/html/webcam.sh
#!/bin/bash
DATE=$(date + "%Y-%m-%d_%H%M")
fswebcam -r 640x480 /home/pi/webcam/$DATE.jpg
这在没有 sudo 的命令行中工作正常,所以我制作了一个小 PHP 页面:
文件:/var/www/html/index.php
<?php
$output = shell_exec('sh /var/www/html/webcam.sh');
echo "<pre>$output</pre>";
?>
当我进入网页时,我只看到一个空白页面,并且在我的网络摄像头文件夹中没有创建任何 jpg。
我收到以下错误:
Apache2 error log
所以我尝试将 PHP 中的调用修改为:
<?php
$output = shell_exec('/usr/bin/sudo /bin/bash /var/www/html/webcam.sh');
echo "<pre>$output</pre>";
?>
我还将以下内容添加到 sudoers 文件
www-data ALL=NOPASSWD: /path/to/script
但我仍然得到错误:apache2 log error
我已经尝试了这个线程中的所有内容:How to run .sh script with php?
你有什么想法吗?
提前致谢,
维克多
首发:
- 如果没有非常的充分理由,请不要使用 sudo。
sh
不一定调用 bash
.
sudo
需要密码,但您没有提供密码,因此出现错误。
我建议尝试使用 exec
而不是 shell_exec
(两者之间存在差异):
<?php
exec('/var/www/html/webcam.sh', $output, $exitCode);
echo 'Exit code: '.$exitCode.' <hr />';
echo implode('<br />', $output);
您的问题的另一个来源可能与权限相关:
网络服务器通常以不同的用户身份运行。
确保网络服务器确实可以写入输出目录。
我有一个脚本调用 fswebcam 来使用我的 USB 相机捕捉 jpg。我已经使用 "chmod +x webcam.sh" 使其可执行:
文件:/var/www/html/webcam.sh
#!/bin/bash
DATE=$(date + "%Y-%m-%d_%H%M")
fswebcam -r 640x480 /home/pi/webcam/$DATE.jpg
这在没有 sudo 的命令行中工作正常,所以我制作了一个小 PHP 页面:
文件:/var/www/html/index.php
<?php
$output = shell_exec('sh /var/www/html/webcam.sh');
echo "<pre>$output</pre>";
?>
当我进入网页时,我只看到一个空白页面,并且在我的网络摄像头文件夹中没有创建任何 jpg。
我收到以下错误: Apache2 error log
所以我尝试将 PHP 中的调用修改为:
<?php
$output = shell_exec('/usr/bin/sudo /bin/bash /var/www/html/webcam.sh');
echo "<pre>$output</pre>";
?>
我还将以下内容添加到 sudoers 文件
www-data ALL=NOPASSWD: /path/to/script
但我仍然得到错误:apache2 log error
我已经尝试了这个线程中的所有内容:How to run .sh script with php?
你有什么想法吗?
提前致谢,
维克多
首发:
- 如果没有非常的充分理由,请不要使用 sudo。
sh
不一定调用bash
.sudo
需要密码,但您没有提供密码,因此出现错误。
我建议尝试使用 exec
而不是 shell_exec
(两者之间存在差异):
<?php
exec('/var/www/html/webcam.sh', $output, $exitCode);
echo 'Exit code: '.$exitCode.' <hr />';
echo implode('<br />', $output);
您的问题的另一个来源可能与权限相关:
网络服务器通常以不同的用户身份运行。
确保网络服务器确实可以写入输出目录。