[英]python run command as normal user in a root script
我有一個以root身份啟動的python腳本,我無法更改它。
我想知道是否有可能將此腳本(或所有腳本)的某些行作為普通用戶執行(我不需要root用戶來運行它)。
原因是,我使用通知,並且python-notify不能在root中的所有機器上工作(看起來像這個bug )
那么,你知道是否可以用子進程或其他方法來改變它?
謝謝
我想知道是否有可能將此腳本(或所有腳本)的某些行作為普通用戶執行
是的,這是可能的,也是一個好主意。
Python的os
模塊有一組函數來設置真實,有效和保存的用戶和組ID,從setegid
開始。 就Python而言,這些功能究竟取決於您的平台; 它只是調用相同名稱的C函數。
但POSIX定義了這些功能的作用。 有關詳細信息,請參閱setuid
和seteuid
,但簡短版本是:
seteuid
或setreuid
來設置有效或真實有效但未保存的UID。 然后再次使用相同的函數將它們設置回root。 setresuid
來設置所有三個setresuid
。 如果您使用的是Python 3.1及更早版本,則不具備所有這些功能。 你仍然可以使用seteuid
來回切換有效的ID,但是setuid
會......好吧,這取決於你的平台,但我認為大多數現代平台都會改變保存和真實,這意味着你無法恢復原狀。 如果您閱讀鏈接的POSIX文檔,那么POSIX文檔中會有一些警告和復雜性。 如果您只關心一個平台,那么您可能希望閱讀本地聯機幫助頁,而不是閱讀所有案例,然后嘗試找出哪個適用於您的平台。
那么,你知道是否可以用子進程或其他方法來改變它?
這不是必要的(至少在符合要求的POSIX系統上),但它可以使事情變得更容易或更安全。 您可以使用subprocess
os.fork
, multiprocessing
, os.fork
或任何其他機制來啟動子進程,該進程立即使用setuid
刪除權限 - 甚至setresuid
以放棄恢復其權限的能力。 當子進程完成其任務時,它就會退出。
你需要來自PWD模塊的getpwnam ,通過用戶名訪問user-id然后用os.setuid()你可以改變用戶和運行python腳本作為另一個用戶。
import pwd, os
uid = pwd.getpwnam('username')[2] #instead of index 2 you can use pw_uid Attribute
os.setuid(uid)
但請注意,使用setuid
可能會造成巨大的安全漏洞。
如果腳本以root
身份運行,則可以使用os.setuid
將進程的當前UID更改為另一個用戶(不可撤銷)或os.seteuid
以更改進程的當前有效UID(之后您可以再次使用它來重置EUID to root
)。
請注意, os.setuid
更改真實和有效的UID - 這就是它不可撤銷的原因。
os.seteuid
更改有效的UID。 由於真正的UID仍然是root
,您仍然可以稍后在腳本中將EUID切換回root
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.