Запуск от имени другого пользователя

В принципе, в этом нет ничего сложного или нового. Просто получаем идентификатор пользователя и его группы с помощью стандартных для UNIX вызовов getpwnam(), setuid(), setgid() и initgroups(). Последний вызов в этом примере не используется. Для выполнения этого примера нужны права администратора.

int main( int argc, char * argv[]) {
struct inheritance inh;
pid_t pid;
int nd;
char * command = NULL;
struct passwd *pw;

if( argc < 3 )
exit( EXIT_FAILURE );

pw = getpwnam( (char*)argv[1] );
setgid( pw->pw_gid );
setuid( pw->pw_uid );
seteuid( pw->pw_uid );
inh.flags = SPAWN_EXEC;
command = (char *)strdup( argv[2] );
argv += 2;
pid = spawnp( command, 0, NULL, &inh;, argv, 0 );
}//main