0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 17

Удалить учетные записи пользователей, которые принадлежат указанным группам

23.04.2015, 12:49. Показов 1059. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте помогите пожалуйста решить задачу. Нужно удалить из системы пользователей, которые принадлежат заданным группам. Измененные системные файлы необходимо записать в новые файлы. А старые системные файлы нужно оставить без изменения. Файл, в котором будут находится имена групп, пользователей которых нужно удалить, передавать при запуске через консоль.

Подскажите куда копать, может быть есть какая-нибудь удобная библиотека или ещё что-то такое.

Ну а если кто-то вообще напишет кусок кода, то буду вообще бесконечно рад и благодарен
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.04.2015, 12:49
Ответы с готовыми решениями:

Учетные записи пользователей
я не понимаю почему учетные записи пользователей так тяжело использовать. Например: 1)у меня установлен Тотал Командер под...

Учетные записи пользователей
Здраствуйте.Сегодня включаю ноут,появился новый пользователь. Через него зайти не могу никак,стоит пароль.Моя учетная запись стала вдруг не...

Учетные записи пользователей
Возможно ли запретить одной учётной записи использовать программы установленные для другой учетной записи в Windows 7? К примеру есть 2...

13
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 17
25.04.2015, 14:45  [ТС]
Ребята, в общем написал вот такой вот гавнокод. Расскажу что здесь делается, и в чем собственно заключается ПРОБЛЕМА из-за которой не могу продолжить писать дальше. Итак: проверяются входные параметры командной строки (для моей программы, их должно быть 6: файл с именами групп, пользователей которых нужно удалить, четыре имени файлов, которые нужно создать на замену системным файлам passwd, group, shadow, gshadow; ну а первый параметр - это стандартный параметр, он всегда есть. Дальше - считываю из файла с имена групп, эти имена и заношу в массив строк. Затем создаю "новые системные файлы". Потом копирую информацию их системных файлов, в "новые системные файлы" (чтобы преобразования делать в копиях, а не в оригинале, это по условию). Затем по именам групп получаю имена пользователей которые входят в эти групп (для того чтобы удалить их). Затем пытаюсь считать в файле первую строку, чтобы проверить этот строка с именем этого пользователя (если да - удалить ей, если нет искать дальше). И ВОТ НА ЭТОМ ЭТАПЕ ВОЗНИКАЕТ ОШИБКА: когда я считываю из файла строку, то непонятно что происходит с кодировкой и вместо нормального текста считывается "КРОКАЗЯБЛЫ". При файла текстовым редактором инфа читается нормально. В чём может быть проблема? ХЕЛП МИ Конкретно те строки, при выполнении которых возникает неверный результат я выделю жирным.
Прилагаю весь код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
// 21. Удалить из системны пользователей, которые принадлежат указанным группам.
// Изменения системных файлов записать в новые файлы, старые систмные файлы оставить без изменений.
// Имена выходных файлов и файл с именами групп передать при запуске программы (через вх. параметры)
 
#include <stdio.h>    // for printf
#include <stdlib.h>
#include <dirent.h>   // for directories
#include <sys/stat.h> // for status
#include <unistd.h>   // for close, read
#include <string.h>   // for strlen
#include <grp.h>
#include <pwd.h>
 
void Open_System_Files (void);
void Copy_System_Files_To_New_System_Files (void);
void Close_System_Files (void);
void Close_New_System_Files (void);
 
FILE *f_name_group;                                              // указатель на файл c именами групп
FILE *f_passwd,*f_group,*f_shadow,*f_gshadow;                    // указатели на системные файлы
FILE *f_new_passwd,*f_new_group,*f_new_shadow,*f_new_gshadow;    // указатели на отредактированные системные файлы
int err_file;                                                    // признак ошибки открытия какого-либо
 
int main(int argc, char *argv[])
{  
  char name_group[10][20]; // массив из 10 строк, каждая длинной в 20 символов
  int count_name_group=0;  // количество имён групп, пользователей которых нужно удалить
  int i,count_str=0;
  struct group *my_group;
  char **buf_str;
  char **members;
  char buf_name[1][128];
 
   
//--------------ПРОВЕРКА ВХОДНЫХ ПАРАМЕТРОВ И ОТКРЫТИЕ ФАЙЛОВ-----------------------------------------------------------
   if (argc == 6)                                                          // если все входные параметры заданы
   { 
     printf("argc = %d\n",argc);
     if ((f_name_group = fopen(argv[1], "rt")) == NULL)
     {                                                                     // если не удалось открыть файл для ЧТЕНИЯ
      printf("\nERROR! File '%s' was not opened for reading!\n",argv[1]);  // вывести на экран сообщение
      err_file=-1;                                                        
     }
//-------------Формирование массива с именами групп, пользователей которых нужно удалить--------------------------------
     printf("Names group for deleting users: ");
    while (fscanf(f_name_group, "%s", name_group[count_name_group]) != EOF)  // читаем файл  построчно в массив строк
     {
      printf("%s ", name_group[count_name_group]); 
      count_name_group++;
     }
     fclose(f_name_group);                                                   // закрыть файл после чтения
//----------Открытие новых файлов, куда будем записывать преобразованные системные файлы--------------------------------
     if ((f_new_passwd = fopen(argv[2], "wt")) == NULL) 
     {                                                                     // если не удалось открыть файл для ЗАПИСИ
      printf("\nERROR! File '%s' was not opened for writing!\n",argv[2]);  // вывести на экран сообщение
      err_file=-1;                                                         
     }
     if ((f_new_group = fopen(argv[3], "wt")) == NULL) 
     {                                                                  
      printf("\nERROR! File '%s' was not opened for writing!\n",argv[3]); 
      err_file=-1;                                                             
     }
     if ((f_new_shadow = fopen(argv[4], "wt")) == NULL) 
     {                                                                  
      printf("\nERROR! File '%s' was not opened for writing!\n",argv[4]); 
      err_file=-1;                                                          
     }
     if ((f_new_gshadow = fopen(argv[5], "wt")) == NULL) 
     {                                                                  
      printf("\nERROR! File '%s' was not opened for writing!\n",argv[5]); 
      err_file=-1;                                                           
     }   
     Open_System_Files();                                                    // открытие исходных системных файлов 
     if (err_file==-1) return -1;
     
     Copy_System_Files_To_New_System_Files();
    // Close_System_Files ();                         // закрытие системных файлов
//-----------------------------------------------------------------------------------------------------------------------
    while (count_name_group>0)
    {
    my_group=getgrnam(name_group[count_name_group-1]); //получаем указатель на структуру группы по имени.
    if (my_group == NULL) printf ("\nError! User group not found! \n");
    members = my_group->gr_mem;  //получаем имена пользователей этой группы
    printf ("\nCheck - > Name_group: %s\n", my_group->gr_name);
     while (*members) //проходим по именам пользователей
      {
       printf ("Check - > Name_User: %s\n", *(members));
      // fseek(f_new_passwd, 0L, SEEK_SET);
         rewind(f_passwd);
       /*  while (fscanf(f_new_passwd, "%s", buf_name[0]) !=EOF) 
          {
           printf ("Chek buf_str-> %s\n", buf_name[0]);
           if(buf_name[0]==*(members))
              printf("DELETE\n"); 
           else printf("no\n");
          }
          printf ("next member\n");
        fgets(buf_name[1], 128, f_new_passwd);*/
 
    [B]  fscanf(f_passwd, "%s", buf_name[1]);
      printf ("Chek buf_str-> %s\n", buf_name[1]);[/B]
       
       members++;
       }       
    
    count_name_group--;
    } //end while
       
   } else {printf("ERROR! Check input parameters!\n"); return -1; } 
   // ------ПРОГРАММА ЗАВЕРШЕНА--------------------------------------------------------------------------------------------
  printf("\nProgram has been successfully completed!\n");                  
  return 0;
} //end main()
    
void Open_System_Files (void) // Процедура открытия исходных системных файлов
{
     if ((f_passwd = fopen("../../etc/passwd", "rt")) == NULL) 
     {                                                                       
      printf("\nERROR! File 'passwd' was not opened for reading!\n");    
      err_file=-1;                                                               
     }
     if ((f_group = fopen("../../etc/group", "rt")) == NULL) 
     {                                                                  
      printf("\nERROR! File 'group' was not opened for reading!\n"); 
      err_file=-1;                                                          
     }
     if ((f_shadow = fopen("../../etc/shadow", "rt")) == NULL) 
     {                                                                  
      printf("\nERROR! File 'shadow' was not opened for reading!\n"); 
      err_file=-1;                                                           
     }
     if ((f_gshadow = fopen("../../etc/gshadow", "rt")) == NULL) 
     {                                                                  
      printf("\nERROR! File 'gshadow' was not opened for reading!\n"); 
      err_file=-1;                                                          
     }
}
 
void Close_System_Files (void) // Процедура закрытия исходных системных файлов
{
    fclose(f_passwd); 
    fclose(f_group); 
    fclose(f_shadow);
    fclose(f_gshadow);       
}
 
void Close_New_System_Files (void) // Процедура закрытия исходных системных файлов
{
    fclose(f_new_passwd); 
    fclose(f_new_group); 
    fclose(f_new_shadow);
    fclose(f_new_gshadow);  
}
 
void Copy_System_Files_To_New_System_Files (void) //Процедура копирования системных файлов для последующей обработки
{   
char str[128];
char *estr;
//---------passwd----------------------------------------
   while (1)
   {
   estr = fgets (str,sizeof(str),f_passwd);
    if (estr == NULL)
     {
      if ( feof (f_passwd) != 0)
       break;  //всё норм, файл кончился
      else
        {
         printf ("\nError read file\n");
         break;
        }
      }
      fputs(str, f_new_passwd); //копируем в другой файл
   }
//-------------group-------------------------------------  
   while (1)
   {
   estr = fgets (str,sizeof(str),f_group);
    if (estr == NULL)
     {
      if ( feof (f_group) != 0)
       break;  
      else
        {
         printf ("\nError read file\n");
         break;
        }
      }
      fputs(str, f_new_group); 
   }
//-------------shadow-----------------------------------  
   while (1)
   {
   estr = fgets (str,sizeof(str),f_shadow);
    if (estr == NULL)
     {
      if ( feof (f_shadow) != 0)
       break;  
      else
        {
         printf ("\nError read file\n");
         break;
        }
      }
      fputs(str, f_new_shadow); 
   }
//----------gshadow--------------------------------------  
   while (1)
   {
   estr = fgets (str,sizeof(str),f_gshadow);
    if (estr == NULL)
     {
      if ( feof (f_gshadow) != 0)
       break; 
      else
        {
         printf ("\nError read file\n");
         break;
        }
      }
      fputs(str, f_new_gshadow); 
   } 
 } //end Copy_System_Files_To_New_System_Files
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
25.04.2015, 15:19
Лучший ответ Сообщение было отмечено Neuling как решение

Решение

ваш "двумерный" массив состоит из 1й строки:
Цитата Сообщение от Neuling Посмотреть сообщение
C
1
char buf_name[1][128];
но далее вы обращаетесь ко 2-й строке:
Цитата Сообщение от Neuling Посмотреть сообщение
C
1
2
fscanf(f_passwd, "%s", buf_name[1]);
printf ("Chek buf_str-> %s\n", buf_name[1]);
как следствие - выход за переделы массива
1
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 17
25.04.2015, 17:37  [ТС]
ёмаё, досадно, забыл, что с 0 нумеруется. Стыдно, обидно, досадно. Спасибо вам! А я уже начал думать, с в файле, с которого я считываю, что-то неправильно с кодировкой.

Добавлено через 13 минут
Ребята, а кто может подсказать, как вообще удаляются учётные записи пользователей в Unix-системах, средствами программирования на С.

В моей ситуации, когда нужно оставить системные файлы без изменений, я ничего лучше не придумал, сделать копии системных файлов, а затем уже работать с ними и удалять строки которые отвечают за тех пользователей, чьи учётные записи нужно удалить.

А вот если бы нужно было изменить первоначальный системный файл, можно ли было сделать как-то по другому? я знаю, что существуют библиотеки pwd.h, grp.h и т.д. которые позволяют получать информацию о пользователях, группах и т.д. Возможно-ли как-то удалить пользователя с помощью этих библиотек? Например получить указатель на структуру group и в поле "пользователи группы" записать пробелы, например. Тогда система подтянет эту инфу и пользователи будут удалены из этой группы??? или эти библиотеки "однонаправленные" и созданы только для того, чтобы считать необходимую информацию?

Добавлено через 1 час 55 минут
Ошибка осталась. Теперь вместо "абракадабры" выводиться пустая строка. Код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// 21. Удалить из системны пользователей, которые принадлежат указанным группам.
// Изменения системных файлов записать в новые файлы, старые систмные файлы оставить без изменений.
// Имена выходных файлов и файл с именами групп передать при запуске программы (через вх. параметры)
 
#include <stdio.h>   
#include <grp.h>      // для работы с группами 
#include <pwd.h>      // для работы с пользователями
 
void Open_File (FILE **f_pointer, char *path, char *mode);
void Close_File (FILE *f_pointer);
void Copy_System_File_To_New_System_File (FILE *f_old, FILE *f_new);
 
int err_file;                                                    // признак ошибки открытия какого-либо
 
int main(int argc, char *argv[])
{  
  FILE *f_name_group;                                              // указатель на файл c именами групп
  FILE *f_passwd,*f_group,*f_shadow,*f_gshadow;                    // указатели на системные файлы
  FILE *f_new_passwd,*f_new_group,*f_new_shadow,*f_new_gshadow;    // указатели на отредактированные системные файлы
  char name_group[10][20]; // массив из 10 строк, каждая длинной в 20 символов
  int count_name_group=0;  // количество имён групп, пользователей которых нужно удалить
  int i,count_str=0;
  struct group *my_group;  // указатель на структуру группы 
  char **members;          // имена пользователей группы
  char **buf_str;
  char buf_name[128];
  char *path, *mode;       // имя системного файла, режим открытия
 
 //--------------ПРОВЕРКА ВХОДНЫХ ПАРАМЕТРОВ И ОТКРЫТИЕ ФАЙЛОВ-----------------------------------------------------------
   if (argc == 6)                                                            // если все входные параметры заданы
   {  
     printf("argc = %d\n",argc);
     Open_File(&f_name_group, argv[1], "rt");                         // открытие файла с имена групп
     printf("Names group for deleting users: ");
     //Формирование массива с именами групп, пользователей которых нужно удалить
    while (fscanf(f_name_group, "%s", name_group[count_name_group]) != EOF)  // читаем файл построчно в массив строк
     {
      printf("%s ", name_group[count_name_group]); 
      count_name_group++;
     }
     fclose(f_name_group);                                                   // закрыть файл после чтения
//----------Открытие новых файлов, куда будем записывать преобразованные системные файлы--------------------------------
     Open_File(&f_new_passwd, argv[2], "wt");               //открытие новых системных файлов
     Open_File(&f_new_group, argv[3], "wt");  
     Open_File(&f_new_shadow, argv[4], "wt");  
     Open_File(&f_new_gshadow, argv[5], "wt");
     Open_File(&f_passwd,"../../etc/passwd", "rt");         // открытие исходных системных файлов 
     Open_File(&f_group,"../../etc/group", "rt");  
     Open_File(&f_shadow,"../../etc/shadow", "rt");  
     Open_File(&f_gshadow,"../../etc/gshadow", "rt");    
     if (err_file==-1) return -1;
     
     Copy_System_File_To_New_System_File(f_passwd, f_new_passwd);  //копирование систменых файлов
     Copy_System_File_To_New_System_File(f_group, f_new_group);
     Copy_System_File_To_New_System_File(f_shadow, f_new_shadow);
     Copy_System_File_To_New_System_File(f_gshadow, f_new_gshadow);
     
     Close_File(f_passwd);
     Close_File(f_group);
     Close_File(f_shadow);
     Close_File(f_gshadow);  // закрытие системных файлов
//-----------------------------------------------------------------------------------------------------------------------
    while (count_name_group>0)
    {
    my_group=getgrnam(name_group[count_name_group-1]); //получаем указатель на структуру группы по имени.
    if (my_group == NULL) printf ("\nError! User group not found! \n");
    members = my_group->gr_mem;  //получаем имена пользователей этой группы
    printf ("\nCheck - > Name_group: %s\n", my_group->gr_name);
     while (*members) //проходим по именам пользователей
      {
       printf ("Check - > Name_User: %s\n", *(members));
      //fgets(buf_name, 128, f_new_passwd);
        
      rewind(f_new_passwd);  //ОБЯЗАТЕЛЬНО!
      fscanf(f_new_passwd, "%s", buf_name);
      printf ("Chek buf_str-> %s\n", buf_name);
       
       members++;
       }       
    
    count_name_group--;
    } //end while
       
   } else {printf("ERROR! Check input parameters!\n"); return -1; } 
   // ------ПРОГРАММА ЗАВЕРШЕНА--------------------------------------------------------------------------------------------
  printf("\nProgram has been successfully completed!\n");                  
  return 0;
} //end MAIN
    
void Open_File (FILE **f_pointer, char *path, char *mode) // Открытие исходных системных файлов
{
     if ((*f_pointer = fopen(path, mode)) == NULL) 
     {                                                                       
      printf("\nERROR! File %s was not opened for %s\n", path, mode);    
      err_file=-1;                                                               
     }
     
} // end Open_File
 
void Close_File (FILE *f_pointer) 
// Закрытие исходных системных файлов
{    
    if(fclose(f_pointer)) printf("Error! File was not closed\n");
    
} // end Close_File
 
void Copy_System_File_To_New_System_File (FILE *f_old, FILE *f_new) 
//Копирование системных файлов для последующей обработки
{   
char str[128];
char *estr;
 while (1)
   {
   estr = fgets (str,sizeof(str),f_old);
    if (estr == NULL)
     {
      if ( feof (f_old) != 0)
       break;  //всё нормально, файл закончился
      else
        {
         printf ("\nError read file\n");
         break;
        }
     }
      fputs(str, f_new); //копируем в другой файл
   }
   
} //end Copy_System_Files_To_New_System_Files
0
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 17
25.04.2015, 17:42  [ТС]
Хотя файлы f_new_passwd заполнен:


0
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 17
25.04.2015, 17:43  [ТС]
З.Ы. С оригинальным файлом f_passwd всё работает. И строка выводиться.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
25.04.2015, 17:52
ваша Copy_System_File_To_New_System_File не прост о копирует содержимое, но и вставляет. дополнительные пустые строки в новый файл. и вот тут
Цитата Сообщение от Neuling Посмотреть сообщение
C
1
fscanf(f_new_passwd, "%s", buf_name);
эти пустые строки вполне успешно будут считываться

Добавлено через 3 минуты
и для чего в цикле rewind? считывать одну и ту же строку?
1
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 17
25.04.2015, 17:56  [ТС]
Хм, не могу понять, где в алгоритме "Copy_System_File_To_New_System_File " вставляются пустые строки. И почему тогда при открытии текстовым редактором файла f_new_passwd пустых строк нет?

Добавлено через 1 минуту
rewind в цикле не нужен, это пока-что так сделал, просто чтобы попробовать.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
25.04.2015, 18:01
Цитата Сообщение от Neuling Посмотреть сообщение
не могу понять, где в алгоритме "Copy_System_File_To_New_System_File " вставляются пустые строки
смотрим
Цитата Сообщение от Neuling Посмотреть сообщение
C
1
estr = fgets (str,sizeof(str),f_old);
estrstr соотв.) будет указывать на строку вида "blablabla\n"
Цитата Сообщение от Neuling Посмотреть сообщение
C
1
fputs(str, f_new);
запишет str + '\n', т.е. "blablabla\n\n"
2
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 17
25.04.2015, 18:11  [ТС]
"почему тогда при открытии текстовым редактором файла f_new_passwd пустых строк нет?"

