2011-07-08 62 views
6

我有一個以Python(在Linux)中編寫的以root用戶身份運行並需要檢查某些文件是否可以被非root用戶讀取的安裝腳本。檢查非root用戶可以訪問的路徑

由於這個原因,我不能使用os.path.exists()或打開(文件名)(並捕獲任何異常)。

目前我正在考慮檢查每個文件的權限位,但唯一的問題是,我將不得不檢查通向文件名的路徑上的權限位(目錄需要r + x位設置),如果我有數千個文件,這可能會非常緩慢。

我的解決方案是最好的,還是有更好的選擇?

編輯:我將需要以root身份在腳本運行後檢查文件,因此不幸的是,刪除根權限不是一個選項。

回答

4

您可以使用os.seteuid將有效用戶更改爲某個非root用戶。然後嘗試打開文件。如果權限被拒絕,將會引發IOError

import os 
os.seteuid(65534) # user 65534 is `nobody` 
filename='/etc/passwd-' 
try: 
    open(filename,'r') 
except IOError as err: 
    print(err) 

# [Errno 13] Permission denied: '/etc/passwd-' 
+1

65534在大多數現代操作系統(從Windows支持)上都沒有,但它並不在所有的posix系統上。便攜式應用程序可能需要做更多的工作來猜測真正的euid。也許應用程序應該嘗試以root身份讀取passwd文件(以確保它存在),然後嘗試讀取passwd文件爲65534(以確保它缺少權限,異常==成功),然後嘗試讀取目標文件作爲65534(實際檢查權限),如果前兩個失敗,則通知用戶自己檢查權限。 – SingleNegationElimination

+0

這種方法唯一的問題是我需要腳本在檢查完文件後以root身份運行。 –

+0

@teehoo:您可以使用'os.seteuid(0)'將有效用戶重置爲root。 – unutbu