簡體   English   中英

python run命令作為根腳本中的普通用戶

[英]python run command as normal user in a root script

我有一個以root身份啟動的python腳本,我無法更改它。

我想知道是否有可能將此腳本(或所有腳本)的某些行作為普通用戶執行(我不需要root用戶來運行它)。

原因是,我使用通知,並且python-notify不能在root中的所有機器上工作(看起來像這個bug

那么,你知道是否可以用子進程或其他方法來改變它?

謝謝

我想知道是否有可能將此腳本(或所有腳本)的某些行作為普通用戶執行

是的,這是可能的,也是一個好主意。

Python的os模塊有一組函數來設置真實,有效和保存的用戶和組ID,從setegid開始。 就Python而言,這些功能究竟取決於您的平台; 它只是調用相同名稱的C函數。

但POSIX定義了這些功能的作用。 有關詳細信息,請參閱setuidseteuid ,但簡短版本是:

  • 如果要切換到普通用戶然后切換回來,請使用seteuidsetreuid來設置有效或真實有效但未保存的UID。 然后再次使用相同的函數將它們設置回root。
  • 如果您想以普通用戶身份運行整個腳本並確保無法恢復root用戶,請改用setresuid來設置所有三個setresuid

如果您使用的是Python 3.1及更早版本,則不具備所有這些功能。 你仍然可以使用seteuid來回切換有效的ID,但是setuid會......好吧,這取決於你的平台,但我認為大多數現代平台都會改變保存和真實,這意味着你無法恢復原狀。 如果您閱讀鏈接的POSIX文檔,那么POSIX文檔中會有一些警告和復雜性。 如果您只關心一個平台,那么您可能希望閱讀本地聯機幫助頁,而不是閱讀所有案例,然后嘗試找出哪個適用於您的平台。

那么,你知道是否可以用子進程或其他方法來改變它?

這不是必要的(至少在符合要求的POSIX系統上),但它可以使事情變得更容易或更安全。 您可以使用subprocess os.forkmultiprocessingos.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM