удаление юзера из группы

classic Classic list List threaded Threaded
15 messages Options
Reply | Threaded
Open this post in threaded view
|

удаление юзера из группы

Vladimir L. Antipov
Hi All,

 звучит, наверное, банально, но не нашёл как сделать удаление юзера из
 группы, без удаления самого пользователя.. (аналог freebsd-шного
 deluser user group). Вариант ручной правки /etc/groups не подойдёт,
 т.к. фича используется в автоматическом режиме в smb.conf

 в сети нашёл по теме только вот это:

 Вот тема(ровно та же трабла, что и у мну): http://www.security-express.com/archives/openbsd/2006-10/2778.html

 Вот все ответы: http://www.security-express.com/archives/openbsd/2006-10/thread.html#2778


Может что-нибудь упустил из виду?

--
Yours faithfully, Vladimir L. Antipov
the engineer-programmer, "IC Sampo.ru" СС
mailto:[hidden email]


Reply | Threaded
Open this post in threaded view
|

Re: удаление юзера из группы

Dinar Talypov
On Fri, 20 Mar 2009 01:05:24 +0300
"Vladimir L. Antipov" <[hidden email]> wrote:

> Hi All,
>
>  звучит, наверное, банально, но не нашёл как сделать удаление юзера из
>  группы, без удаления самого пользователя.. (аналог freebsd-шного
>  deluser user group). Вариант ручной правки /etc/groups не подойдёт,
>  т.к. фича используется в автоматическом режиме в smb.conf
>
>  в сети нашёл по теме только вот это:
>
>  Вот тема(ровно та же трабла, что и у мну): http://www.security-express.com/archives/openbsd/2006-10/2778.html
>
>  Вот все ответы: http://www.security-express.com/archives/openbsd/2006-10/thread.html#2778
>
>

если только манипуляции с usermod -g и usermod -G :)
 
--
Динар Талыпов


Reply | Threaded
Open this post in threaded view
|

Re[2]: удаление юзера из группы

Vladimir L. Antipov
Hi Dinar,

Friday, March 20, 2009, 7:45:01 AM, you wrote:

DT> On Fri, 20 Mar 2009 01:05:24 +0300
DT> "Vladimir L. Antipov" <[hidden email]> wrote:

>> Hi All,
>>
>>  звучит, наверное, банально, но не нашёл как сделать удаление юзера из
>>  группы, без удаления самого пользователя.. (аналог freebsd-шного
>>  deluser user group). Вариант ручной правки /etc/groups не подойдёт,
>>  т.к. фича используется в автоматическом режиме в smb.conf
>>
>>  в сети нашёл по теме только вот это:
>>
>>  Вот тема(ровно та же трабла, что и у мну): http://www.security-express.com/archives/openbsd/2006-10/2778.html
>>
>>  Вот все ответы: http://www.security-express.com/archives/openbsd/2006-10/thread.html#2778
>>
>>

DT> если только манипуляции с usermod -g и usermod -G :)
DT>  

Какого рода манипуляции? Поделитесь секретом? :)

Рассмотрю скриптовые варианты.

З.Ы.: вообще странно.. такая отличная система и такая мелкая
недоработка :)

--
Yours faithfully, Vladimir L. Antipov
the engineer-programmer, "IC Sampo.ru" СС
mailto:[hidden email]


Reply | Threaded
Open this post in threaded view
|

Re: Re[2]: удаление юзера из группы

Anton Maksimenkov-2
>>>  звучит, наверное, банально, но не нашёл как сделать удаление юзера из
>>>  группы, без удаления самого пользователя.. (аналог freebsd-шного
>>>  deluser user group). Вариант ручной правки /etc/groups не подойдёт,
>>>  т.к. фича используется в автоматическом режиме в smb.conf
> DT> если только манипуляции с usermod -g и usermod -G :)
> Какого рода манипуляции? Поделитесь секретом? :)
> Рассмотрю скриптовые варианты.

о боже... а вы сами не в состоянии написать скрипт, который поменяет
строчку в файле?
--
engineer
Reply | Threaded
Open this post in threaded view
|

Re: Re[2]: удаление юзера из группы

Alexander Yurchenko-3
On Fri, Mar 20, 2009 at 03:11:00PM +0500, engineer wrote:

> >>>  звучит, наверное, банально, но не нашёл как сделать удаление юзера из
> >>>  группы, без удаления самого пользователя.. (аналог freebsd-шного
> >>>  deluser user group). Вариант ручной правки /etc/groups не подойдёт,
> >>>  т.к. фича используется в автоматическом режиме в smb.conf
> > DT> если только манипуляции с usermod -g и usermod -G :)
> > Какого рода манипуляции? Поделитесь секретом? :)
> > Рассмотрю скриптовые варианты.
>
> о боже... а вы сами не в состоянии написать скрипт, который поменяет
> строчку в файле?

