Python

2013-03-29 12 views
10

'deki belirli işlemler için kök ayrıcalıklarını bırakın Python betiğimde root yetkisine gereksinim duyan birkaç işlem gerçekleştiriyorum. Ayrıca, yalnızca root tarafından sahiplenilmesini istemediğim, ancak betiğimi çalıştıran kullanıcı tarafından oluşturulmuş dosyaları oluşturup yazarım.Python

Genellikle, komut dosyasını sudo kullanarak çalıştırıyorum. Yukarıdakileri yapmanın bir yolu var mı?

+0

Eğer sudo' 'ile çalıştırıyorsanız' '__FILE__' sahibine chown' sonra ' – slezica

+0

@ uʍopǝpısdn' Yapıldı Evet ... ama çok dikkatli değilseniz, bu gibi şeyler hızlı bir şekilde racy olur. – thejh

+0

Anlamadım, üzgünüm. Tüm dosyaları (sudo'nun sonucu) oluşturan köktür. Komut dosyasını çalıştıran kullanıcının kullanıcı kimliğini nasıl alabilirim? –

cevap

10

UID en os.seteuid() kullanma arasında geçiş yapabilirsiniz. Bu, os.setuid()'dan farklıdır, çünkü ihtiyacınız olduğunda root ayrıcalıklarına geri dönebilirsiniz.

Örneğin, root olarak aşağıdaki çalıştırın:

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') 

Bu aradığını hangi kullanıcı belirlemek istiyorsanız uid 501.

ile kullanıcı olarak file1 ve root olarak file3 ama file2 yaratır Sırasıyla kullanıcıyı

SUDO_USER 
SUDO_UID 

: iki ortam değişkenlerini ayarlar sudo senaryonuz, sudo adlı kullanıcının adı ve kullanıcı kimliği. Yani os.seteuid() ile kullanmak için int(os.environ['SUDO_UID']) kullanabilirsiniz.

1

http://linux.die.net/man/8/sudo alıntı:
gerçek ve etkin uid ve gid

Yani hedef kullanıcının uyacak şekilde ayarlanır , kullanılacak kullanıcı bilmenin tek seçenek ya bir yapılandırmasındaki hedef kullanıcıyı okumaktır dosya veya cmdline seçeneği veya sezgisel tahminlerin bir kısmı.

İyi bir fikir, hak ihlali olarak adlandırılır: Kök ayrıcalıkları ile başlayın, sonra bunları sizin için neyi amaçladığınızı yapın. Daha az ayrıcalıklı bir kullanıcı olun.
Bunun için os modülünü kullanabilirsiniz: http://docs.python.org/2/library/os.html#os.setuid

1

os.seteuid ve os.setegid kullanarak aslında root ayrıcalıklarını düşürmediğini buldum. Onları çağırdıktan sonra hala root ayrıcalıklarına ihtiyaç duyan şeyler yapabildim. çalıştı buldum çözümü os.setresuid kullanmaktı ve bunun yerine os.setresgid: Her zaman can,

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