How can I find out, in a shell script, whether a given user name exists on the current system?
/etc/shadow are incomplete. Consider OS X's Directory Services, or Linux with Likewise Active Directory integration.
Super User is a question and answer site for computer enthusiasts and power users. It only takes a minute to sign up.Sign up to join this community
This command is designed to gather entries for the databases that can be backed by /etc files and various remote services like LDAP, AD, NIS/Yellow Pages, DNS and the likes.
To figure out if a username is known by one of the password naming services, simply run:
getent passwd username
This works also with group, hosts and others, depending on the OS and implementation.
Parse the output of
finger -m <username>. No error code if no user was found, unfortunately, but if not found, error output will be written. No drawbacks so far.
finger -ms <username> 2>&1 1>/dev/null | wc -l
0 if user is found (because there's no error output), larger numbers otherwise.
Run (as any user, surprisingly):
T=$( mktemp -t foo.XXX ) ; chown <username> $T
If it fails as
root, the account name is invalid.
If it fails as non-
root user, parse the possibly localized output for Operation not permitted or invalid user (or equivalents). Set
LANG beforehand to do this reliably.
I would say that you would want to rely on
/etc/passwd and similar (e.g.
/etc/shadow for Shadow-based systems; on an off-topic side-note, some similar systems might use
/etc/master.passwd or other such files).
/etc/passwd is typically treated as the absolute authoritative decision on whether a user exists or not. If you use any of the other methods described on this page, and if those other methods point to an existing user but
/etc/passwd does not, then I would say that the user does not properly exist on the system, by definition of the most common standard that software would likely rely on.
That said, I'll throw in another way to add to the mix of some other options that could be used.
ls -l /home | grep ^customUserName$<BR>
Clearly, replace "customuserName" with the name of the user you want to check for. Replace /home with /users if that is what your system uses. This might not find all users in /etc/passwd if no home directory was made for the particular user, which could occur if you simply imported users (that is, lines of text into /etc/passwd) and if home directories don't get made unless/until a person logs in.