Это не так просто, как кажется, нужны блокировки. Особенно если скрипт
будет использоваться неинтерактивно.

> --
> engineer

--
Alexander Yurchenko


Reply | Threaded
Open this post in threaded view
|

Re[4]: удаление юзера из группы

Vladimir L. Antipov
In reply to this post by Anton Maksimenkov-2
Hi engineer,

Friday, March 20, 2009, 1:11:00 PM, you wrote:

>>>>  звучит, наверное, банально, но не нашёл как сделать удаление юзера из
>>>>  группы, без удаления самого пользователя.. (аналог freebsd-шного
>>>>  deluser user group). Вариант ручной правки /etc/groups не подойдёт,
>>>>  т.к. фича используется в автоматическом режиме в smb.conf
>> DT> если только манипуляции с usermod -g и usermod -G :)
>> Какого рода манипуляции? Поделитесь секретом? :)
>> Рассмотрю скриптовые варианты.

e> о боже... а вы сами не в состоянии написать скрипт, который поменяет
e> строчку в файле?

о боже... сколько пафоса! Я написал скрипт ещё до написания в
рассылку. Меня интересовали штатные методы решения задачи или на
крайняк более элегантные скриптовые, чем мои собственные.

---------------------8<----------8<---------------------
#!/usr/bin/perl

use strict;

my ($user, $group) = @ARGV;
my $out = '';

open G, "</etc/group";
while (my $line = <G>) {
  if ($line =~ /^$group:/) {
    $line =~ s/([:,])$user(,)?(?=[^:]*$)/$1 eq ':' ? $1 : $2/e;
  }
  $out .= $line;
}
close G;

open G, ">/etc/group";
print G $out;
close G;
----------------------8<----------8<---------------------


>Это не так просто, как кажется, нужны блокировки. Особенно если скрипт
>будет использоваться неинтерактивно.
подумалось о добавлении flock.. но при открытии на чтение ещё рано, а
при открытии на запись уже вроде как поздно..



--
Yours faithfully, Vladimir L. Antipov
the engineer-programmer, "IC Sampo.ru" СС
mailto:[hidden email]


Reply | Threaded
Open this post in threaded view
|

Re: удаление юзера из группы

Alexander Yurchenko-3
On Fri, Mar 20, 2009 at 01:51:22PM +0300, Vladimir L. Antipov wrote:
> >Это не так просто, как кажется, нужны блокировки. Особенно если скрипт
> >будет использоваться неинтерактивно.
> подумалось о добавлении flock.. но при открытии на чтение ещё рано, а

Как это рано? В самый раз. Другое дело, что совсем правильно решить эту
проблему не получится, так как если вдруг случится, что во время работы
вашего скрипта кто-нибудь сделает, скажем, adduser, вы останетесь с
покоцаным /etc/group.

Именно поэтому существует vipw(8).

> при открытии на запись уже вроде как поздно..
>
>
>
> --
> Yours faithfully, Vladimir L. Antipov
> the engineer-programmer, "IC Sampo.ru" СС
> mailto:[hidden email]

--
Alexander Yurchenko


Reply | Threaded
Open this post in threaded view
|

Re: Re[4]: удаление юзера из группы

Anton Maksimenkov-2
In reply to this post by Vladimir L. Antipov
блин, куда-т нетуда письмо ушло...

>>>> Рассмотрю скриптовые варианты.
>> e> о боже... а вы сами не в состоянии написать скрипт, который поменяет
>> о боже... сколько пафоса! Я написал скрипт ещё до написания в
>> рассылку. Меня интересовали штатные методы решения задачи или на
>> крайняк более элегантные скриптовые, чем мои собственные.
>>>Это не так просто, как кажется, нужны блокировки. Особенно если скрипт
>>>будет использоваться неинтерактивно.

Повторюсь:
Извините, если обидел, но. Может стоило указать, что проблема в
блокировках? Не знаю у кого как, а у меня ваше письмо вначале создало
именно впечатление "дайте прогу чтобы файл не редактировать руками".

grange@ двинул мысль, есть pw_lock(3). Но это если уметь С.
--
engineer
Reply | Threaded
Open this post in threaded view
|

Re[6]: удаление юзера из группы

Vladimir L. Antipov
Hi engineer,

Friday, March 20, 2009, 2:21:04 PM, you wrote:

e> блин, куда-т нетуда письмо ушло...

>>>>> Рассмотрю скриптовые варианты.
>>> e> о боже... а вы сами не в состоянии написать скрипт, который поменяет
>>> о боже... сколько пафоса! Я написал скрипт ещё до написания в
>>> рассылку. Меня интересовали штатные методы решения задачи или на
>>> крайняк более элегантные скриптовые, чем мои собственные.
>>>>Это не так просто, как кажется, нужны блокировки. Особенно если скрипт
>>>>будет использоваться неинтерактивно.

