У меня были похожие проблемы с получением C-программы, которая управляет RF-передатчиком на моем Raspberry, работающей с php exec (я использую nginx).
Я использовал C-программу, основанную на следующем учебник по малиновым беспроводным розеткам Возможно, была проблема с аутентификацией, но я мог ее решить, только выполнив следующие шаги.Без Python я мог бы выполнить php, но не получил ни результата, ни ошибки.
Я сделал небольшой обход и использовал скрипт Python для запуска C-программы, и теперь он работает:
Скрипт Python принадлежит пользователю(кто входит в группу sudo): пользователи, права доступа 744
#!/usr/bin/python3.5
import subprocess
import sys
from subprocess import call
if len(sys.argv) != 2:
print('invalid numbers of arguments. Script will be terminated.')
else:
print('used argument:', sys.argv[1])
subprocess.call(["/path/to/myC_Program", sys.argv[1]]);
Для тестирования скрипта Python вы можете использовать вместо subprocess.call
# subprocess.check_call(["/path/to/myC_Program 1"]); this returns "no such file"
# subprocess.check_call(["/path/to/myC_Program", "1"]);this returns the echo of the C-program"`
с
sudo visudo
Я добавил
www-data ALL=(ALL) NOPASSWD: /path/to/myC_Program, NOPASSWD: /path/to/mypythonscript.py
Мой php-файл "light_via_browser.php" (принадлежит root, права доступа 644) вызывает Python-скрипт с аргументом "temp":
<!doctype html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=2, maximum-scale=6.0, minimum-scale=2">
<title>Light Control</title>
</head>
<script>
</script>
<style>
div[type="normal"] {
clear: left;
width: 32vw;
height: 1vw;
background-color:transparent;
}
div[type="inp_left1"] {
height:11vw;
width: 11vw;
padding: 0vw;
float:left;
margin-left: 4vw;
display:inline;
border: 1px solid silver;
background-color:grey;
}
div[type="inp_left2"] {
height:11vw;
width: 11vw;
padding: 0vw;
float:left;
margin-left: 1vw;
display:inline;
border: 1px solid silver;
background-color:grey;
}
input[type="submit"] {
width: 6vw;
font-size: 4vw;
margin-left: 2.5vw;
margin-top: 2vw;
padding: 1vw 1vw;
font-family: Roboto, sans-serif;
font-weight: 400;
color: teal;
border: 1px solid silver;
background-image: linear-gradient(to top, gainsboro 0%, white 90%);
border-radius: 2vw;
}
</style>
<body>
<h3>Lighting Control:</h3>
<form style='width: 48vw' method="get" action="light_via_browser.php" >
<div type="inp_left1">
<input type="submit" value=1 name="one" >
</div>
<div type="inp_left2">
<input type="submit" value=2 name="two">
</div>
<div type="inp_left2">
<input type="submit" value=3 name="three">
</div>
<div type='normal' style='position: relative'>
</div>
<div type="inp_left1">
<input type="submit" value=4 name="four">
</div>
<div type="inp_left2">
<input type="submit" value=5 name="five">
</div>
<div type="inp_left2">
<input type="submit" value=6 name="six">
</div>
<div type='normal' style='position: relative'>
</div>
<div type="inp_left1">
<input type="submit" value=7 name="seven">
</div>
<div type="inp_left2">
<input type="submit" value=8 name="eight">
</div>
<div type="inp_left2">
<input type="submit" value=9 name="nine">
</div>
<div type='normal' style='position: relative'>
</div>
</form>
<?php
if(isset($_GET['one'])){
$temp = (string)$_GET['one'];
}else if(isset($_GET['two'])){
$temp = (string)$_GET['two'];
}else if(isset($_GET['three'])){
$temp = (string)$_GET['three'];
}else if(isset($_GET['four'])){
$temp = (string)$_GET['four'];
}else if(isset($_GET['five'])){
$temp = (string)$_GET['five'];
}else if(isset($_GET['six'])){
$temp = (string)$_GET['six'];
}else if(isset($_GET['seven'])){
$temp = (string)$_GET['seven'];
}else if(isset($_GET['eight'])){
$temp = (string)$_GET['eight'];
}else if(isset($_GET['nine'])){
$temp = (string)$_GET['nine'];
}
switch ($temp) {
case 9:
$gpio_cmd = "whoami";
break;
default;
$gpio_cmd = "sudo python3.5 /path/to/mypythonscript.py $temp";
}
exec($gpio_cmd,$output,$status);
if (0 === $status) {
$result = sizeof($output);
switch ($temp) {
case 9:
$msg = "just a test:";
echo "<a>$msg</a><br>";
echo "current user is <br>'$output[0]'<br>";
break;
default;
switch ($output[0]) {
case 3092898:
$lamp = "entree";
break;
case 3092900:
$lamp = "shop";
break;
case 3092904:
$lamp = "rear";
break;
case 8344209:
$lamp = "garden";
break;
case 5084072:
$lamp = "Num";
break;
case 15631240:
$lamp = "NA";
break;
case 15631250:
$lamp = "rear";
break;
case 15631256:
$lamp = "shop";
break;
default;
}
$msg = "$output[0]: $lamp";
echo "$msg<br>";
}
} else {
echo "Command failed with status: $status";
}
?>
</body>
</html>
$ result возвращает длину массива $ output.Можно манипулировать / отображать все элементы в этом массиве.
Ниже скриншота браузера, показывающего кнопки и две переменные в качестве возвращаемого результата после нажатия кнопки:
Вы можете попробовать, мне интересно, такой подходрешил и вашу проблему.Приветствия.