Сценарий Perl или Python для удаления пользователя из группы

StackOverflow https://stackoverflow.com/questions/128933

Вопрос

Я собираю сервер на базе Samba в качестве основного контроллера домена и столкнулся с небольшой милой проблемой, которую нужно было решать много раз.Но ряд поисков не дали результата.Мне нужно иметь возможность удалить существующего пользователя из существующей группы с помощью сценария командной строки.Похоже, что usermod легко позволяет мне добавить пользователя в дополнительную группу с помощью этой команды:

usermod -a -G supgroup1,supgroup2 username

Без опции «-a», если пользователь в настоящее время является членом группы, которой нет в списке, он будет удален из группы.Есть ли у кого-нибудь сценарий Perl (или Python), который позволяет указать пользователя и группу для удаления?Я упускаю очевидную существующую команду или известное решение для этой проблемы?Заранее спасибо!

Спасибо Джей-Джею.для указателя на модуль Unix::Group, который является частью Unix-ConfigFile.Похоже, что команда deluser сделает то, что я хочу, но ее нет ни в одном из моих существующих репозиториев.Я пошел дальше и написал сценарий Perl, используя модуль Unix:Group.Вот сценарий для вашего удовольствия системного администратора.

#!/usr/bin/perl
#
# Usage:   removegroup.pl login group
# Purpose: Removes a user from a group while retaining current primary and
#          supplementary groups.
# Notes:   There is a Debian specific utility that can do this called deluser,
#          but I did not want any cross-distribution dependencies
#
# Date:   25 September 2008

# Validate Arguments (correct number, format etc.)
if ( ($#ARGV < 1) || (2 < $#ARGV) ) {
  print "\nUsage: removegroup.pl login group\n\n";
  print "EXIT VALUES\n";
  print "     The removeuser.pl script exits with the following values:\n\n";
  print "     0 success\n\n";
  print "     1 Invalid number of arguments\n\n";
  print "     2 Login or Group name supplied greater than 16 characters\n\n";
  print "     3 Login and/or Group name contains invalid characters\n\n";
  exit 1;
}

# Check for well formed group and login names
if ((16 < length($ARGV[0])) ||(16 < length($ARGV[1])))
{
  print "Usage: removegroup.pl login group\n";
  print "ERROR: Login and Group names must be less than 16 Characters\n";
  exit 2;
}

if ( ( $ARGV[0] !~ m{^[a-z_]+[a-z0-9_-]*$}) || ( $ARGV[0] !~ m{^[a-z_]+[a-z0-9_-]*$} ) )
{
  print "Usage: removegroup.pl login group\n";
  print "ERROR: Login and/or Group name contains invalid characters\n";
  exit 3;
}

# Set some variables for readability
$login=$ARGV[0];
$group=$ARGV[1];

# Requires the GroupFile interface from perl-Unix-Configfile
use Unix::GroupFile;

$grp = new Unix::GroupFile "/etc/group";
$grp->remove_user("$group", "$login");
$grp->commit();
undef $grp;
exit 0;
Это было полезно?

Решение

Интернет-ссылка: http://www.ibm.com/developerworks/linux/library/l-roadmap4/

Чтобы добавить участников в группу, используйте команду gpasswd с ключом -a и идентификатором пользователя, которого вы хотите добавить:

gpasswd - идентификатор пользователя моей группы

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

gpasswd -d идентификатор пользователя моей группы

«man gpasswd» для получения дополнительной информации...

Я искал целую вечность, чтобы найти это.Иногда требуется слишком много усилий, чтобы не изобрести велосипед...

Другие советы

я нашел Этот для тебя.Он должен делать то, что вам нужно.Насколько я могу судить, в Perl нет встроенных функций для удаления пользователей из группы.У него есть несколько для просмотра идентификатора группы пользователя или процесса.

Это выглядит как deluser --group [имя группы] должен это сделать.

Если нет, то группы Команда выводит список групп, к которым принадлежит пользователь.Должно быть довольно просто придумать какой-нибудь Perl для захвата этого списка в массив (или карта его в хеш), удалите ненужные группы и верните их обратно пользовательский мод.

Вот очень простой Perl-скрипт, который должен предоставить вам список необходимых групп:

my $user = 'user';
my $groupNoMore = 'somegroup';
my $groups = join ',', grep { $_ ne $groupNoMore } split /\s/, `groups $user`;

Получение и очистка необходимых аргументов остается упражнением для читателя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top