PerlPowerTools
view release on metacpan or search on metacpan
#!/usr/bin/perl
=begin metadata
Name: id
Description: show user information
Author: Theo Van Dinter, felicity@kluge.net
License:
=end metadata
=cut
#
# An implementation of the 'id' utility in Perl. Written for the Perl Power
# Tools (PPT) project by Theo Van Dinter (felicity@kluge.net).
#
# $Id: id,v 1.2 2004/08/05 14:17:43 cwest Exp $
#
use strict;
use File::Basename qw(basename);
use Getopt::Std qw(getopts);
use constant EX_SUCCESS => 0;
use constant EX_FAILURE => 1;
use vars qw($opt_G $opt_n $opt_u $opt_g $opt_r $opt_a $opt_p);
my $Program = basename($0);
getopts('Gnugrap') or help();
if ( ($opt_G + $opt_g + $opt_p + $opt_u) > 1 ) {
warn "$Program: Choose only one of -G, -g, -p, or -u\n";
help();
}
my($user,$pw,$uid,$gid,$tp);
if ( @ARGV ) { # user specified
help() if scalar(@ARGV) > 1;
($user,$pw,$uid,$gid) = getpwnam $ARGV[0];
if (!defined($uid) && $ARGV[0] =~ m/\A[0-9]+\Z/) {
($user,$pw,$uid,$gid) = getpwuid $ARGV[0];
}
unless (defined $uid) {
warn "$Program: $ARGV[0]: No such user\n";
exit EX_FAILURE;
}
}
if ( $opt_u ) { # print uid
$tp = defined $uid ? $uid : $opt_r ? $< : $>;
$tp = scalar getpwuid $tp || $tp if ( $opt_n );
}
elsif ( $opt_g ) { # print gid
$tp = defined $gid ? $gid : (split(/\s+/,($opt_r)?$(:$)))[0];
$tp = scalar getgrgid $tp || $tp if ( $opt_n );
}
elsif ( $opt_p ) { # human-readable form (names when possible, etc.)
my($rgid,@rgids);
if ( $user ) {
$tp.="uid $user\n";
$tp.="rgid $gid\n";
@rgids=($gid);
while ( my($name,$pw,$gid,$members) = getgrent ) {
push(@rgids,$gid) if ( grep($_ eq $user,split(/\s+/,$members)) );
}
}
else {
my $login = getlogin;
unless ($login) {
warn "$Program: getlogin failed\n";
exit EX_FAILURE;
}
$tp.="login $login\n" if ( $login ne scalar getpwuid $< );
my($uid) = scalar getpwuid $< || $<;
$tp.="uid $uid\n";
my($euid) = scalar getpwuid $> || $>;
$tp.="euid $euid\n" if ( $< != $> );
($rgid,@rgids)=split(/\s+/,$();
my($egid)=split(/\s+/,$));
my($nrgid) = scalar getgrgid $rgid || $rgid;
my($negid) = scalar getgrgid $egid || $egid;
$tp.="rgid $nrgid\n";
$tp.="egid $negid\n" if ( $rgid != $egid );
}
my(%done);
foreach ( @rgids ) {
$done{$_} = scalar getgrgid $_ || $_;
}
$tp.=join(" ","groups",values %done);
}
elsif ( $opt_G ) { # print full group info
my(%done);
my(@rgids);
if ( $user ) {
@rgids=($gid);
while ( my($name,$pw,$gid,$members) = getgrent ) {
push(@rgids,$gid) if ( grep($_ eq $user,split(/\s+/,$members)) );
}
}
else {
@rgids = split(/\s+/, $();
}
foreach ( @rgids ) {
if ( $opt_n ) {
$done{$_} = scalar getgrgid $_ || $_;
}
else {
$done{$_} = $_;
}
}
$tp=join(" ",values %done);
}
else { # uid=#(name) gid=#(name) euid=#(name) egid=#(name) groups=#(name) ...
my($rgid,@rgids,$egid,$nruid,$neuid,$nrgid,$negid);
if ( $user ) {
$egid = $rgid = $gid;
@rgids=($gid);
while ( my($name,$pw,$gid,$members) = getgrent ) {
push(@rgids,$gid) if ( grep($_ eq $user,split(/\s+/,$members)) );
}
$nruid = $user;
$nrgid = scalar getgrgid $gid;
}
else {
($rgid,@rgids)=split(/\s+/,$();
$egid = (split(/\s+/,$)))[0];
$nruid = scalar getpwuid $<;
$neuid = scalar getpwuid $>;
$nrgid = scalar getgrgid $rgid;
$negid = scalar getgrgid $egid;
}
$tp=join("=","uid",($user)?$uid:$<);
$tp.=($nruid)?"($nruid) ":" ";
if ( !($user) && ($< != $>) ) {
$tp.="euid=$>";
$tp.=($neuid)?"($neuid) ":" ";
}
$tp.=join("=","gid",($user)?$gid:$rgid);
$tp.=($nrgid)?"($nrgid) ":" ";
if ( $rgid != $egid ) {
$tp.="egid=$egid";
$tp.=($negid)?"($negid) ":" ";
}
my(%done);
$tp.="groups=";
foreach ( @rgids ) {
my($i) = scalar getgrgid $_;
my($i2) = "$_";
$i2 .= "($i)" if ( $i );
$done{$_} = "$i2";
}
$tp.=join(",",values %done);
}
print "$tp\n";
exit EX_SUCCESS;
sub help {
require Pod::Usage;
Pod::Usage::pod2usage({ -exitval => EX_FAILURE, -verbose => 0 });
}
=head1 NAME
id - show user information
=head1 SYNOPSIS
id [user]
id -G [-n] [user]
id -g [-nr] [user]
id -u [-nr] [user]
id -p [user]
=head1 DESCRIPTION
id displays the user and group names and numeric IDs of the calling
process. If the real and effective IDs are different, both are displayed,
otherwise only the real ID is displayed.
If a user (username or user ID) is specified, the information about that user
is displayed instead of the information from the calling process.
( run in 0.455 second using v1.01-cache-2.11-cpan-39bf76dae61 )