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

📄 groups.t

📁 UNIX下perl实现代码
💻 T
字号:
#!./perl$ENV{PATH} ="/bin:/usr/bin:/usr/xpg4/bin:/usr/ucb" .    exists $ENV{PATH} ? ":$ENV{PATH}" : "";$ENV{LC_ALL} = "C"; # so that external utilities speak English$ENV{LANGUAGE} = 'C'; # GNU locale extensionsub quit {    print "1..0 # Skip: no `id` or `groups`\n";    exit 0;}quit() if $^O eq 'MSWin32' or $^O =~ /lynxos/i;# We have to find a command that prints all (effective# and real) group names (not ids).  The known commands are:# groups# id -Gn# id -a# Beware 1: some systems do just 'id -G' even when 'id -Gn' is used.# Beware 2: id -Gn or id -a format might be id(name) or name(id).# Beware 3: the groups= might be anywhere in the id output.# Beware 4: groups can have spaces ('id -a' being the only defense against this)# Beware 5: id -a might not contain the groups= part.## That is, we might meet the following:## foo bar zot				# accept# foo 22 42 bar zot			# accept# 1 22 42 2 3				# reject# groups=(42),foo(1),bar(2),zot me(3)	# parse# groups=22,42,1(foo),2(bar),3(zot me)	# parse## and the groups= might be after, before, or between uid=... and gid=...GROUPS: {    # prefer 'id' over 'groups' (is this ever wrong anywhere?)    # and 'id -a' over 'id -Gn' (the former is good about spaces in group names)    if (($groups = `id -a 2>/dev/null`) ne '') {	# $groups is of the form:	# uid=39957(gsar) gid=22(users) groups=33536,39181,22(users),0(root),1067(dev)	last GROUPS if $groups =~ /groups=/;    }    if (($groups = `id -Gn 2>/dev/null`) ne '') {	# $groups could be of the form:	# users 33536 39181 root dev	last GROUPS if $groups !~ /^(\d|\s)+$/;    }    if (($groups = `groups 2>/dev/null`) ne '') {	# may not reflect all groups in some places, so do a sanity check	if (-d '/afs') {	    print <<EOM;# These test results *may* be bogus, as you appear to have AFS,# and I can't find a working 'id' in your PATH (which I have set# to '$ENV{PATH}').## If these tests fail, report the particular incantation you use# on this platform to find *all* the groups that an arbitrary# luser may belong to, using the 'perlbug' program.EOM	}	last GROUPS;    }    # Okay, not today.    quit();}unless (eval { getgrgid(0); 1 }) {    print "1..0 # Skip: getgrgid() not implemented\n";    exit 0;}# Remember that group names can contain whitespace, '-', et cetera.# That is: do not \w, do not \S.if ($groups =~ /groups=(.+)( [ug]id=|$)/) {    my $gr = $1;    my @g0 = split /,/, $gr;    my @g1;    # prefer names over numbers    for (@g0) {        # 42(zot me)	if (/^(\d+)(?:\(([^)]+)\))?/) {	    push @g1, ($2 || $1);	}        # zot me(42)	elsif (/^([^(]*)\((\d+)\)/) {	    push @g1, ($1 || $2);	}	else {	    print "# ignoring group entry [$_]\n";	}    }    print "# groups=$gr\n";    print "# g0 = @g0\n";    print "# g1 = @g1\n";    $groups = "@g1";}print "1..2\n";$pwgid = $( + 0;($pwgnam) = getgrgid($pwgid);@basegroup{$pwgid,$pwgnam} = (1,1);$seen{$pwgid}++;for (split(' ', $()) {    next if $seen{$_}++;    ($group) = getgrgid($_);    if (defined $group) {	push(@gr, $group);    }    else {	push(@gr, $_);    }} if ($^O =~ /^(?:uwin|solaris)$/) {	# Or anybody else who can have spaces in group names.	$gr1 = join(' ', grep(!$did{$_}++, sort split(' ', join(' ', @gr))));} else {	$gr1 = join(' ', sort @gr);}$gr2 = join(' ', grep(!$basegroup{$_}++, sort split(' ',$groups)));if ($gr1 eq $gr2) {    print "ok 1\n";}else {    print "#gr1 is <$gr1>\n";    print "#gr2 is <$gr2>\n";    print "not ok 1\n";}# multiple 0's indicate GROUPSTYPE is currently long but should be shortif ($pwgid == 0 || $seen{0} < 2) {    print "ok 2\n";}else {    print "not ok 2 (groupstype should be type short, not long)\n";}

⌨️ 快捷键说明

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