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] ", 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.