| Creating New Users with perl
 
Russ Hill 
Why use a script to create new user accounts? Most sites
would probably 
rather edit the password file directly to create a new
user, and then 
make the home directory manually. However, I often noticed
that this 
approach can lead to problems such as not completing
the job, forgetting 
critical steps, and creating users different ways. Many
small sites 
never document how to create a user. 
A simple "make user" script can fix all of
these problems. 
I wrote mkuser to prevent mistakes in adding users,
to create 
users exactly the same way, and to save time. The script
itself provides 
a primitive form of self-documention, showing a way
to create a user. 
Documentation does not need to change because the user
interface never 
needs to change. 
With a simple command interface, operators can answer
the questions 
and create a user correctly. It's not necessary to change
the user 
interface if you make minor changes within the script
to add extra 
tasks. mkuser lets you incorporate changes without adding
steps for an operator or redocumenting the process of
creating a user. 
Different Tools 
Most UNIX systems have system administration tools to
help create 
and maintain user accounts and groups -- AIX has smit
and 
SVR4 has sysadm; some SVR4 systems have useradd, usermod,
and userdel; useradd is similar to adduser 
on ULTRIX. Other systems, such as Domain/OS, have entirely
different 
ways of adding users. Some SVR4 systems have groupadd,
groupdel, 
and groupmod for modifying the /etc/group file. Although
all of these tools provide either a menu or a command-line
interface, 
none make it particularly easy to automate user and
group administration. 
It's true that useradd can be done in one line. However,
you 
must give it a uid and a gid, which means you have to
write a shell 
script wrapper around useradd to find the next available
unused 
uid. Large sites will probably have pockets of different
systems, 
each with their own way of adding a user. 
The mkuser Script 
I wrote a perl script called mkuser (Listing 1) and
have used 
it on a few flavors of UNIX to solve user administration
problems. 
It's fast and easily portable. There are, of course,
a few site dependencies, 
but this script can be used for many different sites
with only minor 
changes. 
I originally developed mkuser on SVR4 NCR 2.02 UNIX
with the 
useradd command as the final execution. I later changed
it 
to modify the /etc/passwd and /etc/shadow files directly
because useradd is too OS dependent. I then used the
script 
on AT&T Starservers and on SunOS and ULTRIX. The
input into the script 
seems generic enough. I looked back at a shell script
I had written 
to add a user to Apollo Domain/OS systems. I found it
was easy to 
use mkuser on the Apollo. I did have to make a number
of changes 
in the final stage of the script, but neither the script
interface 
nor the password generator changed. 
I've also used mkuser to create users from a cron 
shell script. I took tables dumped from an Informix
database, ran 
them through awk, and sent them to mkuser to create
the users. The entire task was completely automated. 
Why perl? 
Besides being a very easy language to learn, perl bridges
the gap 
between C and shell programming. It provides the best
of both worlds, 
especially for many system administration tasks, and
some operating 
systems now ship perl as a standard part of UNIX. 
To run mkuser, you must port perl to your system. perl
is 
easily available, free, and quickly portable to all
types of UNIX 
systems (see Figure 1 for an example session). 
mkuser is exactly the type of project that perl was
written 
to handle. If I had used shell, I would have needed
an extra C program 
to encrypt the password. That would mean three files:
the script, 
the C source, and the executable C program. Having everything
in one 
file makes maintenance much easier. 
Modifying the Script 
You can use mkuser with or without command-line arguments.
Of course, you'll need to modify it for your site, but
these changes 
should be minimal. 
A new user's default shell directory on some SVR4 systems
comes from 
/etc/skel. This directory contains the default dot (.)
files 
as well as other directories that you want included
in a new user's 
setup, such as startup scripts in special csh and ksh
directories. mkuser will copy everything in the default
directory tree to the new user's home directory. You
should change 
the script to use a default directory for the new users
and point 
the $defaultcshdef or the $defaultkshdef to those locations.
I made mkuser shell-dependent since you will want different
dot files depending on the type of shell you plan to
run. You may 
wish to add other shell defaults, such as bash or tcsh. 
For your default ksh directory, you will probably include
.kshrc, 
.profile, .Xdefaults, .mwmrc, and possibly 
bin, src, and tmp directories. For your default 
csh directory, you will probably want .Xdefaults, 
.cshrc, .login, .logout, .openwin-init, 
.openwin-menu, and possibly bin and tmp directories.
There may be other files and directories you wish to
add as well.  
Other script defaults to set include the group default,
which names 
the group with the most users, and the default home
directory, where 
most of the users will reside. 
Aspects of mkuser 
Because many sites use the login as the password and
users never 
change their password, I added a password generator
for security reasons. 
At most sites, I can crack 50 percent of the passwords
(crack 
is a password checker that can be used regularly to
notify users when 
their passwords were cracked; see Figure 2 for an example
session 
of obtaining and porting crack). The generator makes
English-like 
words that are not really words. However, users need
to be educated 
about what passwords are best (see Figure 3 for two
password selection 
methods). 
I used crypt in the script instead of calling passwd.
passwd is tied to the tty. Shelling out to execute 
passwd makes the operator type the user's password by
hand 
twice. By encrypting the password and just putting it
into the new 
user's password field, I have automated the script's
password section. 
Other tasks that mkuser could automate include adding
the 
user to a phone list and making a mail alias. 
Using mkuser 
Figure 4 lists mkuser's command-line arguments. All
are optional. 
Running mkuser without arguments, as 
 
