⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nss_wrapper.pl

📁 samba最新软件
💻 PL
字号:
#!/usr/bin/perl#use strict;use Getopt::Long;use Cwd qw(abs_path);my $opt_help = 0;my $opt_path = undef;my $opt_action = undef;my $opt_type = undef;my $opt_name = undef;my $passwdfn = undef;my $groupfn = undef;my $actionfn = undef;sub passwd_add($$);sub passwd_delete($$);sub group_add($$);sub group_delete($$);my $result = GetOptions(	'help|h|?'	=> \$opt_help,	'path=s'	=> \$opt_path,	'action=s'	=> \$opt_action,	'type=s'	=> \$opt_type,	'name=s'	=> \$opt_name);sub usage($;$){	my ($ret, $msg) = @_;	print $msg."\n\n" if defined($msg);	print "usage:	--help|-h|-?		Show this help.	--path <path>		Path of the 'passwd' or 'group' file.	--type <type>		Only 'passwd' is supported yet,				but 'group' and maybe 'member' will be added				in future.	--action <action>	'add' or 'delete'.	--name <name>		The name of the object.";	exit($ret);}usage(1) if (not $result);usage(0) if ($opt_help);if (not defined($opt_path)) {	usage(1, "missing: --path <path>");}if ($opt_path eq "" or $opt_path eq "/") {	usage(1, "invalid: --path <path>: '$opt_path'");}my $opt_fullpath = abs_path($opt_path);if (not defined($opt_fullpath)) {	usage(1, "invalid: --path <path>: '$opt_path'");}if (not defined($opt_action)) {	usage(1, "missing: --action [add|delete]");}if ($opt_action eq "add") {	$passwdfn = \&passwd_add;	$groupfn = \&group_add;} elsif ($opt_action eq "delete") {	$passwdfn = \&passwd_delete;	$groupfn = \&group_delete;} else {	usage(1, "invalid: --action [add|delete]: '$opt_action'");}if (not defined($opt_type)) {	usage(1, "missing: --type [passwd|group]");}if ($opt_type eq "passwd") {	$actionfn = $passwdfn;} elsif ($opt_type eq "group") {	$actionfn = $groupfn;} else {	usage(1, "invalid: --type [passwd|group]: '$opt_type'")}if (not defined($opt_name)) {	usage(1, "missing: --name <name>");}if ($opt_name eq "") {	usage(1, "invalid: --name <name>");}exit $actionfn->($opt_fullpath, $opt_name);sub passwd_add_entry($$);sub passwd_load($){	my ($path) = @_;	my @lines;	my $passwd = undef;	open(PWD, "<$path") or die("Unable to open '$path' for read");	@lines = <PWD>;	close(PWD);	$passwd->{array} = ();	$passwd->{name} = {};	$passwd->{uid} = {};	$passwd->{path} = $path;	foreach my $line (@lines) {		passwd_add_entry($passwd, $line);	}	return $passwd;}sub passwd_lookup_name($$){	my ($passwd, $name) = @_;	return undef unless defined($passwd->{name}{$name});	return $passwd->{name}{$name};}sub passwd_lookup_uid($$){	my ($passwd, $uid) = @_;	return undef unless defined($passwd->{uid}{$uid});	return $passwd->{uid}{$uid};}sub passwd_get_free_uid($){	my ($passwd) = @_;	my $uid = 1000;	while (passwd_lookup_uid($passwd, $uid)) {		$uid++;	}	return $uid;}sub passwd_add_entry($$){	my ($passwd, $str) = @_;	chomp $str;	my @e = split(':', $str);	push(@{$passwd->{array}}, \@e);	$passwd->{name}{$e[0]} = \@e;	$passwd->{uid}{$e[2]} = \@e;}sub passwd_remove_entry($$){	my ($passwd, $eref) = @_;	for(my $i; defined($passwd->{array}[$i]); $i++) {		if ($eref == $passwd->{array}[$i]) {			$passwd->{array}[$i] = undef;		}	}	delete $passwd->{name}{${$eref}[0]};	delete $passwd->{uid}{${$eref}[2]};}sub passwd_save($){	my ($passwd) = @_;	my @lines = ();	my $path = $passwd->{path};	my $tmppath = $path.$$;	foreach my $eref (@{$passwd->{array}}) {		next unless defined($eref);		my $line = join(':', @{$eref});		push(@lines, $line);	}	open(PWD, ">$tmppath") or die("Unable to open '$tmppath' for write");	print PWD join("\n", @lines)."\n";	close(PWD);	rename($tmppath, $path) or die("Unable to rename $tmppath => $path");}sub passwd_add($$){	my ($path, $name) = @_;	#print "passwd_add: '$name' in '$path'\n";	my $passwd = passwd_load($path);	my $e = passwd_lookup_name($passwd, $name);	die("account[$name] already exists in '$path'") if defined($e);	my $uid = passwd_get_free_uid($passwd);	my $gid = 65534;# nogroup gid	my $pwent = $name.":x:".$uid.":".$gid.":".$name." gecos:/nodir:/bin/false";	passwd_add_entry($passwd, $pwent);	passwd_save($passwd);	return 0;}sub passwd_delete($$){	my ($path, $name) = @_;	#print "passwd_delete: '$name' in '$path'\n";	my $passwd = passwd_load($path);	my $e = passwd_lookup_name($passwd, $name);	die("account[$name] does not exists in '$path'") unless defined($e);	passwd_remove_entry($passwd, $e);	passwd_save($passwd);	return 0;}sub group_add($$){	my ($path, $name) = @_;	#print "group_add: '$name' in '$path'\n";	die("group_add: not implemented yet!");	return 0;}sub group_delete($$){	my ($path, $name) = @_;	#print "group_delete: '$name' in '$path'\n";	die("group_delete: not implemented yet!");	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -