
標準ユーザー(例:)によって実行され、以下のようにstduser
実行時にシステムユーザー(例:)に切り替える特権Cプログラムがあります。基本的に、私はこれからやるべきことにsysuser
似た仕事をしようとしています。sudo -u sysuser env
環境テスト.c:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<errno.h>
#include<shadow.h>
#include<pwd.h>
int main(void){
struct passwd*pw;
uid_t sysuid;
gid_t sysgid;
char err_module_name[256] = "";
pw = getpwnam ("ayauser");
endpwent();
if (!pw){ //user doesn't really exist
perror("getpwnam()");
return errno;
}
sysuid = pw->pw_uid;
sysgid = pw->pw_gid;
(strcpy(err_module_name, "setregid()") == NULL || setregid(sysgid, sysgid) == 0) &&
(strcpy(err_module_name, "setreuid()") == NULL || setreuid(sysuid, sysuid) == 0) &&
(strcpy(err_module_name, "execl()") == NULL || execl("/usr/bin/env", "/usr/bin/env", NULL) == 0);
perror(err_module_name);
return errno;
}
私はすでにこれを行いました。
$ sudo chgrp root envtest
$ sudo chown root envtest
$ chmod 6555 envtest
その後、プログラムを実行するとenvtest
同じ環境stduser
変数が表示されますsysuser
。つまり、env
コマンドとコマンドの出力はenvtest
同じです。予想通り出力はsudo -u sysuser env
。
コードに何がありましたか? setと同じ環境変数を持つようにプログラムを変更するにはどうすればよいですかsysuser
?
答え1
何sudo -i
ですか:
-i, --login
ターゲットユーザーのパスワードデータベースエントリで指定されたシェルをログインシェルとして実行します。これは、シェルがログイン固有のリソースファイル(または)を読み取ることを意味します
.profile
。.login
最後に重要なのは、シェルが多くの起動ファイルを読み取ることです(起動方法によって異なります)。Bashのマニュアルはこれを説明します)。あなたのプログラムはこれらのファイルを読み取らないので、そのファイルの変数の割り当てを見ることはできません。