#!/bin/bash # # adduser 1.4: a utility to add users to the system # # Copyright (C) 1994 Ian A. Murdock # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Written for the Debian Linux distribution (01/21/94). Feel free to use # it in YOUR distribution, too. :) Please note that this is just a simple # script that _somewhat_ automates the really boring and repetitive task # of creating new user accounts. It makes no attempt to be sophisticated. # Let me know if you improve it in any way. # # I need to write a man page for this. # # Modified by Marc Ewing for Red Hat Linux # Modified by Michael K. Johnson for optional # shadow password support. # Modified by Michael K. Johnson to make it safer # Everything happens too fast, so don't let the user interrupt. trap "" 1 2 3 15 # Set a few important variables before getting started. NUMARG=$# LOGIN="$1" EXIST=0 NOHOME="$2" PASSWD="/etc/passwd" PBAK="/etc/passwd-" # Some programs use /etc/passwd-, others use # /etc/passwd.OLD. Take your pick. PNEW="/etc/passwd.new" SHADOW="/etc/shadow" SBAK="/etc/shadow-" SNEW="/etc/shadow.new" GROUP="/etc/group" GBAK="/etc/group-" GNEW="/etc/group.new" PLOCK="/etc/.pwd.lock" # Standard method of locking the password file. DSHELL="/bin/bash" DHOME="/home" SKEL="/etc/skel" SPOOL="/var/spool/mail" FIRST_UID=500 FIRST_GID=500 # A few sanity checks... if [ `id -u` != 0 ]; then echo "Only root may add users to the system." ; exit 1 fi if [ $NUMARG = 0 ]; then echo "You need to specify the login to add; for example, \`adduser redneck'." ; exit 1 # this is the donnie memorial shell script... fi if id "$LOGIN" >/dev/null 2>&1 ; then echo "User $LOGIN already exists" exit 1 fi if [ $(echo "$LOGIN" | wc -c | tr -d ' ') -gt 9 ] ; then # that 9 is intentional -- it counts the newline, too... echo "$LOGIN is over eight characters" exit 1 fi if echo "$LOGIN" | grep -q : ; then echo "$LOGIN contains a \`:' character" exit 1 fi id $LOGIN >/dev/null 2>/dev/null && EXIST=1 if [ $EXIST = 1 ]; then echo "The login $LOGIN already exists." exit 1 fi if ln $PASSWD $PLOCK; then : ; else echo "$PASSWD is locked. Try again later." ; exit 1 fi die () { rm -f $PLOCK exit 1 } # And now the program begins: echo "" ; echo -n "Looking for first available UID..." NUID=`cut -f 3 -d ":" $PASSWD | sort -n | awk -v uid=$FIRST_UID ' { if ($1 == uid) uid = uid + 1; } END { print uid; } '` if [ $NUID -ge 65535 ]; then echo "Sorry, ran out of uids." die fi echo " $NUID" echo -n "Looking for first available GID..." NGID=`cut -f 3 -d ":" $GROUP | sort -n | awk -v gid=$FIRST_GID ' { if ($1 == gid) gid = gid + 1; } END { print gid; } '` if [ $NGID -lt $FIRST_GID ]; then NGID=$FIRST_GID fi if [ $NGID -ge 65535 ]; then echo "Sorry, ran out of gids." die fi echo " $NGID" echo "" ; echo -n "Adding login: $LOGIN..." cp $PASSWD $PBAK || die cp $PASSWD $PNEW || die if [ -f "$SHADOW" ] ; then echo "$LOGIN:x:$NUID:$NGID:RHS Linux User:$DHOME/$LOGIN:$DSHELL" | \ cat >> $PNEW || die # need cat because echo won't return a return code cp $SHADOW $SBAK || die cp $SHADOW $SNEW || die # The date invocation is non-standard, but works with GNU date. # It fills in the "last changed" field with the number of DAYS # since epoch (86400 seconds per day; %s is second since epoch). echo "$LOGIN:*:$(($(date '+%s')/86400))::::::" | \ cat >> $SNEW || die else echo "$LOGIN:*:$NUID:$NGID:RHS Linux User:$DHOME/$LOGIN:$DSHELL" | \ cat >> $PNEW || die fi # Add user to users group cp $GROUP $GBAK || die cp $GROUP $GNEW || die sed "s/^\(users:.*[^:]\)\$/\1,$LOGIN/"' '"s/^\(users:.*:\)\$/\1$LOGIN/" < $GBAK > $GNEW || die echo "$LOGIN::$NGID:$LOGIN" | cat >> $GNEW || die mv $GNEW $GROUP if [ -f "$SHADOW" ] ; then mv $SNEW $SHADOW fi mv $PNEW $PASSWD rm -f $PLOCK echo "done." if [ "x$NOHOME" = "x" ]; then echo -n "Creating home directory: $DHOME/$LOGIN..." mkdir $DHOME/$LOGIN chmod 2775 $DHOME/$LOGIN cp -a $SKEL/.??* $SKEL/* $DHOME/$LOGIN >/dev/null 2>/dev/null chown -R $NUID.$NGID $DHOME/$LOGIN echo "done." fi echo -n "Creating mailbox: $SPOOL/$LOGIN..." touch $SPOOL/$LOGIN ; chmod 660 $SPOOL/$LOGIN ; chown $NUID.mail $SPOOL/$LOGIN echo "done." echo "" echo "Don't forget to set the password." if [ "x$NOHOME" != "x" ]; then echo "" echo "The home directory for $LOGIN was set to $DHOME/$LOGIN but the directory" echo "was not created. Be sure that you set it up properly." fi #passwd $LOGIN #chfn $LOGIN # EOF