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