#!/bin/sh - # # visudopw: Edit the password file # # Create a directory for temporary files # # Because we only want to allow one instance to edit the file at # at one time, we will use a common directory as a locking # mechanism. If this fails, the superuser may have to recover # the lock manually. TMPDIR=/tmp/vipw.lock TMPFILE=$TMPDIR/passwd ORIGFILE=$TMPDIR/passwd.orig umask 077 if ! mkdir $TMPDIR ; then echo "Password file is locked. Try back later" exit 255 fi # Copy the password file to a temporary file for editing by # the user "nobody". It must be owned and writable by nobody. cp /etc/passwd $TMPFILE chown nobody $TMPFILE # Copy the password file to a non-writable file for later comparison cp /etc/passwd $ORIGFILE # Set a default editor if one is not already specified : ${EDITOR:=/bin/vi} # Now let the user edit the file as user "nobody" su nobody -c "$EDITOR $TMPFILE" # Now that the user edits are complete, apply the sanity checks # This is left as a reader exercise... # # 1. Check to see if modifications have been made? # Compare /tmp/vipw.lock/passwd to /tmp/vipw.lock/passwd.orig # and exit if no change. # 2. Check that no system accounts have been modified. # 3. Check that no system accounts have been added. # 4. Check that no system accounts have been deleted. # 5. Perform formatting checking to insure a working file # 6. Check to see if modifications have been made to the real file # Compare /etc/passwd to /tmp/vipw.lock/passwd.orig # and exit with an error if changes present. # Finally, install the new password file. cat /tmp/vipw.lock/passwd > /etc/passwd rm $ORIGFILE $TMPFILE rmdir $TMPDIR