Cでsetregid()とsetreuid()の後に他のユーザーの環境変数にアクセス/設定する方法

Cでsetregid()とsetreuid()の後に他のユーザーの環境変数にアクセス/設定する方法

標準ユーザー(例:)によって実行され、以下のように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のマニュアルはこれを説明します)。あなたのプログラムはこれらのファイルを読み取らないので、そのファイルの変数の割り当てを見ることはできません。

おすすめ記事