Добавлено через 7 минут
даже при выполнении кода
C
1
2
3
4
  while(i<1000){
      fscanf(f_new_passwd, "%s", buf_name);
      printf ("Chek buf_str-> %s\n", buf_name);
       i++;}
всё равно все строки пустые.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
25.04.2015, 18:38
да вы правы. я перепутал с puts. в отличие от нее fputs не пишет лишний '\n'

Добавлено через 15 минут
Цитата Сообщение от Neuling Посмотреть сообщение
C
1
Open_File(&f_new_passwd, argv[2], "wt");
забавно. бревна в глазу не видно) вы не можете читать этот файл и ревинд вам не поможет. ставьте режим w+
0
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 17
25.04.2015, 23:44  [ТС]
retmas, большое спасибо Вам, чтобы помогаете.

Нашёл ошибку.

Файл f_new_passwd был открыт для записи, mode - "wt"
Поэтому не удавалось произвести его чтение.

Открыл затем для чтения и записи "Open_File(&f_new_passwd,argv[2], "a+");" и проблема решилась.

Добавлено через 1 минуту
З.Ы ахахаха, спасибо!!)) Уже тоже нашёл этот забавный недочёт))))

Добавлено через 5 часов 4 минуты
Подскажите, как можно сравнить содержимое двух строк, когда одна объявлена как массив символов char (char str_name[128], а другую нужно взять из массива строк, который объявлен как указатель на указатель (char **members). Хочу сделать так: сначала сравнить длину двух строк,а если длина равна сравнивать посимвольно. Но сразу же проблема, как узнать длину строки во втором случае? sizeof не работает (в данном случае он будет показывать размер указателя). Как именно можно обращаться к строке, которая лежит в **members (там несколько строк, мне надо в цикле сравнивать со всеми ними строку str_name). Место в коде, где должно выполняться данное сравнение, выделил комментариями в верхнем регистре.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
// 21. Удалить из системны пользователей, которые принадлежат указанным группам.
// Изменения системных файлов записать в новые файлы, старые систмные файлы оставить без изменений.
// Имена выходных файлов и файл с именами групп передать при запуске программы (через вх. параметры)
 
#include <stdio.h>   
#include <grp.h>      // для работы с группами 
#include <pwd.h>      // для работы с пользователями
#include <string.h>   //для работы со строками
 
void Open_File (FILE **f_pointer, char *path, char *mode);
void Close_File (FILE *f_pointer);
void Copy_System_File_To_New_System_File (FILE *f_old, FILE *f_new);
 
int err_file;                                                    // признак ошибки открытия какого-либо
 
int main(int argc, char *argv[])
{  
  FILE *f_name_group;                                              // указатель на файл c именами групп
  FILE *f_passwd,*f_group,*f_shadow,*f_gshadow;                    // указатели на системные файлы
  FILE *f_new_passwd,*f_new_group,*f_new_shadow,*f_new_gshadow;    // указатели на отредактированные системные файлы
  char name_group[10][20]; // массив из 10 строк, каждая длинной в 20 символов
  int count_name_group=0;  // количество имён групп, пользователей которых нужно удалить
  int i,j,k,kol,count_memb, count_symbol,count_str=0;
  struct group *my_group;  // указатель на структуру группы 
  char **members;          // имена пользователей группы
  char buf_name[128];
  char str_name[128];
  char *path, *mode;       // имя системного файла, режим открытия
 
 //--------------ПРОВЕРКА ВХОДНЫХ ПАРАМЕТРОВ И ОТКРЫТИЕ ФАЙЛОВ-----------------------------------------------------------
   if (argc == 6)                                                            // если все входные параметры заданы
   {  
     printf("argc = %d\n",argc);
     Open_File(&f_name_group, argv[1], "rt");                         // открытие файла с имена групп
     printf("Names group for deleting users: ");
     //Формирование массива с именами групп, пользователей которых нужно удалить
    while (fscanf(f_name_group, "%s", name_group[count_name_group]) != EOF)  // читаем файл построчно в массив строк
     {
      printf("%s ", name_group[count_name_group]); 
      count_name_group++;
     }
     fclose(f_name_group);                                                   // закрыть файл после чтения
//----------Открытие новых файлов, куда будем записывать преобразованные системные файлы--------------------------------
     Open_File(&f_new_passwd, argv[2], "r+");               //открытие новых системных файлов
     Open_File(&f_new_group, argv[3], "r+");  
     Open_File(&f_new_shadow, argv[4], "r+");  
     Open_File(&f_new_gshadow, argv[5], "r+");
     Open_File(&f_passwd,"../../etc/passwd", "rt");         // открытие исходных системных файлов 
     Open_File(&f_group,"../../etc/group", "rt");  
     Open_File(&f_shadow,"../../etc/shadow", "rt");  
     Open_File(&f_gshadow,"../../etc/gshadow", "rt");    
     if (err_file==-1) return -1;
     
     Copy_System_File_To_New_System_File(f_passwd, f_new_passwd);  //копирование систменых файлов
     Copy_System_File_To_New_System_File(f_group, f_new_group);
     Copy_System_File_To_New_System_File(f_shadow, f_new_shadow);
     Copy_System_File_To_New_System_File(f_gshadow, f_new_gshadow);
     
     Close_File(f_passwd);
     Close_File(f_group);
     Close_File(f_shadow);
     Close_File(f_gshadow);  // закрытие системных файлов
//-/----------------------------------------------------------------------------------------------------------------------
    while (count_name_group>0)
    {
    my_group=getgrnam(name_group[count_name_group-1]); //получаем указатель на структуру группы по имени.
    if (my_group == NULL) printf ("\nError! User group not found! \n");
    members = my_group->gr_mem;  //получаем имена пользователей этой группы
    printf ("\nCheck - > Name_group: %s\n", my_group->gr_name);
    // while (*members) //проходим по именам пользователей
      {
       printf ("Check for *members - > Name_User: %s\n", *(members));
       count_memb=sizeof(members); 
       printf("cout_memb=%d\n",count_memb);
       
       rewind(f_new_passwd);  //ОБЯЗАТЕЛЬНО!
       count_str=0;
       
       while(fgets(buf_name, sizeof(buf_name),f_new_passwd)!=NULL)
        {
         printf ("Check for fscanf - > Stroka: %s", buf_name);
         count_symbol=0;
          for (i=0;i<=127;i++)
           {
             if (buf_name[i]!=':')
              count_symbol++;
             else
             {
              for (j=0;j<=127;j++) str_name[j]=' ';       //обнуляем строку
              printf("count_symbol=%d\n", count_symbol);  
              strncpy(str_name, buf_name, count_symbol);
              str_name[count_symbol]='\0'; count_symbol++;
              printf ("Check name for strncpy -> %s\n", str_name);
              break;
             }       
           } //end for по строке
           
//ВОТ ЗДЕСЬ НУЖНО СРАВНИТЬ ИМЕНЯ ПОЛЬЗОВАТЕЛЕЙ, ОДНО НАХОДИТСЯ В STR_NAME,
// А ДРУГОЕ В **members 
 
           if (count_memb==count_symbol) 
           {
           for (k=0;k<=count_symbol;k++)
           if (str_name[k]==*members[k]) printf("str equal\n");
            printf("str NOT equal\n");
            // если str_name == *members => удалить текущую строку
            
//ЕСЛИ ИМЕНА СОВПАДАЮТ, ТО НУЖНО УДАЛИТЬ ПОЛНОСТЬЮ ТЕКЦЩУЮ СТРОКУ ИЗ ФАЙЛА f_new_passwd           
           }
        count_str++;
        } //end While по строкам в файле
        printf("count_str=%d\n",count_str);
       //members++;
      }       
    
    count_name_group--;
    } //end while
       
   } else {printf("ERROR! Check input parameters!\n"); return -1; } 
   // ------ПРОГРАММА ЗАВЕРШЕНА--------------------------------------------------------------------------------------------
  printf("\nProgram has been successfully completed!\n");                  
  return 0;
} //end MAIN
    
void Open_File (FILE **f_pointer, char *path, char *mode) // Открытие исходных системных файлов
{
     if ((*f_pointer = fopen(path, mode)) == NULL) 
     {                                                                       
      printf("\nERROR! File %s was not opened for %s\n", path, mode);    
      err_file=-1;                                                               
     }
     
} // end Open_File
 
void Close_File (FILE *f_pointer) 
// Закрытие исходных системных файлов
{    
    if(fclose(f_pointer)) printf("Error! File was not closed\n");
    
} // end Close_File
 
void Copy_System_File_To_New_System_File (FILE *f_old, FILE *f_new) 
//Копирование системных файлов для последующей обработки
{   
char str[128];
char *estr;
 while (1)
   {
   estr = fgets (str,sizeof(str),f_old);
    if (estr == NULL)
     {
      if ( feof (f_old) != 0)
       break;  //всё нормально, файл закончился
      else
        {
         printf ("\nError read file\n");
         break;
        }
     }
      fputs(str, f_new); //копируем в другой файл
   }
   
} //end Copy_System_Files_To_New_System_Files
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
26.04.2015, 09:44
не вникал в код цикла, т.к. на беглый взгляд там бардак и непотребство, но замечу:
Цитата Сообщение от Neuling Посмотреть сообщение
C
1
count_memb=sizeof(members);
получаете размер указателя в байтах, а не количество пользователей.
строки сравнивайте функцией str(n)cmp.
а вообще продумайте лучше удаление пользователей. например, следующие случаи:
- удаляемый пользователь может состоять и в других группах (не указанных во входном файле). значит нужно удалить его и из них.
- пользователь может владеть своей группой (не указанной во входном файле). например, в группе kolya_and_co (указанной во входном файле) есть пользователь vasya, у этого пользователя есть своя группа vasya. при удалении пользователя vasya следует удалить и его группу vasya, если она является первичной для vasya, она не является первичной для других пользователей, она не содержит других пользователей.
1
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 17
26.04.2015, 11:54  [ТС]
Спасибо за советы!)

