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] |
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 :) -- Динар Талыпов |
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] |
>>> звучит, наверное, банально, но не нашёл как сделать удаление юзера из
>>> группы, без удаления самого пользователя.. (аналог freebsd-шного >>> deluser user group). Вариант ручной правки /etc/groups не подойдёт, >>> т.к. фича используется в автоматическом режиме в smb.conf > DT> если только манипуляции с usermod -g и usermod -G :) > Какого рода манипуляции? Поделитесь секретом? :) > Рассмотрю скриптовые варианты. о боже... а вы сами не в состоянии написать скрипт, который поменяет строчку в файле? -- engineer |
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 |
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] |
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 |
In reply to this post by Vladimir L. Antipov
блин, куда-т нетуда письмо ушло...
>>>> Рассмотрю скриптовые варианты. >> e> о боже... а вы сами не в состоянии написать скрипт, который поменяет >> о боже... сколько пафоса! Я написал скрипт ещё до написания в >> рассылку. Меня интересовали штатные методы решения задачи или на >> крайняк более элегантные скриптовые, чем мои собственные. >>>Это не так просто, как кажется, нужны блокировки. Особенно если скрипт >>>будет использоваться неинтерактивно. Повторюсь: Извините, если обидел, но. Может стоило указать, что проблема в блокировках? Не знаю у кого как, а у меня ваше письмо вначале создало именно впечатление "дайте прогу чтобы файл не редактировать руками". grange@ двинул мысль, есть pw_lock(3). Но это если уметь С. -- engineer |
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] |
> 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 |
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 |
>> grange@ двинул мысль, есть pw_lock(3). Но это если уметь С.
> > Судя по ману pw_lock(3) не имеет никакого отношения к /etc/group. Суть в том, что тот же vipw лочит это перед тем как. Домашнее упражнение для топикстартера - посмотреть лочат ли его остальные useradd и подобные перед тем как. Если да, то захваченный pw_lock гарантирует что никто другой в это время не сможет ничего поменять (в том числе и в /etc/group) и сделать мусор - ни этот скрипт, ни vipw, ни другие подобные утилиты. (ну разве что руками vi /etc/group кто-то полезет...). Я так думал. -- engineer |
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 |
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] |
> Как раз решил проблему на перле, скрипт пролетал в рассылке, первая
> мысль была как раз о flock(2), но поступило предложение сделать > flock(4).. видимо имеет смысл исправить на 2 Вы не поняли, это такой стиль общения. Если в тексте идёт abc(Х), это значит номер секции мануала - то есть вам намекают что надо читать man X abc. Ну а в тексте кода, ессно, приводят код :-) В моём случае это был параметр, 4. Хотя для него есть строковая константа, кажется LOCK_EX. Видимо есть смысл почитать что про это рассказывает perldoc -f flock -- engineer |
Free forum by Nabble | Edit this page |