os.getuid()
のドキュメントには次のように書かれています:
現在のプロセスのユーザーIDを返します。
そしてos.geteuid()
について:
現在のプロセスの実効ユーザーIDを返します。
ユーザーIDと実効ユーザーIDの違いは何ですか?
私にとっては両方とも同じように動作します(2.xと3.xの両方で)。スクリプトをrootとして実行しているかどうかを確認するために使用しています。
os.getuid
およびos.geteuid
異なる、それらはPython特定の関数(os
モジュール接頭辞以外)ではないことを理解する必要があります。これらの関数は、本質的に提供されるgetuid
およびgeteuid
システムコールをラップしていますすべてのUnixライクなオペレーティングシステム。
したがって、Python docs(多くの詳細を示す可能性は低い))ではなく、オペレーティングシステムのドキュメントを確認する必要があります ここ はたとえば、Linuxに関連するドキュメントウィキペディアには、優れた nixユーザーIDに関する記事 もあります。
通常のUIDと有効なUIDの違いは、特別なアクセスを必要とする操作(ファイルの読み取りや書き込み、特定のシステムコールの実行など)を行うときにEUIDのみがチェックされることです。 UIDはアクションを実行している実際のユーザーを示しますが、(通常は)権限を調べるときに考慮されません。通常のプログラムではそれらは同じになります。一部のプログラムは、EUIDを変更して、実行を許可されているアクションから追加または削除します。数値が小さいほどUIDも変更され、別のユーザーになります。
次に、EUIDを変更するプログラムの例を示します。passwd
プログラム(パスワードの変更に使用)は、rootユーザーが所有するシステムのパスワードファイルに書き込む必要があります。通常のユーザーは、そのファイルに書き込むことはできません。可能であれば、他の全員のパスワードも変更できるためです。これを解決するために、passwd
プログラムには、そのファイル権限(setuid bit
)は、別のユーザーがプログラムを起動した場合でも、プログラムの所有者のEUID(root
など)で実行する必要があることをOSに示します。その場合、passwd
プログラムは、そのUID
を起動ユーザーとして、そのEUIDをrootとして表示します。システムパスワードファイルに書き込むには、EUIDに特権が必要です。 passwd
は、パスワードを変更するユーザーを知る必要があるため、UIDも役立ちます。
UIDとEUIDが一致しないケースは他にもいくつかありますが、あまり一般的ではありません。たとえば、スーパーユーザーとして実行されているファイルサーバーは、EUIDを変更して、一部のファイル操作を要求している特定のユーザーに一致させることができます。ユーザーのEUIDを使用すると、サーバーは、ユーザーが触れることができないものへのアクセスを回避できます。
関数os.getuid()
は、プログラムを実行するユーザーのIDを返します。プログラムが使用するユーザーの関数os.geteuid()
。ほとんどの場合、これは同じです。これらの値が異なるよく知られているケースは、プログラムの実行可能ファイルにsetuid
ビットが設定されていて、プログラムを実行するユーザーと、プログラムを実行できるユーザーが異なる場合です。この場合、os.getuid()
はプログラムを実行するユーザーのIDを返し、os.geteuid()
はプログラムの実行可能ファイルを所有するユーザーのIDを返します。