Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: C - uid и gid  (Прочитано 956 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн victor00000

  • Автор темы
  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
C - uid и gid
« : 19 Сентября 2018, 16:29:22 »
// test_uid_gid.c
// victor00000 (c) 2018
#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>
#include <grp.h>
#include <sys/types.h>
#include <unistd.h>

// ~$ gcc test_uid_gid.c -o test_uid_gid
// ~$ sudo addgroup gtest
// ~$ sudo ./test_uid_gid $USER gtest
// ~$ touch /tmp/test.txt
// ~$ ls -l /tmp/test.txt
// -$ id
// ~$ exit
// ~$ sudo delgroup gtest

// ======= Example ==================
/*
a@a:~$
a@a:~$ echo $USER
a
a@a:~$ sudo addgroup gtest
[sudo] password for a:
Adding group `gtest' (GID 1000) ...
Done.
a@a:~$
a@a:~$ sudo ./test_uid_gid $USER gtest
UID:
a
GID:
root
gtest

Please command 'exit'
a@a:~$
a@a:~$ touch /tmp/test.txt
a@a:~$ ls -l /tmp/test.txt
-rw-r--r-- 1 a gtest 0 Сен 19 15:57 /tmp/test.txt
a@a:~$
a@a:~$ id
uid=1001(a) gid=1000(gtest) groups=1001(a),0(root),1000(gtest)
a@a:~$
a@a:~$ exit
exit
Ok
a@a:~$
a@a:~$ touch t.txt
a@a:~$ ls -l t.txt
-rw-rw-r-- 1 a a 0 Сен 19 15:59 t.txt
a@a:~$
*/
//========================

int main (int ia, char *ca[]){
if (ia != 3) return 1;
struct passwd *pw;
pw = getpwnam (ca[1]);
if (pw == 0){
fprintf (stderr,"ERR: no user "
"name '%s'.\n",ca[1]);
return 1;
}
struct group *gr;
gr = getgrnam (ca[2]);
if (gr == 0){
fprintf (stderr,"ERR: no group "
"name '%s'.\n",ca[2]);
return 1;
}
if (setuid (0)!=0){
perror ("root");
return 1;
}

gid_t *a = malloc (sizeof (gid_t)*16);
int n = getgroups (16,a);
a[n] = gr->gr_gid;
n++;
if (setgroups (n,a)<0){
perror ("setgroups");
return 1;
}

if (setgid (gr->gr_gid)!=0){
perror (gr->gr_name);
return 1;
}
if (setuid (pw->pw_uid)!=0){
perror (pw->pw_name);
return 1;
}
puts ("UID:");
pw = getpwuid (getuid());
printf ("\t%s\n",pw->pw_name);
int i;
puts ("GID:");
for (i=0;i<n;i++){
gr = getgrgid (a[i]);
printf ("\t");
puts (gr->gr_name);
}
puts ("\nPlease command 'exit'");
system ("bash");
puts ("Ok");
free (a);
return 0;
}

http://paste.ubuntu.com/p/KQQ3S7w4GF/
Wars ~.o

Оффлайн DDDD

  • Участник
  • *
  • Сообщений: 116
  • Ubuntu 18.04 / KDE neon
    • Просмотр профиля
Re: C - uid и gid
« Ответ #1 : 19 Сентября 2018, 20:46:10 »
Один вопрос. Зачем это выкладывать?
MSI GE62 6QC(Intel hd 530 + Nvidia 960m)

Оффлайн victor00000

  • Автор темы
  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: C - uid и gid
« Ответ #2 : 19 Сентября 2018, 20:57:24 »
чтобы поиск развития.
что вы не понимаете посту?
Wars ~.o

Оффлайн DDDD

  • Участник
  • *
  • Сообщений: 116
  • Ubuntu 18.04 / KDE neon
    • Просмотр профиля
Re: C - uid и gid
« Ответ #3 : 19 Сентября 2018, 21:03:14 »
Ну тогда хотя бы tab/пробелы добавить в код, что бы удобней было читать. Или это сайт все tab/пробелы убирает?
MSI GE62 6QC(Intel hd 530 + Nvidia 960m)

Оффлайн victor00000

  • Автор темы
  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: C - uid и gid
« Ответ #4 : 19 Сентября 2018, 21:17:30 »
у меня не удобно, а удобно дело.
вы сами собирать в табу или програма для конвертировать.

Wars ~.o

 

Страница сгенерирована за 0.057 секунд. Запросов: 25.