# /usr/local/bin/mkuser 
 
causes it to ask all questions for creating a new user.
However, you can also give it all the user's information
on the command 
line: 
 
# /usr/local/bin/mkuser joe smith jsmith jsmith next workgroup home/bin/csh 
 
This creates a user named "Joe Smith," which
goes in the GECOS field. The user's login name is set
to jsmith 
and his home directory will have that same name. This
is because the 
logname (third argument) and username (fourth argument)
are identical. 
mkuser sets jsmith's UID to the next available, sets
his group to workgroup, sets his home directory tree
to home, 
and specifies that the account will run csh at login.
Because 
no password argument was given after the login shell
argument,the 
login name, jsmith, becomes the password. 
Another example 
 
# /usr/local/bin/mkuser tom thibodeaux tthibode tthibodeaux next gen home /bin/ksh 
 
differs from the previous one primarily by using a logname
("tthibode") that doesn't correspond with
the username 
("tthibodeaux"). In this case, the home directory
name, which 
is based on the username argument, will be /home/tthibodeaux.
The other arguments are similar, except that this user
will belong 
to the gen group and use ksh. Again, the logname becomes
the user's first password. 
Another example 
 
# /usr/local/bin/mkuser tom thibodeaux tthibode \
tthibodeaux next gen home /bin/ksh o,iltay 
 
adds an explicit password ("o,iltay") to the
arguments shown in the previous example. 
Perl References 
Schwartz, Randal L. Learning Perl (aka "The 
Llama Book"). Sebastopol, CA: O'Reilly & Associates,
ISBN 1-56592-042-2. 
Wall, Larry, and Randal L. Schwartz. Programming 
Perl (aka "The Camel Book"). Sebastopol, CA:
O'Reilly & 
Associates, ISBN 0-937175-61-1. 
Perl FAQ. ftp://ftp.cis.ufl.edu/pub/perl/doc/FAQ 
ftp://rtfm.mit.edu/pub/usenet/news.answers/perl-faq/ 
ftp://ftp.uu.net/usenet/news.answers/perl-faq/  
 
 About the Author
 
Russ Hill is a University of Florida Gator with a degree
in Computer
Engineering. He works as a UNIX Analyst in Dallas, TX
for Paranet.
His earlier article, "How to Login to Any UNIX
System and Get Your Email,"
appeared in the Sept/Oct 1993 of Sys Admin. 
 
 
 |