web-dev-qa-db-ja.com

os.getuid()とos.geteuid()の違いは何ですか?

os.getuid()のドキュメントには次のように書かれています:

現在のプロセスのユーザーIDを返します。

そしてos.geteuid()について:

現在のプロセスの実効ユーザーIDを返します。

ユーザーID実効ユーザーIDの違いは何ですか?

私にとっては両方とも同じように動作します(2.xと3.xの両方で)。スクリプトをrootとして実行しているかどうかを確認するために使用しています。

32
Santosh Kumar

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を使用すると、サーバーは、ユーザーが触れることができないものへのアクセスを回避できます。

55
Blckknght

関数os.getuid()は、プログラムを実行するユーザーのIDを返します。プログラムが使用するユーザーの関数os.geteuid()。ほとんどの場合、これは同じです。これらの値が異なるよく知られているケースは、プログラムの実行可能ファイルにsetuidビットが設定されていて、プログラムを実行するユーザーと、プログラムを実行できるユーザーが異なる場合です。この場合、os.getuid()はプログラムを実行するユーザーのIDを返し、os.geteuid()はプログラムの実行可能ファイルを所有するユーザーのIDを返します。

6