2013-03-29 7 views
10

W moim skrypcie Pythona wykonuję kilka operacji wymagających uprawnień root. Tworzę i piszę do plików, których nie chcę posiadać wyłącznie przez root, ale przez użytkownika, który uruchamia mój skrypt.Upuszczanie uprawnień roota dla niektórych operacji w Pythonie

Zazwyczaj uruchamiam skrypt za pomocą sudo. Czy istnieje sposób, aby to zrobić?

+0

Jeśli korzystasz z 'sudo', można zawsze' chown' do właściciela '__FILE__' po ciebie Zrobione – slezica

+0

@ uʍopǝpısdn Tak ... ale robienie takich rzeczy szybko staje się zbyt ostre, jeśli nie jesteś bardzo ostrożny. – thejh

+0

Nie dostałem tego, przepraszam. To root, który tworzy wszystkie pliki (konsekwencja 'sudo'). Jak mogę pobrać identyfikator użytkownika, który uruchamia mój skrypt? –

Odpowiedz

10

Można przełączać się między uid Korzystanie os.seteuid(). Różni się to od os.setuid() tym, że możesz wrócić do uzyskania uprawnień roota, kiedy ich potrzebujesz.

Na przykład, uruchom następujące jako root:

import os 

open('file1', 'wc') 

# switch to userid 501 
os.seteuid(501) 
open('file2', 'wc') 

# switch back to root 
os.seteuid(0) 
open('file3', 'wc') 

Stwarza file1 i file3 jako root, ale file2 jako użytkownik z UID 501.

Jeśli chcesz określić, które użytkownik dzwoni skrypt, sudo ustawia dwie zmienne środowiskowe:

SUDO_USER 
SUDO_UID 

odpowiednio użytkownikowi name i identyfikator użytkownika, który zadzwonił pod numer sudo. Więc możesz użyć int(os.environ['SUDO_UID']) do użycia z os.seteuid().

1

http://linux.die.net/man/8/sudo cytat:
Rzeczywisty i efektywny uid i gid ustawione są zgodne z ustawieniami użytkownika docelowego

Tak, to jedyna możliwość poznania, które użytkownik może wykorzystać to, aby przeczytać użytkownika docelowego z obu config plik lub opcja cmdline lub w jakiś sposób heurystycznego zgadywania.

Dobrym pomysłem jest tak zwane wyrzucanie praw: Zacznij od uprawnień roota, a następnie rób to, na co je nedd. Następnie stać się mniej uprzywilejowanym użytkownikiem.
Można by użyć modułu os za to: http://docs.python.org/2/library/os.html#os.setuid

1

Zauważyłem, że używanie os.seteuid i os.setegid nie zmniejszyło uprawnień roota. Po ich wywołaniu wciąż byłem w stanie robić rzeczy, które wymagały uprawnień root'a. Rozwiązanie znalazłem że pracował było wykorzystanie os.setresuid i os.setresgid zamiast:

sudo_uid = int(os.getenv("SUDO_UID")) 
sudo_gid = int(os.getenv("SUDO_GID")) 

# drop root privileges 
os.setresgid(sudo_gid, sudo_gid, -1) 
os.setresuid(sudo_uid, sudo_uid, -1) 

subprocess.call("mkdir /foo1", shell = True) # should fail 

# regain root privileges 
os.setresgid(0, 0, -1) 
os.setresuid(0, 0, -1) 

subprocess.call("mkdir /foo2", shell = True) # should succeed