e> Повторюсь:
e> Извините, если обидел, но.
нет, ни в коем разе. Я понимаю что разница в моём понимании системы
и другими участниками может быть огромной, так что спишем на нормальные
рабочие моменты :)

e>  Может стоило указать, что проблема в
e> блокировках? Не знаю у кого как, а у меня ваше письмо вначале создало
e> именно впечатление "дайте прогу чтобы файл не редактировать руками".
Изначально проблема не в блокировках (хотя в конечном счёте - в них),
а в недопонимании того факта, что такая, казалось бы, простая и нужная
утилита отсутствует в любимой ОС - предположительно по причине
нехватки знаний оной :\

e> grange@ двинул мысль, есть pw_lock(3). Но это если уметь С.
C уметь, но под *nix ни разу не писать :)

С учётом всех пожеланий - дополнил скрипт следующим образом:

------------------------------8<-----------------------------------------
#!/usr/bin/perl

use strict;

my ($user, $group) = @ARGV;

if (scalar @ARGV != 2){
  print STDERR "Usage:  deluser user group\n"
}

my $out = '';

# бэкапим оригинал
`cp /etc/group /etc/group.bak`;


open G, "</etc/group";
flock(G, 4) or die ("Can't lock /etc/group (program already running?)\n");
while (my $line = <G>) {
  if ($line =~ /^$group:/) {
    $line =~ s/([:,])$user(,)?(?=[^:]*$)/$1 eq ':' ? $1 : $2/e;
  }                                                        
  $out .= $line;                                            
}                                                          
close G;                                                    
                                                           
open G, ">/etc/group";                                      
print G $out;
close G;
------------------------------8<-----------------------------------------


Есть какие-нибудь соображения по оптимизации или более правильному
подходу?


--
Yours faithfully, Vladimir L. Antipov
the engineer-programmer, "IC Sampo.ru" СС
mailto:[hidden email]


Reply | Threaded
Open this post in threaded view
|

Re: Re[6]: удаление юзера из группы

Anton Maksimenkov-2
> e> grange@ двинул мысль, есть pw_lock(3). Но это если уметь С.
> C уметь, но под *nix ни разу не писать :)

В юзерспейсе разницы почти нету (до определённого уровня). Тем более в
таком простейшем случае. Хотя не, одна "сложность" есть - понять и
заюзать pw_lock.
Написал исходник proga.c, запустил
$ gcc proga.c -o proga
получил исполняемый фаел proga. Куда уж проще.

> С учётом всех пожеланий - дополнил скрипт следующим образом:
> # бэкапим оригинал
> `cp /etc/group /etc/group.bak`;
:-))

> open G, "</etc/group";
> flock(G, 4) or die ("Can't lock /etc/group (program already running?)\n");
> while (my $line = <G>) {
>  if ($line =~ /^$group:/) {
>    $line =~ s/([:,])$user(,)?(?=[^:]*$)/$1 eq ':' ? $1 : $2/e;
>  }
>  $out .= $line;
> }
> close G;
^^^^^^^^^^^
теперь блокировка снята, значит нижеследующая запись будет происходить
наобум, и параллельный процесс, который захочет читать, - он вполне
нормально получит блокировку и может прочитать мусор. а потом и
записать этот мусор.

> open G, ">/etc/group";
> print G $out;
> close G;
> ------------------------------8<-----------------------------------------
> Есть какие-нибудь соображения по оптимизации или более правильному
> подходу?

Более "правильно" (держа в голове pw_lock как ПРАВИЛЬНОЕ решение) было
бы примерно так:

1) открываем и БЛОКИРУЕМ /etc/group
--
2) открываем временный файл, например /tmp/fael
3) читаем /etc/group и пишем "как должно быть" в /tmp/fael
4) mv /tmp/fael /etc/group
--
5) РАЗБЛОКИРУЕМ /etc/group, и закрываем оба файла.

и лучше бы это сделать на С и с применением pw_lock. А ещё лучше,
перед этим освежить в памяти какуюнить главу из книжки по теме.
--
engineer
Reply | Threaded
Open this post in threaded view
|

Re: Re[4]: удаление юзера из группы

Alexander Yurchenko-3
In reply to this post by Anton Maksimenkov-2
On Fri, Mar 20, 2009 at 04:21:04PM +0500, engineer wrote:
> grange@ двинул мысль, есть pw_lock(3). Но это если уметь С.

Судя по ману pw_lock(3) не имеет никакого отношения к /etc/group.

> --
> engineer

--
Alexander Yurchenko


Reply | Threaded
Open this post in threaded view
|

Re: Re[4]: удаление юзера из группы

