我有一个被网站调用的php文件:
示例:serial_tx.php?v = W100
在php内,我写了一个日志文件,可以看到我收到的字符串v(在这种情况下为W100)。
Web服务器托管在Raspberry Pi上,应将此数据发送到uart。
文件位置:
/SCRIPTS/serial_tx.php
/SCRIPTS/c/jmsend/serial_tx // the executable, compiled from a C script
如果我位于网络服务器的根目录中,并且从我的Pi控制台运行
sudo /var/www/html/SCRIPTS/c/jmsend/serial_tx W100
我正确发送了命令。
我使用系统,shell_exec和exec尝试的php文件没有成功。
shell_exec("sudo /var/www/html/SCRIPTS/c/jmsend/serial_tx ".$ric);
$ric
是收到的命令。
我也尝试了不同的路径设置(从Pi根目录或Web服务器根目录开始)。
所有文件的权限均为777。
答案 0 :(得分:0)
/etc/sudoers
中的类似内容应可以使您的Web服务器用户运行该特定命令而不会出现问题:
Cmnd_Alias SERIAL = /var/www/html/SCRIPTS/c/jmsend/serial_tx *
www-data ALL=(ALL) NOPASSWD: SERIAL
请注意,您必须 escape user input,然后再使用它:
$ric = escapeshellarg($_GET["v"]);
shell_exec("sudo /var/www/html/SCRIPTS/c/jmsend/serial_tx $ric");
您还应该注意exec()
和shell_exec()
之间的区别,特别是您无法使用shell_exec()
检查失败。
$ric = escapeshellarg($_GET["v"]);
exec("sudo /var/www/html/SCRIPTS/c/jmsend/serial_tx $ric", $output, $return);
if ($return !== 0) {
// let the user know something didn't work
}
这当然假设您的可执行文件被编写为返回适当的错误代码。