Я хотел бы написать страничку для управления парой сервисов на сервере под Linux. Мне для этого необходимо выполнять команды shell (естественно, НЕ от пользователя apache) и обрабатывать/отображать их вывод. Подскажите, пожалуйста, что посмотреть из документации или еще лучше -- какой-нибудь небольшой примерчик.
Кому интересно -- нашел хороший пример: программа PHPShell (http://mgeisler.net/php-shell), которая практически эмулирует консоль. Остался один нерешенный вопрос, как мне выполнить команды системы от root'а или же любого другого пользователя отличного от пользователя apache (я так понял, что php-скрипты выполняются с его правами) P.S. научившихся пользоваться командой "man" заранее благодарю и попрошу свой интеллект проявить в соседней ветке...
mvictorl А почему бы не добавить пользователя в группу, которой разрешено выполнение нужных вам программ?
С большой радостью,.. только какого пользователя?! И про какие группы мы говорим? -- Если про sudo'шные, то я просто этой программой никогда не пользовался (не было необходимости).
Вообще-то я ожидал чего-то большего от этого форума... :-( Я не хочу показаться наглым, но кусок такого элементарного кода (конечно же для того, кто это реально сам писал) выложить-то и некому!.. мда...
Того пользователя, от которого запускается Apache в вашей системе. Про стандартные группы в unix-системах. Никаких sudo'шных групп не существует. Все группы прописаны в /etc/groups. Пользователи в /etc/passwd. В /etc/passwd же лежит список групп для каждого пользователя, в которые он входит. Вообще, странно, все программы в /bin и /usr/bin доступны для выполнения вообще всем. Поэтому, почему я не понимаю. Если эти программы должны запускаться только от рута, то лучше создать специальную группу, в которую надо будет добавить пользователя, от которого запускается apache, а самим запускаемым программам сделать chgrp на новую группу. Это существенно лучше, чем давать права рута, поскольку таким образом вы не даете доступ ко всей, системе, а только к тем программам, что необходимо выполнять. Возможно, никто не решал этот вопрос через задницу.
Была мысль дать такой же рассширенный ответ, но понял, что смысла нет Через задницу давать пользователю, от которого запускается apache, какие-либо дополнительные права для решения прикладных задач (проще вообще от root'а уже запускать, но почему-то так никто не делает, правда? Не знаете -- почему?..) Пользователи и группы в sudo есть!.. (достаточно взглянуть на его конфигуратор) А лично я пришёл к мнению, что чем вытягивать что-то вразумительное из таких же чайников, как я, проще перенести все на IIS, полистать MSDN и спокойненько написать на ASP'е используя "человеческий" язык (C++/C#)... На www.gotdotnet.ru, например, дурацких советов не дают, людям не в лом помочь другому, даже если он только начинающий. Скорее всего благодаря именно такой "дружественной" поддержке "открытого" сообщества MS вас и уделает!
Билл Гейтс останется доволен таким исходом. mvictory, если включить мозги, почитать что делает команда sudo, и выключить детские обиды, раздражительность и максимализм, то решение найдется само собой. Язык php прекрасно работает под Линукс. Это как хлеб и масло. Час разработчика стоит 750р, вам никто ничего не обязан давать на халяву в этой жизни.
Самый здоровый подход в безопасности - пессимистический. То есть, запрещено всё, что не разрешено явно. Я не знаю деталей почему вам необходим shell, но в общем абстрактном случае я бы запретил shell пользователю вебсервера, вместо этого в веб-скрипте создавал бы какие-то задания для "консольного" воркера - из предопределенного списка классов-заданий. Аккаунт для консольного воркера может в shell, естественно. Его можно добавить в ту же группу, в которой трудится веб-сервер (www-data) чтобы проще было давать разрешение на запись обоим двум. Думаю это разумный компромисс между усложнением и безопасностью. --- Добавлено --- Гуглить сочетания слов PHP queue job permission Придумать простой и наглядный пример та ещё задачка Приходит на ум деплой из git по web hook. Там где я сам это настраиваю, я делаю обработчик хука максимально простым: он только делает touch() чтобы просигналить потребность в деплое. Веб скрипт сам не выполняет команд. В то же время есть консольный скрипт по расписанию, который при обнаружении файла-флажка начинает git pull и всё прочее. Аккаунт входит в группу www-data и везде настроен umask чтобы члены группы могли писать.