OmanDebian
30.05.2015 - 22:41
Всем привет! Есть задача написать некую штуковину которая будет заставлять перечитывать апач свои виртуальные хосты, данная вещь должна вызываться из php в виде класса, ну например $this->блабла->блабла('reload'); что там дальше будет уже второстепенно, будет ли его релоадить баш, сишный скрипт и т.д.
Апач висит на xampp, перечитывает виртуальные хосты в терминале вот такой командой /opt/lampp/lampp reload, ну и в общем упираюсь я в права, не дает мне мне сделать это обычной exec функцией. Много что перепробовал и копался в исходниках как webmin, ну в общем не хватает мне мозга это сделать. Не прошу помощи за бесплатно, пишите цену. Также нужен будет мануал по установки или настройки вашего скрипта (объяснение).
AllesKlar
30.05.2015 - 23:37
Apache - это обычный сервис (на языке народностей Гейтс - служба)
Следовательно, тебе всего лишь нужно написать скрипт, который будет перестартовывать службу (иначе изменения в конфигах не вступят в силу)
И вопрос тут не в скрпте, а, как ты уже правильно заметил, в правах.
Тебе нужно дать пользователю, под которым запущен апач дать права на перезапуск службы apache2.x
Как это сделать - лучше спросить на форуме мелкомягких-админов
_____________
[продано копирайтерам]
OmanDebian
31.05.2015 - 01:25
AllesKlar
Благодарю за ответ, присваивать права на управление апачем с того пользователя который сидит сам на апаче тобиш на 80 порту это не безопасно)
killer8080
31.05.2015 - 01:31
OmanDebian
речь идёт о винде или линуксе?
OmanDebian
31.05.2015 - 01:32
Linux centos 6
killer8080
31.05.2015 - 01:41
OmanDebian
тогда просто скомпили на C простой пускач, с захардкоденой командой перезапуска апача. Установи его владельца рутом, выстави SUID бит, группу выстави тем пользователем, под которым будет работать PHP, права на запуск только владельцу и группе. И всё, вызывай его из PHP.
OmanDebian
31.05.2015 - 01:48
Эмм у меня нулевое знание Си)), с баш так делал но не пускает все равно. Если можно есть пример что должно быть внутри файла на Си, скомпилить я думаю смогу
killer8080
31.05.2015 - 01:57
Цитата (OmanDebian @ 31.05.2015 - 00:48) |
Эмм у меня нулевое знание Си)), с баш так делал но не пускает все равно. Если можно есть пример что должно быть внутри файла на Си, скомпилить я думаю смогу |
на баш нельзя ставить suid, он ставится только на бинарники
ну самое простое
int main() {
system("/opt/lampp/lampp reload");
}
сохраняешь это в файл допустим restart.c
компилим
gcc restart.c -o restart
если все нормально, после компиляции появится файл с именем restart.
Ну а с chown chmod-ами думаю сам разберёшся
OmanDebian
31.05.2015 - 01:59
killer8080 Благодарю! Завтра попробую и отпишусь
killer8080
31.05.2015 - 02:07
OmanDebian
учти что после вызова перезагрузке дальнейшая работа php скрипта может прерваться из-за перезагрузки апача
OmanDebian
31.05.2015 - 02:10
Вроде не должно, он сам то не перезагружается а перечитывает конфигурации, но хотя не знаю) не мне спорить
AllesKlar
31.05.2015 - 02:12
OmanDebian
Цитата |
Апач висит на xampp |
![blink.gif](http://phpforum.su/html/emoticons/blink.gif)
Даже предположить не мог
_____________
[продано копирайтерам]
killer8080
31.05.2015 - 02:13
Цитата (OmanDebian @ 31.05.2015 - 01:10) |
Вроде не должно, он сам то не перезагружается а перечитывает конфигурации, но хотя не знаю) не мне спорить |
возможно, но лучше перестраховаться, чтоб скрипт после вызова этой команды не делал ничего важного.
Спустя 14 минут, 35 секунд killer8080 написал(а):
самому стало интересно, потестил, все таки рестарт рубит все процессы не дожидаясь завершения, что в общем то естественно.
OmanDebian
31.05.2015 - 12:34
Итак друзья я сделал больше чем хотел, объединив 2-е мысли 2-х людей за это им низки поклон. killer8080 с форума phpforum.su и DeepVarvar с форума forum.php.su.
Итак что же я сделал:
Установил утилиту Inotify которая которая может отслеживать изменение в фалах или каталогах.
создал файла update.sh и задал на наго пользователя из под которого работает apache в моем случае это daemon, со следующим содержимым:
#!/bin/sh
while inotifywait -e modify /domain; do
if tail -n1 /domain | grep 1; then
/restart.c
fi
done
Где:
while inotifywait -e modify /domain; запускает некий цикл который мониторит всегда файл domain
if tail -n1 /domain | grep 1; Проверяет наличия появившейся 1 в данном файле
Если появилась единица то /restart.c
Создал файл restart.c с содержимым
int main() {
system("/opt/lampp/lampp reload");
}
скомпилил командой gcc restart.c -o restart
Дал права только для root что прямого доступа другие не получили
Далее запускаем скрип обычным php exec('./update.sh'), все пошел мониторинг файла domain, теперь всегда скрипт update.sh ждет изменения в файле domain.
Далее на другом сервере из под обычного php по ftp правлю файл domain пишу в его 1 и та да! Срабатывает update.sh, и дальше он запускает restart.c.
Все готово! Осталось только привести это в нужный вид, ибо это черновой рабочий вариант. Мы получили возможность даже удаленного reload виртуальных хостов, т.е. управлять перезагрузкой с абсолютно другого сервера.
Сразу хочу сказать что данная штуковина не работает если включен selinux (долго парился по чему же не работает), пока не разобрался как мне разрешить это все в selinux по этому пока что его отключил.
killer8080
1.06.2015 - 21:28
Цитата (OmanDebian @ 31.05.2015 - 11:34) |
Если появилась единица то /restart.c |
restart.c это исходник, запускать нужно restart
Цитата (OmanDebian @ 31.05.2015 - 11:34) |
Дал права только для root что прямого доступа другие не получили |
а как же ты его тогда из php запускаешь?
![user posted image](http://phpforum.su/html/emoticons/smile.gif)
Вообще я подразумевал так (здесь
www-data юзер под которым исполняется php скрипт)
# gcc restart.c -o restart && chown root:www-data restart && chmod 4110 restart
суть была в suid-е, запускает программу обычный пользователь, а работает она под root-ом
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.