Имеется весьма капризная консольная программа linphonec, которая умеет работать только от обычных пользователей. Ей для работы нужен каталог пользователя, она стартует только если есть файлы конфигурации:
~/.linphonerc
~/.linphone-zidcache
~/.config/linphone/linphonerc - (кусок GUI-программы, но без него не работает консольная)
Соответственно, запустить такую программу от системного пользователя www-data не представляется возможным. Видимо потому что у него не предусмотрено каталога пользователя, я в этом плохо разбираюсь. Поэтому нужно переключиться на пользователя, под которым она гарантированно работает, и выполнить ее. В моем случае это пользователь xi.
Точнее, надо выполнить не эту программу, а PHP-скрипт, в котором используются вызовы linphonec. Причем скрипт имеет параметры. И выполнить такой скрипт надо без запроса пароля пользователя xi. Сами вызовы скрипта выглядят примерно так:
php myScript.php sipnet.ru 0045123 notify
php myScript.php siplink.pro 9812345 about
Я поигрался с настройками в /etc/sudoers, и прописал там:
www-data ALL = (xi:xi) NOPASSWD:/usr/bin/php
vasya ALL = (xi:xi) NOPASSWD:/usr/bin/php
Пользователя vasya я завел чтобы тестить запуск. Для теста я работаю под пользователем vasya.
В результате, я могу вызывать саму команду php:
sudo -u xi "php"
И она выполняется без запроса пароля. Но если я задам хоть один параметр, то команда не выполняется, и еще требуется пароль текущего пользователя. Например:
$ sudo -u xi "php --version"
[sudo] пароль для vasya:
sudo: php --version: command not found
Вместо «php --version» я пробовал писать «/usr/bin/php --version», результат тот же.
Я так понимаю, что это происходит из-за того, что в sudoers можно настроить только вполне конкретные вызовы программ. А если у программ есть параметры, то в sudoers надо прописывать именно с параметрами, чтобы не запрашивался пароль. Но ведь невозможно прописать в sudoers все возможные значения параметров, они же заранее неизвестны.
В связи с чем вопрос: как выполнить скрипт с параметрами, от другого пользователя, не вводя пароль?