古いSuSE-13.2ボックスをLeap-15にアップグレードしています。私はLeap-15.0を新しくインストールし、13.2システムで動作するソースコードを移植しました。私はよく作っていますが、問題が発生しました。このプログラムはsuidプログラムでなければなりません。また、 // を使用してfork
いくつかの外部スクリプトを実行します。これが私の問題があるところです。ユーザーは複数のグループのメンバーですが、これらの外部スクリプトが実行されると、これらのグループメンバーが消えるように見えます。たとえば、ユーザーはグループのメンバーであるため、DVDを取り出して使用できます。私の問題を示すプログラムの簡単なサンプルスクリプトとソースコードを作成しました。execvpe
wait
cdrom
execvpe
test.sh
スクリプト:
#!/bin/sh
whoami
id
test.c
プログラムソース:
#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *path = getenv("PATH");
char pathenv[strlen(path) + sizeof("PATH=")];
sprintf(pathenv, "PATH=%s", path);
char *envp[] = {pathenv, NULL};
char *tests[] = {"./test.sh", NULL};
execvpe(tests[0], tests, envp);
}
使用:
#cc test.c
#./a.out
markh
uid=5076(markh) gid=100(users) groups=100(users),19(floppy),200(lcrs),484(tape),485(lp),488(disk),489(dialout),490(cdrom)
その後、root:
#chown root ./a.out
#chgrp root ./a.out
#chmod +s ./a.out
その後、ユーザーとして
#./a.out
markh
uid=5076(markh) gid=100(users) groups=100(users)
プログラムがrootとsuidの所有になると、未知の理由ですべてのグループメンバーシップが失われます。これは私に合わないと思います。
これらはすべて以前の13.2システムではうまく機能しますが、Leap 15またはLeap 42.3では機能しません。私はこれがSuSE Linuxのための場所ではないことを知っていますが、SuSE Linuxとは実際には関係がないと思います。また、13.2および15.0システムで4.16.12カーネルを実行しているため、カーネルに依存しません。