Смена пользователя в питоне - PullRequest
5 голосов
/ 06 ноября 2011

Я пишу простой скрипт, который перезапускает подчиненное устройство hadoop.В сценарии я должен сделать некоторые начальные изменения как пользователь root.После этого мне нужно перейти к пользователю «hadoop» и выполнить набор команд.Я использовал os.system для запуска команд, но я сомневаюсь, что это работает хорошо.Например:

uid=pwd.getpwnam('hadoop')[2]
os.setuid(uid)
os.system('whoami')
os.chdir('/home/hadoop/hadoop/')
os.system('bin/hadoop-daemon.sh stop tasktracker')

Снова я должен выполнить некоторые команды от имени root после этого и снова стать пользователем "hadoop" и выполнить:

os.system('bin/hadoop-daemon.sh stop tasktracker')

У меня три вопроса здесь,

  1. Является ли os.system лучшей командой, которую я могу использовать для выдачи команд linux?

  2. Я могу перейти от пользователя root к пользователю hadoopпо приведенным выше командам, но я не могу перейти к пользователю root (я могу понять, что будут проблемы с безопасностью, если они позволят это, я хочу знать, есть ли возможность сделать это, по крайней мере, путем передачи пароля)?

  3. Работает ли os.setuid ()?whoami печатает пользователя hadoop, но процесс «tasktracker» не останавливается с помощью этих команд, но если я выполняю те же команды вручную, он работает нормально (я использую «su hadoop» вместо setuid, когда пытаюсь выполнить его вручную).*

Спасибо за вашу помощь.

  • Сетху

Ответы [ 4 ]

6 голосов
/ 06 ноября 2011

вы можете использовать:

os.system('sudo -u hadoop bin/hadoop-daemon.sh stop tasktracker')

или если у вас нет sudo, но есть su

os.system('su hadoop -c "bin/hadoop-daemon.sh stop tasktracker"')
3 голосов
/ 06 ноября 2011

Гораздо лучше использовать "su", чем переключать идентификатор пользователя с помощью os.setuid ().

Почему?

  • "su" правильно настроит учетные данные для входа, включая идентификатор группы и дополнительные группы
  • "su" также будет выполнять другие полезные действия, такие как установка переменных окружения (особенно, если вы используете su -). Может быть, он также установит пределы ulimit в соответствии с limit.conf.
1 голос
/ 06 ноября 2011

Этот вид сценариев может быть реализован намного чище с использованием библиотеки Fabric: http://docs.fabfile.org/en/1.3.1/index.html Кроме того, он предоставляет удобный интерфейс командной строки и возможности удаленного управления серверами через ssh. Весь Python доступен, так что вы можете подключиться к базам данных, например, или импортировать все, что вам нужно.

Точно вопрос о запуске команд другим пользователем может быть реализован командой sudo с пользователем arg: http://docs.fabfile.org/en/1.3.1/api/core/operations.html#fabric.operations.sudo

0 голосов
/ 06 ноября 2011

Я сам этого не делал, но вижу несколько os функций, которые могут применяться.Они начинаются здесь: http://docs.python.org/library/os.html#os.setegid

Кроме того, в списке преподавателей была тема, посвященная теме: http://mail.python.org/pipermail/tutor/2002-December/018981.html

Подход os.system ограниченпотому что он возвращает только код ошибки.Подпроцесс . Открыть набор инструментов более гибко.

...