Perl或Python脚本移除用户组成员

3 投票
4 回答
3266 浏览
提问于 2025-04-11 09:27

我正在搭建一个基于Samba的服务器,作为主域控制器,遇到了一个小问题,这个问题应该很多人都解决过。但我搜索了很多次,还是没有找到答案。我需要通过命令行脚本把一个已经存在的用户从一个已有的组里移除。看起来,usermod命令可以很方便地让我把用户添加到一个附加组,使用这个命令就可以:

usermod -a -G supgroup1,supgroup2 username

不过,如果不加“-a”这个选项的话,如果用户当前是某个不在列表中的组的成员,那么这个用户就会被移出那个组。有没有人有perl(或者Python)脚本,可以指定一个用户和一个组来进行移除?我是不是漏掉了什么明显的现有命令,或者有什么大家都知道的解决方案呢?提前谢谢大家!

感谢J.J.给我指了Unix::Group模块的方向,它是Unix-ConfigFile的一部分。看起来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;

4 个回答

1

看起来 deluser --group [groupname] 应该可以解决这个问题。

如果不行的话,groups 命令可以列出一个用户所属的所有组。你可以用 Perl 语言写个简单的程序,把这个列表抓取到一个数组里(或者把它转成一个哈希表),然后删除不需要的组,再把结果传回给 usermod 命令。

2

我找到了一些资料,链接在这里:这个,应该能满足你的需求。根据我的了解,Perl 语言并没有内置的功能可以直接把用户从一个组里移除。不过,它有一些功能可以查看用户或进程的组 ID。

2

网页链接: http://www.ibm.com/developerworks/linux/library/l-roadmap4/

如果你想把某个用户加入到一个组里,可以使用 gpasswd 命令,后面加上 -a 这个选项和你想加入的用户 ID:

gpasswd -a userid mygroup

如果你想把用户从组里移除,使用同样的命令,不过要把 -a 换成 -d:

gpasswd -d userid mygroup

想了解更多信息,可以输入 "man gpasswd"...

我花了很长时间才找到这个。有时候,避免重复发明轮子真的需要花费很多精力...

撰写回答