выполнить sudo внутри питон скрипта

yroslavasako

Хочу пару процедур на питоне.
GetPrivileges: вызывается для текущего процесса sudo и в случае успешной авторизации присваивает скрипту UID=0
ThrowPrivileges: после её вызова, UID возвращается в норму.
Если интересна область применения - шелл скриптинг

s507040

pexpert + os.setuid?

conv3rsje

GetPrivileges: вызывается для текущего процесса sudo и в случае успешной авторизации присваивает скрипту UID=0
Ты умеешь менять UID уже запущенного процесса?
При использовании судо из скриптов надо заботать флаги -n и -S, если хочешь авторизоваться.

yroslavasako

Ты умеешь менять UID уже запущенного процесса?
если это не возможно, можно передать континуацию и запустить в отдельном процессе.

conv3rsje

если это не возможно, можно передать континуацию и запустить в отдельном процессе.
задолбаешся, форк не меняет уидов, а без него - геморройно воссоздавать состояние процесса
есть мизерный шанс что multiprocessing можно допилить, заменив fork на fork + exec sudo + восстановление состояния, но это очень маловероятно
вообще, хотеть делать "произвольное" действие из под рута - как-то неправильно

yroslavasako

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

tokuchu

Просто с точки зрения пользователя удобнее когда скрипт сам спрашивает разрешение, если ему нужно. А если не нужно - то не спрашивает.
А с другой точки зрения, наверное лучше разделять функционал который требует полномочий рута и который не требует. Причём не только внутри кода, но и снаружи для пользователя.
А так помнить надо какие скрипты через судо вызывать надо, а каким полномочия не нужны
Ну положи их в разные каталоги. :)

yroslavasako

Ну положи их в разные каталоги. :)
или сдеалть префикс sudo_
тоже вариант :)
вот мой текущий костыль:

class Root:
def __enter__(self):
self.oldid = os.getuid
os.setuid(0)
return 0
def __exit__(self, type, value, traceback):
os.setuid(self.oldid)

with Root:
pass
Оставить комментарий
Имя или ник:
Комментарий: