Обратные галочки '' в команде эха порождают процесс, и она производится, заменен в командную строку эха. Вы видите это с, например.
echo "`tput setaf 1`" | hexdump -C
00000000 1b 5b 33 31 6d 0a |.[31m.|
Это работает потому что содержание "..."
расширены прежде чем быть переданным эху.
sed управляют, чтобы Вы использовали, переносит все в '
таким образом, это передается sed без расширения, и sed рассматривает все это как буквенный текст.
Можно зафиксировать это путем помещения "" вокруг команды sed
echo "foo" | sed -e "s/\(foo\)/`tput setaf 1`\1`tput op`/g"
У Вас также была ошибка в Вашей команде sed. (
и )
потребность, которой оставят \(
и \)
обозначить помнивший шаблон. У меня есть также никогда использование \0
Я всегда использовал \1
как первый помнивший шаблон.
Ваша sudoers строка корректна в этом, она только позволяет www-данным выполнять одну команду как корень. php синтаксис выглядит главным образом корректным (Вы проверяете $num, чтобы удостовериться, что это - число? разные символы могут нанести реальный ущерб здесь. см. http://us3.php.net/manual/en/function.escapeshellcmd.php), две вещи, которые Вы не упоминали, был, какие апачские mpm - Вы использование и являются Вами работающий php в безопасном режиме. shell_exec не работает в безопасном режиме, и он использует ветвление, которое не может работать со всем mpm's. Я рекомендовал бы использовать предварительное ветвление mpm.
Да, я думаю, что это - действительно плохая идея добавить апачские пользовательские www-данные к списку sudoers, особенно потому что Вы включаете переменную $num
в Вашем коде, который мог серьезно вредить Вашему серверу, если неправильно введено (особенно, если используется sudoer пользователем).
Я предложил бы вместо этого создать новую группу, добавить www-данные к той группе и присвоиться /home/xbian/433Utils/RPi_utils/codesend
группе. Затем дайте полномочия codesend
выполняться всеми членами той группы; Вас нельзя попросить никакого пароля, и Ваша система будет защищенной.
Разрешить пользователю www-data запускаться для запуска program1 и program2 без пароля:
sudo visudo
Добавьте к содержимому файла sudoers:
User_Alias WWW_USER = www-data
Cmnd_Alias WWW_COMMANDS = /sbin/program1, /sbin/program2
WWW_USER ALL = (ALL) NOPASSWD: WWW_COMMANDS
Save.
из https://askubuntu.com/questions/76920/call-a-shell-script-from-php-run-as-root