Ну да, насколько я понял, каждый пользователь в Unix-подобных системах состоит хотя бы в одной группе (с таким же именем как и у пользователя). Но тут проблем не будет, точно также до первого двоеточия буду считывать имя группы и удалять её, если имя группы == имя пользователя.

а вот по поводу удаления пользователей из других групп, не указанных во входном файле, тут уже нужно будет действительно переделать алгоритм.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.04.2015, 11:54
Помогаю со студенческими работами здесь

Учетные записи пользователей
Решил проверить комп через программу AntiSMS 3.0. Загрузился с диска, выполнил операцию и сделал перезагрузку. До этого была только одна...

Учетные записи пользователей
Помогите пожалуйста на ПК существует встроенная учетная запись администратора и usera - будучи под userом я ограничела его права и теперь...

Активные учетные записи пользователей
Доброе время суток. Windows 7 64bit Нужен способ или плагин, патч. Чтобы запустить несколько 2.3.4…. активных учетных записей...

Настроить учетные записи пользователей
На компьютере установлены две учетные записи,одна администратор,другая user. Причем и USER и администратор обладают административными...

Учетные записи пользователей Windows 7
Приветствую! помогите с вопросом, касается учетных записей пользователей. Кто то знает как в системе можно узнать, состоял ли какой то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru