User::pwent (Programming Perl) Book Home Programming PerlSearch this book

32.47. User::pwent

use User::pwent;                 # Default overrides built-ins only.
$pw = getpwnam("daemon")   or die "No daemon user";
if ($pw->uid == 1 && $pw->dir =~ m#^/(bin|tmp)?$# ) {
    print "gid 1 on root dir";
}

$pw = getpw($whoever);           # Accepts both string or number.
$real_shell = $pw->shell || '/bin/sh';
for (($fullname, $office, $workphone, $homephone) =
       split /\s*,\s*/, $pw->gecos)
{
   s/&/ucfirst(lc($pw->name))/ge;
}

use User::pwent qw(:FIELDS);     # Sets globals in current package.
getpwnam("daemon")         or die "No daemon user";
if ($pw_uid == 1 && $pw_dir =~ m#^/(bin|tmp)?$# ) {
    print "gid 1 on root dir";
}

use User::pwent qw/pw_has/;
if (pw_has(qw[gecos expire quota])) { .... }
if (pw_has("name uid gid passwd"))  { .... }
printf "Your struct pwd supports [%s]\n", scalar pw_has();

By default, this module's exports override the core getpwent, getpwuid, and getpwnam functions, replacing them with versions that return a User::pwent object (or undef on failure). It is often better to use the module than the core functions it replaces, because the built-ins overload or even omit various slots in the return list in the name of backward compatibility.

The returned object has methods that access the similarly named structure field name from the C's passwd structure from pwd.h, stripped of their leading "pw_" parts, namely name, passwd, uid, gid, change, age, quota, comment, class, gecos, dir, shell, and expire. The passwd, gecos, and shell fields are tainted. You may also import the structure fields into your own namespace as regular variables using the ":FIELDS" import tag, although this still overrides your core functions. Access these fields as scalar variables named with a "pw_" prepended to the method name. The getpw function is a simple frontend switch that forwards a numeric argument to getpwuid and a string argument to getpwnam.

Perl believes that no machine ever has more than one of change, age, or quota implemented, nor more than one of either comment or class. Some machines do not support expire, gecos, or allegedly, even passwd. You may call these methods no matter what machine you're on, but they'll return undef if unimplemented. See passwd(5) and getpwent(3) for details.

You can determine whether these fields are implemented by asking the importable pw_has function about them. It returns true if all parameters are supported fields on the build platform or false if one or more were not, and it raises an exception if you ask about a field whose name it doesn't recognize. If you pass no arguments, it returns the list of fields your C library thinks are supported.

Interpretation of the gecos field varies between systems but often holds four comma-separated fields containing the user's full name, office location, work phone number, and home phone number. An & in the gecos field should be replaced by the user's properly capitalized login name. The shell field, if blank, must be assumed to be /bin/sh, although Perl does not do this for you. The passwd is one-way hashed gobbledygook, not clear text, and may not be unhashed save by brute-force guessing. Secure systems often use a more secure hashing than DES. On systems supporting shadow password systems, Perl automatically returns the shadow password entry when called by a suitably empowered user, even if your underlying vendor-provided C library was too short-sighted to realize it should do this.



Library Navigation Links

Copyright © 2001 O'Reilly & Associates. All rights reserved.