2009-10-28 2 views
3

Можно ли запросить root-файл без сохранения в памяти моего скрипта и запустить некоторые команды os. * Как root?Как выполнить os. * Методы как root?

Мой сценарий

  1. сканирует некоторые папки и файлы, чтобы проверить, если он может сделать работу
  2. вносит некоторые изменения в/и т.д./...
  3. создает папки и файлы, которые должны находиться в собственности пользователем, который запускал сценарий

(1) может быть выполнен как обычный пользователь. Я могу сделать (2), выполнив сценарий, но тогда папка и файлы в (3) будут root.

Проблема в том, что я использую много os.makedirs, os.symlink и т. Д., Что мешает мне сделать ее работоспособной обычным пользователем.

Танки 2 все для предложений

Решение до сих пор является:

# do all in sudo 
os.chown(folder, int(os.getenv('SUDO_UID')), int(os.getenv('SUDO_GID'))) 

благодаря gnibbler за подсказку.

+2

Вам нужно будет создать папки и файлы с правами root, а затем использовать 'os.chown', чтобы сменить владельца правильному пользователю. –

+0

Это сработало! os.chown (путь, pwd.getpwnam (os.getenv ('SUDO_USER')) [2]) –

ответ

1

gnibbler дало оценку os.chown. Проблема заключалась тогда в том, чтобы узнать идентификатор пользователя, стоящего за sudo.Эта информация хранится в переменных окружения SUDO_*:

os.chown, (some_path, int(os.getenv('SUDO_UID')), int(os.getenv('SUDO_GID'))) 

Нарезка код в 3-х файлов может быть решением, но код уже смешанный, так что это не подходит.

2

Возможно, вы можете поместить (2) в отдельный скрипт, скажем script2.py, а в главном скрипте вы вызываете sudo script2.py с popen?

Этот способ только (2) будет выполнен как корень.

+0

Если не будет другого способа, я попробую, но теперь (1) и (2) смешиваются немного. –

1

Считаете ли вы использование Linux PAM? Вы можете захотеть взглянуть на Linux-PAM Application Developers' Guide и Python API for PAM

+0

Интересная вещь, спасибо, но слишком сложная в этом случае, ИМО. –

+0

:) Мне тоже было интересно. Но в любом случае, вы можете иметь в виду более сложные потребности. Спасибо за +1. – 2009-10-28 11:23:40

2

yourscript.py:

run_part_1() 
subprocess.call(['sudo', sys.executable, 'part2.py']) 
run_part_3() 

part2.py:

run_part_2() 
1

Вы должны выполнить сценарий как корень и сделать соответствующие изменения разрешений на (3) с использованием os.chmod и os.chown.

Возможно, вам удастся выполнить другой скрипт с правами root через sudo, но это также потребует сохранения пароля пользователя в скрипте для перехода к sudo, что является ужасной идеей с точки зрения безопасности.

Таким образом, ваша проблема заключается в получении правильных разрешений на некоторые файлы/папки. Во-первых, введите или скопируйте UID/имя пользователя вашего обычного пользователя. Затем используйте os.chown, чтобы изменить владельца, и os.chmod, чтобы изменить разрешения. Существуют также альтернативные методы chown/chmod в пакете os, которые вы должны посмотреть: http://docs.python.org/library/os.html

Последнее замечание: вам не нужно беспокоиться о разрешениях символических ссылок. У них есть разрешения того, на что они указывают.

+0

Не нужно жестко кодировать то, что я могу получить с os.getenv ('SUDO_UID'). –

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