#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 я могу отменить учетные данные. Спасибо!