البرنامج النصي 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 Module.هنا هو البرنامج النصي لمتعة إدارة النظام الخاص بك.

#!/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 -معرف المستخدم mygroup

قم بإزالة المستخدمين من مجموعة بنفس الأمر، ولكن باستخدام مفتاح التبديل -d بدلاً من -a:

gpasswd -d معرف المستخدم mygroup

"man gpasswd" لمزيد من المعلومات...

لقد بحثت عن العصور للعثور على هذا.في بعض الأحيان، يتطلب الأمر الكثير من الجهد لعدم إعادة اختراع العجلة...

نصائح أخرى

وجدت هذا لك.ينبغي أن تفعل ما تحتاجه.بقدر ما أستطيع أن أقول، ليس لدى Perl أي وظائف مضمنة لإزالة المستخدمين من المجموعة.لديها العديد لرؤية معرف المجموعة للمستخدم أو العملية.

يبدو الأمر كذلك ديلوسر - المجموعة [اسم المجموعة] يجب القيام به.

إذا لم يكن الأمر كذلك، فإن مجموعات يسرد الأمر المجموعات التي ينتمي إليها المستخدم.يجب أن يكون من السهل جدًا التوصل إلى بعض لغة Perl لالتقاط تلك القائمة في مصفوفة (أو خريطة وتحويلها إلى تجزئة)، وحذف المجموعة (المجموعات) غير المرغوب فيها، ثم إرسالها مرة أخرى إلى com.usermod.

إليك نص Perl بسيط جدًا والذي من المفترض أن يوفر لك قائمة بالمجموعات التي تحتاجها:

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

يتم ترك الحصول على الحجج المطلوبة وتعقيمها كتمرين للقارئ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top