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();
'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.