現在、SUID ビットと対応する関数 seteuid および geteuid がどのように機能するかを理解しようとしています。だから私はこの小さなプログラムを書いた:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char **argv) {
printf("oldid %d\n", geteuid());
if(seteuid(0) == -1)
perror("seteuid faied");
printf("newid %d\n", geteuid());
return 0;
}
それをコンパイルし、その所有者をルートに変更し、ファイルの所有者の s ビットを変更しました。
[chris@myhost Test]$ ls -l test
-rwsr-xr-x 1 root root 4830 Apr 5 07:56 test
しかし、生成された出力は次のようになります。
[chris@myhost Test]$ ./test
oldid 0
newid 0
そして、これは私が理解していないものです。geteuid の最初の呼び出しは、実際にはこのプログラムの呼び出し元のユーザー ID (つまり、chris - 私の ID は 1000 になります) を返すはずですが、プログラムは有効なユーザー ID として root を表示します。なぜこれが事実なのか、誰かが私に説明できますか?