2011-07-08 13 views
6

Pythonで書かれたインストールスクリプト(Linuxの場合)がルートとして実行され、ルート以外のユーザーが特定のファイルを読み取ることができるかどうかを確認する必要があります。root以外のユーザーがアクセスできるパスを確認する

このため、os.path.exists()またはopen(filename)を使用することはできません(例外をキャッチする)。

現在、私は各ファイルのパーミッションビットをチェックするつもりですが、唯一の問題はファイル名までのパス上のパーミッションビットをチェックする必要があることです(ディレクトリには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を推測するためにもう少し作業を行う必要があります。おそらく、アプリケーションはpasswdファイルをrootとして読み取って(それが存在することを確認するために)、passwdファイルを65534(許可がないこと、例外==成功していないことを確認する) 65534(実際にアクセス許可をチェックする)として、最初の2つが失敗した場合は、ユーザに許可を確認するように通知します。 – SingleNegationElimination

+0

このアプローチの唯一の問題は、ファイルがチェックされた後にスクリプトをrootとして実行する必要があることです。 –

+0

@teehoo: 'os.seteuid(0)'を使って有効なユーザをrootにリセットすることができます。 – unutbu

関連する問題