Anton Maksimenkov-2
>> grange@ двинул мысль, есть pw_lock(3). Но это если уметь С.
>
> Судя по ману pw_lock(3) не имеет никакого отношения к /etc/group.

Суть в том, что тот же vipw лочит это перед тем как. Домашнее
упражнение для топикстартера - посмотреть лочат ли его остальные
useradd и подобные перед тем как.
Если да, то захваченный pw_lock гарантирует что никто другой в это
время не сможет ничего поменять (в том числе и в /etc/group) и сделать
мусор - ни этот скрипт, ни vipw, ни другие подобные утилиты. (ну разве
что руками vi /etc/group кто-то полезет...). Я так думал.
--
engineer
Reply | Threaded
Open this post in threaded view
|

Re: удаление юзера из группы

Alexander Yurchenko-3
In reply to this post by Vladimir L. Antipov
On Fri, Mar 20, 2009 at 01:05:24AM +0300, Vladimir L. Antipov wrote:
> Hi All,
>
>  звучит, наверное, банально, но не нашёл как сделать удаление юзера из
>  группы, без удаления самого пользователя.. (аналог freebsd-шного
>  deluser user group). Вариант ручной правки /etc/groups не подойдёт,
>  т.к. фича используется в автоматическом режиме в smb.conf

Стандартной команды нет. Более-менее правильный путь: брать список групп
из groups(1), вырезать нужную и засовывать новый список обратно в
usermod -G. Способ довольно глючный, так как есть race между двумя
копиями данного скрипта, а так же с другими копиями утилит на основе
user(8).

Можно биться с /etc/group в рукопашную, например на perl. Если при этом
использовать flock(2), то решаются все races, так как по счастливой
случайности (sic!) все утилиты на основе user(8) так же используют flock(2)
для блокировки /etc/group.

>
>  в сети нашёл по теме только вот это:
>
>  Вот тема(ровно та же трабла, что и у мну): http://www.security-express.com/archives/openbsd/2006-10/2778.html
>
>  Вот все ответы: http://www.security-express.com/archives/openbsd/2006-10/thread.html#2778
>
>
> Может что-нибудь упустил из виду?
>
> --
> Yours faithfully, Vladimir L. Antipov
> the engineer-programmer, "IC Sampo.ru" СС
> mailto:[hidden email]
>

--
Alexander Yurchenko


Reply | Threaded
Open this post in threaded view
|

Re[2]: удаление юзера из группы

Vladimir L. Antipov
Hi Alexander,

Tuesday, March 24, 2009, 2:44:03 PM, you wrote:

AY> On Fri, Mar 20, 2009 at 01:05:24AM +0300, Vladimir L. Antipov wrote:
>> Hi All,
>>
>>  звучит, наверное, банально, но не нашёл как сделать удаление юзера из
>>  группы, без удаления самого пользователя.. (аналог freebsd-шного
>>  deluser user group). Вариант ручной правки /etc/groups не подойдёт,
>>  т.к. фича используется в автоматическом режиме в smb.conf

AY> Стандартной команды нет. Более-менее правильный путь: брать список групп
AY> из groups(1), вырезать нужную и засовывать новый список обратно в
AY> usermod -G. Способ довольно глючный, так как есть race между двумя
AY> копиями данного скрипта, а так же с другими копиями утилит на основе
AY> user(8).
Вот это и странно.. неужели уважаемые разработчики никогда не
задумывались на эту тему?

AY> Можно биться с /etc/group в рукопашную, например на perl. Если при этом
AY> использовать flock(2), то решаются все races, так как по счастливой
AY> случайности (sic!) все утилиты на основе user(8) так же используют flock(2)
AY> для блокировки /etc/group.
Как раз решил проблему на перле, скрипт пролетал в рассылке, первая
мысль была как раз о flock(2), но поступило предложение сделать
flock(4).. видимо имеет смысл исправить на 2

[cut]


--
Yours faithfully, Vladimir L. Antipov
the engineer-programmer, "IC Sampo.ru" СС
mailto:[hidden email]


Reply | Threaded
Open this post in threaded view
|

Re: Re[2]: удаление юзера из группы

Anton Maksimenkov-2
> Как раз решил проблему на перле, скрипт пролетал в рассылке, первая
> мысль была как раз о flock(2), но поступило предложение сделать
> flock(4).. видимо имеет смысл исправить на 2

Вы не поняли, это такой стиль общения. Если в тексте идёт abc(Х), это
значит номер секции мануала - то есть вам намекают что надо читать man
X abc.
Ну а в тексте кода, ессно, приводят код :-) В моём случае это был
параметр, 4. Хотя для него есть строковая константа, кажется LOCK_EX.
Видимо есть смысл почитать что про это рассказывает perldoc -f flock
--
engineer