2009-06-11 47 views
0

我需要一種方法來將os.system()模塊作爲不同的UID執行。這將需要表現得類似於下面的BASH代碼(注意,這些都不是我執行的確切命令):在Python中按給定的UID執行shell命令

su user1 
ls ~ 
mv file1 
su user2 
ls ~ 
mv file1 

目標平臺是GNU Linux的通用。

當然,我可以將這些傳遞給os.system模塊,但是如何發送密碼?當然,我可以以root身份運行腳本,但這是sl and不安的。

最好我想做,而不要求任何密碼是純文本。

+0

David Cournapeau和Michiel Buddingh'都有很好的觀點。我將使用os.seteuid()函數與特權用戶(不是root)結合執行腳本。 – Caedis 2009-06-11 16:28:00

回答

1

您正在尋找的功能叫做os.seteuid。恐怕您無論如何都不會以root身份執行腳本,但我認爲您可以使用capabilities(7)框架對執行進行一些「庇護」,以便它可以更改用戶 - 但不能執行超級用戶可以做的任何其他事情。

或者,您可能可能能夠與PAM做到這一點。但總的來說,沒有一種「簡潔」的方法可以做到這一點,David Cournapeau絕對正確,傳統的管理腳本是以特權運行的。

+0

@Vye這不是一個錯字,請避免有害的編輯 – Erbureth 2014-10-29 18:29:10

3

我認爲這不是微不足道的:你可以用shell來做到這一點,因爲每個命令都啓動到自己的進程中,該進程有自己的ID。但是對於python,一切都會有python解釋過程的uid(當然,假設你不使用子過程模塊和co啓動子過程)。我不知道改變流程用戶的方式 - 我不知道這是否可能 - 即使是這樣,您至少需要管理員權限。

你想要做什麼?例如,這聽起來不像管理目的那樣正確。通常,管理腳本以特權用戶身份運行 - 因爲除了用戶2(理論上),沒有人知道用戶2的密碼。作爲root用戶意味着su用戶總是爲「普通」用戶工作,而不需要密碼。

+0

您的權利是讓一個單獨的特權用戶可以執行具有特定提升權限的腳本,這樣做更有意義。比以root身份運行更乾淨的解決方案。 – Caedis 2009-06-11 16:22:44

2

也許,sudo命令可以幫助你在這裏,否則你必須是root或者執行os.setuid

,如果你想擁有你可以使用Pexpect的做事 這樣的樂趣,可以提高在這個

p = pexpect.spawn("su guest") 
p.logfile = sys.stdout 
p.expect('Password:') 
p.sendline("guest") 
1

某處沿着線,一些工藝或其他將要需要的0(根)的有效UID,因爲只有這樣的過程可以有效UID設定爲任意的其它UID。

在shell中,su命令是SUID根程序;它是適當的特權(POSIX行話),並可以設置真實有效的UID。同樣,sudo命令可以執行相同的工作。通過sudo,您還可以配置允許哪些命令和UID。關鍵區別在於su需要目標用戶的密碼才能讓你進入; sudo需要用戶運行它的密碼。

當然,是否有用戶應該知道其他用戶的密碼的問題。一般來說,沒有用戶應該知道任何其他用戶的密碼。

腳本UID更改很難。你可以這樣做:

su altuser -c "commands to execute as altuser" 
sudo -u altuser commands to execute as altuser 

然而,su將從控制終端要求一個密碼(如果沒有控制終端會失敗)。如果您使用sudo,它將緩存憑據(或者可以配置爲這樣做),因此您只會被要求輸入一次密碼 - 但會像su一樣提示第一次。

解決提示很難。您可以使用與expect平行的工具來處理僞ttys。然而,你將面臨以腳本存儲密碼(不是一個好主意)或以某種方式將它們隱藏在視線之外。


我用於工作的工具是我寫的一個工具,叫asroot。它允許我精確控制子進程應該具有的UID和GID屬性。但它的設計只允許我使用它 - 也就是說,在編譯時,指定了授權用戶名(當然,可以更改)。不過,我可以做這樣的事情:

asroot -u someone -g theirgrp -C -A othergrp -m 022 -- somecmd arg1 ... 

這臺真實有效的UID爲「某人」,設置初級團「theirgrp」,刪除所有若干輔助組,並增加了「othergrp」(這樣的過程只屬於兩個組),並將umask設置爲0222;然後它會根據給定的參數執行'somecmd'。

對於需要有限(或不受限制)訪問其他用戶帳戶的特定用戶,此功能運行良好。作爲一個通用的解決方案,它不是那麼熱門; sudo在大多數方面都更好,但仍需要密碼(其中asroot沒有)。