python os.fork() для выполнения операции с ухудшенными учетными данными

#python #fork

#python #fork

Вопрос:

Я хочу реализовать следующую команду на python.

 su ${USER} -c "whoami"
  

которые просто создают дочерний процесс, который выполняется с другими привилегиями, и возвращают результат whoami обратно родительскому процессу.

Поскольку bash работает, это следует выполнять с помощью os.fork() , пока результат извлекается родительскому процессу, как только процесс Чили завершит свою работу.

 def runWhoamiOtherUser(self):
    pid = os.fork()
    if pid == 0:
        os.setuid(getpwnam(os.environ['USER'])[2])
        x = getpass.getuser()
        return x

    pid, status = os.waitpid(pid, 0)
  

Это правильный способ сделать это?

Ответ №1:

Он был добавлен в качестве новой функции в модуль подпроцесса в Python 3.9, в подпроцесс.Конструктор Popen:

Новое в версии 3.9.

Если пользователь не является None, системный вызов setreuid() будет выполнен в дочернем процессе до выполнения подпроцесса. Если предоставленное значение является строкой, оно будет найдено через pwd.getpwnam() и будет использовано значение в pw_uid. Если значение является целым числом, оно будет передано дословно. (только POSIX)

https://docs.python.org/3.9/library/subprocess.html

До версии 3.9, вероятно, лучше всего использовать тот же вызов setreuid(). Те же средства существуют и для изменения группы, если вы предпочитаете, чтобы это было user. Код был добавлен в этот коммит, если вы хотите проверить специфику настройки и, возможно, скопировать-вставить соответствующую часть в вашу программу:https://github.com/python/cpython/commit/2b2ead74382513d0bb9ef34504e283a71e6a706f

Комментарии:

1. Привет и спасибо за вашу помощь. к сожалению, мой код должен поддерживать python 2.7.11, который является встроенной версией macOS. Я не смог найти какой-либо способ передачи строки, сгенерированной из дочернего процесса, в родительский процесс. Возможно, вы можете написать мне какой-нибудь рабочий пример? Еще раз спасибо! кстати, причина, по которой я использую fork, заключается в том, что если я установлю идентификатор в том же процессе, я не смогу отменить эту операцию.

2. Ну, может быть, ваш код в порядке, возможно, использование setreuid() вместо setuid() просто лучше. Если вам нужно передавать данные между процессами, подпроцессы предоставляют вам каналы ввода и вывода для связи.

3. да, это сработало. при использовании setreuid я могу отменить учетные данные. Спасибо!