从组中删除用户的Perl或Python脚本

从组中删除用户的Perl或Python脚本,python,perl,sysadmin,centos,redhat,Python,Perl,Sysadmin,Centos,Redhat,我正在将一个基于Samba的服务器作为主域控制器,遇到了一个本应多次解决的可爱的小问题。但许多搜索都没有结果。我需要能够使用命令行脚本从现有组中删除现有用户。usermod似乎允许我使用以下命令轻松地将用户添加到补充组: usermod -a -G supgroup1,supgroup2 username 如果没有“-a”选项,则如果用户当前是未列出的组的成员,则该用户将从该组中删除。是否有人有perl(或Python)脚本,允许删除用户和组的规范?我是否错过了一个明显的现有命令,或是这方面众

我正在将一个基于Samba的服务器作为主域控制器,遇到了一个本应多次解决的可爱的小问题。但许多搜索都没有结果。我需要能够使用命令行脚本从现有组中删除现有用户。usermod似乎允许我使用以下命令轻松地将用户添加到补充组:

usermod -a -G supgroup1,supgroup2 username
如果没有“-a”选项,则如果用户当前是未列出的组的成员,则该用户将从该组中删除。是否有人有perl(或Python)脚本,允许删除用户和组的规范?我是否错过了一个明显的现有命令,或是这方面众所周知的解决方案?提前谢谢

感谢J.J.提供了指向Unix::Group模块的指针,该模块是Unix配置文件的一部分。看起来命令deluser可以做我想做的事情,但不在我现有的任何存储库中。我继续使用Unix:Group模块编写了perl脚本。以下是系统管理的脚本

#!/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;
#/usr/bin/perl
#
#用法:removegroup.pl登录组
#目的:从组中删除用户,同时保留当前主用户和
#补充小组。
#注意:有一个特定于Debian的实用程序可以实现这一点,称为deluser,
#但我不希望有任何交叉分布依赖关系
#
#日期:2008年9月25日
#验证参数(正确的数字、格式等)
如果($#ARGV<1)| |(2<$#ARGV)){
打印“\n用法:removegroup.pl登录组\n\n”;
打印“退出值\n”;
打印“removeuser.pl脚本以以下值退出:\n\n”;
打印“0成功\n\n”;
打印“1个无效的参数数\n\n”;
打印“提供的登录名或组名超过16个字符\n\n”;
打印“3登录名和/或组名包含无效字符\n\n”;
出口1;
}
#检查格式正确的组和登录名
if((16删除用户($group,“$login”);
$grp->commit();
undef$grp;
出口0;
看起来像是deluser——group[groupname]应该这样做


如果不是,groups命令将列出用户所属的组。使用一些Perl将列表捕获到一个数组(或将其映射到一个散列),删除不需要的组,并将其反馈给usermod,这应该相当简单。

我为您找到了。它应该满足你的需要。据我所知,Perl没有任何用于从组中删除用户的内置函数。它有几个用于查看用户或进程的组id的脚本。

下面是一个非常简单的小Perl脚本,它可以为您提供所需的组列表:

my $user = 'user';
my $groupNoMore = 'somegroup';
my $groups = join ',', grep { $_ ne $groupNoMore } split /\s/, `groups $user`;
获取和清理所需参数将留给读者执行。

Web链接:

要向组中添加成员,请使用gpasswd命令和-a开关以及要添加的用户id:

gpasswd-用户ID mygroup

使用相同的命令从组中删除用户,但切换为-d而不是-a:

gpasswd-d userid mygroup

“man gpasswd”了解更多信息


我找了很久才找到这个。有时,要想不重新发明轮子需要付出太多的努力…

在我正在使用的Centos 5安装上,系统上似乎没有安装“deluser”。我目前正在存储库中查找它。我已经开始编写perl脚本,但可能需要一两个小时才能恢复我大脑的perl端。显然,deluser是Debian特有的。Dave,令人惊讶-谁会想到这个命令看起来像密码实用程序。。。谢谢LorenI建议在这个程序中使用Perl::批评家。这是一个一般性的评论,还是我在脚本中写了一些明显而愚蠢的东西?