【问题标题】:Perl or Python script to remove user from group从组中删除用户的 Perl 或 Python 脚本
【发布时间】:2010-09-12 20:06:06
【问题描述】:

我正在将一个基于 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;

【问题讨论】:

  • 我建议在这个程序上使用 Perl::Critic。
  • 这是一般性评论,还是我在脚本中写了一些明显而愚蠢的东西?

标签: python perl sysadmin centos redhat


【解决方案1】:

网址:http://www.ibm.com/developerworks/linux/library/l-roadmap4/

要将成员添加到组,请使用带有 -a 开关和您要添加的用户 ID 的 gpasswd 命令:

gpasswd -a userid mygroup

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

gpasswd -d userid mygroup

“man gpasswd”了解更多信息...

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

【讨论】:

  • 戴夫,太棒了 - 谁会想到这个命令看起来像一个密码实用程序......谢谢!罗兰
【解决方案2】:

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

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

获取和清理所需的参数留给读者作为练习。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      看起来 deluser --group [groupname] 应该这样做。

      如果不是,groups 命令列出用户所属的组。想出一些 Perl 来将该列表捕获到一个数组中(或将其 map 到一个哈希中)、删除不需要的组并将其反馈给 应该是相当简单的用户模式.

      【讨论】:

      • 在我正在使用的 Centos 5 安装中,系统上似乎没有安装“deluser”。我目前正在存储库中寻找它。我已经开始编写 perl 脚本,但可能需要一两个小时才能恢复我大脑的 perl 方面。
      • 显然 deluser 是特定于 Debian 的。
      猜你喜欢
      • 1970-01-01
      • 2018-05-17
      • 2021-12-30
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      相关资源
      最近更新 更多