2013-03-02 2 views
1

Привет У меня есть скрипт python, который изменяет файл конфигурации приложения. Чтобы применить это, мне нужно перезапустить приложение. Для этого я вызываю файл init.d. Но я должен быть root, когда я делаю это действие, иначе приложение не сможет привязать ее к порту. Также я не хочу выполнять все мои скрипты python с привилегиями root. Как выполнить перезапуск с правами root, а затем удалить их.привилегии изменения python для перезапуска внешнего приложения

Я установил разрешение пользователя в начале с:

if __name__ == "__main__": 
    uid = pwd.getpwnam('ubuntu')[2] 
    os.setuid(uid) 
    app.run(host='0.0.0.0', port=5001, debug=True) 

и в конце моего сценария мне нужно выполнить:

commands.getoutput('/etc/init.d/webapplication restart') 

WebApplication связывается на порту 80.

Если я выполнил свой сценарий с этой конфигурацией, веб-приложение не может начать и вернуть сообщение, «невозможно связать сокет на 80».

Любая идея? иметь чистое решение для выполнения только одной внешней команды с правами root на сервере Debian под сценарии python?

Thansk заблаговременно.

P.S: Я попытался использовать тот же метод, что и в моей основной функции, и я заменил пользователя «ubuntu» на «root», но он не работает.

+0

Пользователь, который хочет выполнить ваш файл, находится в списке аудиторов? Если ваш пользователь находится в списке sudoers, вы можете изменить ситуацию. Но вам нужны привилегии root для изменения/изменения служб Init. Вы попробовали добавить своего пользователя в корневую группу? – ManuParra

+0

related: [Есть ли способ для процессов без полномочий root привязываться к «привилегированным» портам (<1024) в Linux?] (Http://stackoverflow.com/q/413807/4279) – jfs

ответ

0

Окончание, чтобы достичь моей цели, я использую решение sudo. Для этого на сервере debian:

apt-get install sudo 
Edit: /etc/sudoers 
Add line: my_user(uses for the setuid) ALL = NOPASSWD : /etc/init.d/webapplication 
And in my python script: 
commands.getoutput('sudo /etc/init.d/webapplication restart')  

И что работает.

0

Вы можете использовать один из двух подходов:

  1. Создать программу, в которой только работа запустить init.d сценарий, и сделать его УИП корень. (Обязательно напишите это безопасно!). Основной скрипт работает с обычными разрешениями пользователей и вызывает бегун.

  2. У программы нет возможности перераспределять свои собственные привилегии (за исключением того, что работает sudo, что по меньшей мере так же дорого, как и подход 1), но программа, работающая от имени пользователя root, может дезактивировать себя. Таким образом, вы можете сделать несколько шагов как root, а затем продолжить как обычный пользователь, установив свой uid на реальный uid. Это не будет никакой помощью, если вам понадобятся права root для последних вещей, которые программа выполняет.

+0

Спасибо за ваш ответ. Проблема в том, что только root может использовать setuid. На самом деле, если я запускаю свой основной скрипт с правами пользователя root, в начале скрипта я использую setuid с моим пользовательским пользователем. И в конце мой скрипт я вызываю еще один модуль, который пытается настроить пользователя root. Хорошо с этим методом у меня есть ошибка при выполнении второго setuid: «OSError: [Errno 1] Операция не разрешена» – Matt

+0

Извините, я не понимаю, что вы пытаетесь сказать.Но да, только root может изменить uid, вот что я объяснил. Используйте один из подходов, которые я предлагаю. – alexis

Смежные вопросы