Linux Shell script to add a user with a password to the system

Are you wondering how to add a user with a password using a shell script under Linux? Let us see how to add a new user and set/change a password including chaning the existing Linux user’s password in a Linux shell script.

You can quickly write a shell script that reads username, password from the keyboard, and add a username to the /etc/passwd and store encrypted password in /etc/shadow file using useradd command. The useradd command/adduser command used to create a new user on Linux and passwd command to set or change password for users. This page shows how to add a user account AND password with a bash shell script running on Linux operating systems.

ADVERTISEMENTS

Linux shell script to add a user with a password

The syntax is as follows:
useradd -m -p EncryptedPasswordHere username
Where,

  • -m : The user’s home directory will be created if it does not exist.
  • -p EncryptedPasswordHere : The encrypted password, as returned by crypt().
  • username : Add this user to the Linux system,

Step 1 – Create an encrypted password

You need to create an encrypted password using Perl crypt() as follows:

crypt($plain, $salt)
 
## perl one liner ##
perl -e 'print crypt("Your-Clear-Text-Password-Here", "salt"),"\n"'

Please note that crypt() is a one-way hash function. The PLAINTEXT ($plain) and SALT are turned into a short string, called a digest, which is returned. The same PLAINTEXT and SALT will always return the same string, but there is no (known) way to get the original PLAINTEXT from the hash. Small changes in the PLAINTEXT or SALT will result in large changes in the digest. Let us try out perl example:
perl -e 'print crypt("2IL@ove19Pizza4_", "salt"),"\n"'
Sample outputs:

sa.KT9zrGYeg2

The Perl command will display the encrypted password (sa.KT9zrGYeg2) on screen. The Perl crypt() function is a one way encryption method meaning, once a password has been encrypted, it cannot be decrypted. The password string is taken from the user and encrypted with the salt and displayed back on computer screen. We can store an encrypted password using the following syntax:

password="1YelloDog@"
pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)
echo "$pass"

Sample outputs”

paU5t8Al/qf6M

Warning: You must understand other users and system processes can view passwords processed using the CLI tools, and it is a security risk when you store passwords in a plain text format. Linux can hide processes from other users and ps command using this guide to limit some damage. I would recommend using Ansible Vault to storing passwords as well as changing them in bulk.

Step 2 – Shell script to add a user and password on Linux

Based upon above discussion here is a sample shell script (Download link):

#!/bin/bash
# Purpose - Script to add a user to Linux system including passsword
# Author - Vivek Gite <www.cyberciti.biz> under GPL v2.0+
# ------------------------------------------------------------------
# Am i Root user?
if [ $(id -u) -eq 0 ]; then
	read -p "Enter username : " username
	read -s -p "Enter password : " password
	egrep "^$username" /etc/passwd >/dev/null
	if [ $? -eq 0 ]; then
		echo "$username exists!"
		exit 1
	else
		pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)
		useradd -m -p "$pass" "$username"
		[ $? -eq 0 ] && echo "User has been added to system!" || echo "Failed to add a user!"
	fi
else
	echo "Only root may add a user to the system."
	exit 2
fi

Close and save the script file. Next set permissions using the chmod command:
chmod +x add-user-script.sh
Run it as following
$ ./add-user-script.sh
Only root may add a user to the system.
$ sudo ./add-user-script.sh

Or run it as root user:
# ./adduser
Sample outputs:

Enter username : roja
Enter password : HIDDEN
User has been added to system!

Now user roja can login with a password called HIDDEN. Here is sample session outputs:
Linux shell script add a user with a password

Step 3 – Change existing Linux user’s password in one CLI

We are going use the chpasswd command that reads a list of user names and password pairs from the keyboard and uses this information to update a group of existing users. The syntax is as follows:
echo "user_name:password" | chpasswd
However, the passwords must be provided in clear-text format, and are encrypted by the chpasswd command. For example, set or change user password, run:
# echo 'vivek:@iLovePizzaEvery1day' | chpasswd
Verify that password has been changed using the chage command:
# chage -l vivek
Change Linux Users Password in One Command Line
We can use the grep command/egrep command to search for usernames:
grep "^username" /etc/passwd
grep "^tom" /etc/passwd

If the chpasswd command not installed, use your systems package manager tool such as apt command/apt-get command/dnf command/yum command to install the same.

Step 4 – Create Users and change passwords with passwd on a CentOS/RHEL

The passwd command on CentOS/RHEL/Fedora and co comes with a special command-line option to change the password using a shell pipe as follows:
# echo "YourPassword" | passwd --stdin UserName
# echo "I4Love2Ubu@ntuLinux_" | passwd --stdin vivek

Outputs from sample session:

Changing password for user vivek.
passwd: all authentication tokens updated successfully.

So the --stdin option is used to indicate that passwd command should read the new password from standard input such as keyboard, which can be a pipe and must be run by root user.

Conclusion

You learned various methods to add a new user and set a password using a shell script. See the following for more info:

🐧 Get the latest tutorials on SysAdmin, Linux/Unix, Open Source & DevOps topics via:
CategoryList of Unix and Linux commands
File Managementcat
FirewallAlpine Awall CentOS 8 OpenSUSE RHEL 8 Ubuntu 16.04 Ubuntu 18.04 Ubuntu 20.04
Network Utilitiesdig host ip nmap
OpenVPNCentOS 7 CentOS 8 Debian 10 Debian 8/9 Ubuntu 18.04 Ubuntu 20.04
Package Managerapk apt
Processes Managementbg chroot cron disown fg jobs killall kill pidof pstree pwdx time
Searchinggrep whereis which
User Informationgroups id lastcomm last lid/libuser-lid logname members users whoami who w
WireGuard VPNAlpine CentOS 8 Debian 10 Firewall Ubuntu 20.04

ADVERTISEMENTS
66 comments… add one
  • Amol P Kesare Mar 22, 2007 @ 5:22

    I just want to send one script which I have made for changing password of any user from remote machine.
    Here I have created one file called “host” which contents host ips.

    Shell script code

    #!/bin/bash
    read -p "Enter Username: " username
    read -ers -p "Enter New password for user $username: " paswd
    echo
    read -ers -p "Enter Root Password: " rpaswd
    echo
    password=`python file ${paswd}`;
    echo "$username $password $npaswd"
    cat host | while read line
    do
    #####expect####
    status=$(expect -c "
    spawn ssh $line usermod -p $password $username
    expect {
    password: { send "$rpaswdn"; exp_continue }
    }
    exit
    ")
    
    echo ""
    echo "$status" > log.txt
    #####end of expect#######
    done
    

    python code – file [for crypt()]

    import crypt; import sys; print crypt.crypt(sys.argv[1],”salt”);

    Hope this will help somebody. 🙂
    Cheers!

  • 🐧 nixCraft Mar 22, 2007 @ 8:27

    Amol,

    Nice script.

    Appreciate your post.

  • Amol P Kesare Mar 22, 2007 @ 9:52

    Hey forgot one thing….there is one more file called “file”, and contents of these files are –

    import crypt; import sys; print crypt.crypt(sys.argv[1],”salt”);

  • 🐧 nixCraft Mar 22, 2007 @ 9:59

    Yes, i thought so… there is line about python… thanks

  • Allotment Mar 23, 2007 @ 13:00

    I always wondered if there was a bash /CLI command to list the users, is there?
    I see here
    egrep “^$username” /etc/passwd >/dev/null

    so there is not?

    • naushad Feb 10, 2011 @ 9:15

      egrep -v ^xyz /etc/passwd | cut -d”:” -f1

      Add this line in a script which displays all the users in your machine
      i have used ^xyz , Starting with that. genarally user names will never start with that , so we get the desired result as output becouse of the option -v .

      • naushad Feb 10, 2011 @ 9:29

        OR
        As a root
        vim usershow
        1 #!/bin/bash
        2 #this script displays the users in machine.
        3 egrep -v ^xyz /etc/passwd | cut -d”:” -f1 |less
        esc:wq
        cp usershow /usr/local/sbin/
        chmod -R +x /usr/local/sbin
        Thats it…Enjoymaadi
        usershow

  • 🐧 nixCraft Mar 23, 2007 @ 14:25

    Remove ‘>/dev/null‘ and you should see username if exists in /etc/passwd. To display list just type:

    cut -d: -f1 /etc/passwd

  • master Mar 26, 2007 @ 7:22

    its great but it is more powerful if you include the functionality to add lage number of users at once
    like in my uni more then 15000 stuent it is almoste inpossible to create their acccounts one by one

  • 🐧 nixCraft Mar 26, 2007 @ 18:54

    master,

    You may take help of this my previous post – How to create multiple users accounts in batch / bulk

    HTH

  • balakrishnan.R Apr 13, 2007 @ 11:24

    How I need edit the script to add the user in particular group and disable them by accessing telnet.

    example:

    useradd -d /home/example1 -s /bin/false -g popusers example1

  • Amol P Kesare Apr 17, 2007 @ 6:03

    ># Allotment Says:
    >March 23rd, 2007 (4 weeks ago) at 1:00 pm
    >I always wondered if there was a bash /CLI command >to list the users, is there?
    >I see here
    >egrep “^$username” /etc/passwd >/dev/null
    >so there is not?

    You can use gawk to list users
    gawk -F: ‘{ if ( $3>500 ) print $1 }’/etc/passwd

  • Fabio May 9, 2007 @ 17:03

    Could you kindly help me to integrate in this first script to add a user in /etc/shadow from a comma separeted file?
    I would like to export a list from a company application, create a .csv , and lunch it from a shell script or a php page in a website to import users in 1 step.
    The important is that the password used to access sistem by users is the one I can read in clear characters in the csv file.
    Let me know please, and put my address in copy fabio@conecta.it

  • bhushan Aug 10, 2007 @ 6:56

    egrep “^$username” /etc/passwd

    don’t u people think that this will not match string
    perfectly means if there is user like bhushan and i want to create user bhush…then it will give msg that user already exists…

  • 🐧 nixCraft Aug 10, 2007 @ 7:18

    Sure you can use word based matching:

    egrep -w “^$username” /etc/passwd
  • Slavko Aug 10, 2007 @ 8:02

    (echo "username:password")|chpasswd

  • bhushan Aug 14, 2007 @ 10:43

    hi vivek,
    how to add user without using useradd command?
    With all information such as uid(by incrementing existing highest one), gid,…….etc.

  • Tyler McAdams Aug 18, 2007 @ 16:20

    I need a shell script that will create a password for users already on the system. How can I do that?

  • Artem Nosulchik Sep 19, 2007 @ 14:45

    Another way to get encrypted password is command:

    openssl passwd yourpass

  • Eric Daza Jun 6, 2008 @ 4:09

    PASSWORD checking is limited to 8 characters long.

    I tried the Script above (adduser.sh), and the password checking is some how up-to 8 characters only. Meaning as long as you have the first 8 characters correct you can login to the system (I tested using su command)
    The part I changed on the script is to set username and password as a variable:

    username=test
    password=secr3t12345

    ex.
    password=secr3t12345

    it will allow secr3t12333333333 or secr3t12

    • SuseHead Mar 3, 2014 @ 20:31

      I found the same thing. 8 characters and it ignores the rest.

      How do you make it store more than 8 characters?

  • Lakh Dec 18, 2008 @ 19:14

    How can you also get this script to add a samba password at the same time it creates a unix password?

  • Lonnie Waugh Feb 2, 2009 @ 17:55

    Useful article, I was was looking to add users with a one liner so this helped .. since Debian lacks the crypt command, I didn’t even think to use perl ..

    Since I maintain the web server we use, exclusively .. I know all of my accounts have home directories, so I simply do my test to see if a user exists in perl .. but the same could be done in a shell script

    if (-e “/home/$username”) {
    print “The account already exists bonehead!”;
    exit;
    } else {
    // get on with it
    }

  • laknath Feb 21, 2009 @ 19:41

    hi,
    i compile this program but when i move to the second part I cant execute it in root . I got a error???

    No such file or directory

    why is that ???
    pls reply me….

  • rapsa Mar 16, 2009 @ 14:32

    how about this one liner script

    # useradd -m -p `perl -e ‘print crypt(“your_password”, “salt”),”n”‘` your_username

  • palani Mar 25, 2009 @ 7:23

    hi
    how to create new user to assign perssion to particular shell and set userid and groupid make this one line command

  • Mukundan May 28, 2009 @ 15:01

    HI

    I like to add bulk of user using bash scripting taking the user name from a text file from a given location and also want to set a sample passwd for the all user who have been created. and also the script has to mail to the corresponding user regarding the username and passwd . Can anyone help me out

    Thanks in advance

  • Gordon Jun 2, 2009 @ 22:29

    Sample shell script to add a user

    How do I change this to add the users full name ans login shell

  • Charanjit Singh Jul 5, 2009 @ 8:59

    Hi Vivek(nixcraft)
    Your mentioned shell script giving me an error message while executing it
    “line 19: syntex error: unexpected end of the file”
    Please check and where it is get stuck..
    Thanks
    Charanjit Singh

  • Dnyan Aug 17, 2009 @ 16:50

    Hi all,

    Can someone let me know, How to write script for password expiry notification in solaries.

  • Ravi Sajjan Oct 23, 2009 @ 8:25

    Hello Everyone,
    My self Ravi and I am trying to make one PHP page, from which i can able to create
    new user in linux. where in php code will show three boxes
    1.) New User Name:
    2.) Password:
    3.) Botton: Add now
    with this php code i want to add new user in linux through web interface.

    Kindly please help me out to do that so.

    Regadrs,
    Ravi

  • Harold Osborn Jan 15, 2010 @ 4:30

    i need to help me. i want to good 100% user email, password and forget password.
    frisrt sign user email then get get password number in then open in base.
    if forget password then send email get password
    Can anyone help me thank harold

  • majo053 Feb 6, 2010 @ 23:23

    simple: echo PASSWORD | passwd USER –stdin

  • Servando Aug 18, 2010 @ 18:25

    It was very useful your sample,

    thanks

    Servando

  • soumyav Aug 26, 2010 @ 15:58

    Hey I need a scrip to add 100 users to UNIX server using an Input file which has two input one full name the other username . But i need to generate password in the script which gets incremented with each added user ….

    Thanks a lot in advance ….

    soumya

  • Anil Dec 23, 2010 @ 13:14

    Very good script.

  • hemanth Jan 7, 2011 @ 11:26

    hi guys
    can any one tell me how to write a script such that the script reads the password and enters to tat user

  • John Apr 23, 2011 @ 5:13

    i just want to know the script
    Write a shell script that can be used to:
    Detailed requirements
    1. The script can only be executed by the root user, administrator or users with administrative rights.
    2. If the root user starts the program as specified, it should read the input file and check the new users’ information one by one. If a new user’s information is valid, it should create the account for the user and write the account information to a report file. The report file should have the following format:
    account_name;user_id;group_name;group_id;created_date;user_fullname
    3. If a new user’s information is not valid, it should not create the account for the user. The error should be written to an error report file. You need to specify the file format.
    4. If the root user executes the script incorrectly, e.g., without the necessary parameters or with incorrect parameters, it should provide an appropriate help message to the user. For example, it could show the correct usage of the command.
    5. If the root user executes the command with the –h switch, the program should give detailed information about the program and the file structure of the input file.
    6. The input file should have the following structure:
    • Each line is a user record.
    • Each record has four fields separated by commas (,) as follows:
    Username,password,groupname,fullname
    Note: The password field must be between 9 and 12 characters long. The field for the user’s full name may contain blank spaces. You must specify the features of the other fields. If a group does not exist, the program should create a default group automatically.

  • jyothi Aug 18, 2011 @ 5:07

    pass=$(perl -e ‘print crypt($ARGV[0], “password”)’ $password)
    in this block what does $ARGV[0] stores and how it will work

  • franka Oct 3, 2011 @ 6:42

    we really appreciate your useful code

  • please help me Nov 3, 2011 @ 20:29

    The student should write a bash program named myuseradd that accepts a list of users as argument

    Script syntax: myuseradd [ [ ..]]

    At least one argument must be provided and must not exceed 10 alphanumeric characters.

    The script must not use the usedadd or similar commands. It must:

    1- Check if user is root. If not the script cannot be run and it exits.
    2- Check the number of arguments. If none the script exits.
    3- Check if is already used, if yes the script exits.
    4- Ask the user to provide the following data:
    a. Home directory:
    Default is /home/
    The script accepts either /home/ or /. must
    not exceed 10 alphanumeric characters and the entered home directory
    must not exist already.
    b. Login shell
    Default is /bin/bash
    The script can accept one of the shells as listed in /etc/shells.

    If provided data does not meet conditions, the user is asked to enter the data again

    5- Add user with name , provided home directory and login shell to the system’s users (/etc/passwd file).

    6- Assign userid (must be the first available userid greater or equal to 500).

    7- Create a new group with group name and gid same as uid and assign it as primary group. This must be done by adding an entry to /etc/group.If the group already exists, no change is done.

    8- Create home directory and set required permissions.
    9- Copy startup scripts to the home directory (from /etc/skel).

    10- Create a line in /etc/shadow that corresponds to the user with a blank password.

    11- Call the passwd program to set the password.

    12- Produce an output the summarize what it did.

  • yang Mar 16, 2012 @ 21:24

    Very appreciated!
    I am working a project started from another team in another continent. The document/help we get is zero. So we are on our own.
    During the boot, I am stopped by login/password. There are several ways to crack in.
    By using your script, I easily add a user(ie, myself) into the system. It works painlessly. Thank you so much!

  • ferr0 Apr 23, 2012 @ 15:13

    to change the password ->
    echo “User_name:PASSWORD” | chpasswd

  • Toni Weber May 22, 2012 @ 20:11

    I found an very easy way to do this:

    For System-Password:
    # echo -e “n”|passwd

    For SAMBA-Password:
    # echo -e “n”|smbpasswd -sa

    In some configuration the System-Password will changed with smbpasswd also!
    Check /etc/samba/smb.conf for Password-Chat

  • sameet Aug 2, 2012 @ 7:59

    hello i m new in unix can anyone tell me how to write a bash script which prompts user and assigns a password?

  • Menard Oct 1, 2012 @ 20:08

    The sample scripts are great.

  • Sanjib N. Feb 1, 2013 @ 9:24

    This script really help me in creating mass user accounts for students.

    Thanks
    sn

  • Willis Nov 8, 2013 @ 0:46

    Quality contribution appreciate it

  • Amols Jun 10, 2014 @ 9:07

    I am using this script but when i run these script it ask me username and when i entered Password i am getting error Failed and when i am not entering password it succesfully create user. Please let me know what i missing..

    Thanks

  • Craig Jun 19, 2014 @ 16:43

    I’m learning UNIX. I would like a script to add a user account (id and password) to multiple UNIX servers. I currently use smit user when a new employee begins working which takes forever because we have over 100 UNIX servers. Please help.

  • Annie Feb 6, 2015 @ 10:37

    is there a way to do this so you dont have to be the root? im having problems with permissions as i am using a virtual machine so please reply as advice would be greatly appreciated.

  • mohit Mar 3, 2015 @ 13:09

    hello Admin ,
    script having problen in creating user i.e mohit2 if a user mohit23 is present .
    it is not exactly grepping the user name from /etc.passwd.

    • Naushad Nazeer Pasha Mar 4, 2015 @ 3:47
      #!/bin/bash
      # Script to add a user to Linux system
      if [ $(id -u) -eq 0 ]; then
      	read -p "Enter username : " username
      	read -s -p "Enter password : " password
      	cut -d ":" -f 1 /etc/passwd | egrep "^$username$" >/dev/null
      	if [ $? -eq 0 ]; then
      		echo "$username exists!"
      		exit 1
      	else
      		pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)
      		useradd -m -p $pass $username
      		[ $? -eq 0 ] && echo "User has been added to system!" || echo "Failed to add a user!"
      	fi
      else
      	echo "Only root may add a user to the system"
      	exit 2
      fi
    • Naushad Nazeer Pasha Mar 4, 2015 @ 3:48

      I hope the newly given code will fix your issue, enjoy.

  • shailendra kalal Mar 6, 2015 @ 16:00

    can any one please help on this ..

    i need to check around 1000 user’s for all details its mentioned in /etc/passwd.

    • Naushad Nazeer Pasha Mar 11, 2016 @ 10:52
      #!/bin/bash
      # Script to add user(s) to Linux system based on agrument as input to the script
      #usage "sh user.sh users-filename"
      for user in `cat $1`
      do
      	if [ $(id -u) -eq 0 ]; then
      		egrep "^$user" /etc/passwd >/dev/null
      		if [ $? -eq 0 ]; then
      			echo "$user : User already exists!" >> /var/ucsd/user.sh.log
      		else
      			pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)
      			useradd -m -p $pass $user
      			[ $? -eq 0 ] && echo "$user : User has been added to system!" >> /var/ucsd/user.sh.log || echo "Failed to add a user!" >> /var/ucsd/user.sh.log
      		fi
      	else
      		echo "Failed to create user accounts, Only root may add a user to the system" >> /var/ucsd/user.sh.log
      		exit 2
      	fi
      done
  • pooja Apr 7, 2015 @ 4:56

    i need a program on shell script whether the username entered is correct to the password

  • DontHaveAName Oct 6, 2015 @ 15:09

    Vivek Gite,
    Thanks very much for this posting, I have referenced this for my computing task!
    Would it be possible if you could explain this line by line so I understand how it works? The other thing was, is it possible to also add these users to groups by using the script too?
    Thanks once again!

  • Anonymous Nov 26, 2015 @ 11:02

    How would I add a user and then add them to a group if the user was inputted in a shell script?

  • no one Jan 26, 2016 @ 10:21

    what does the -p and -s -p do?

  • zuckerberg Apr 17, 2016 @ 19:01
    #Shell script to create a new user
    
    echo " Enter Account Name:"
    read ACCOUNTVAR
    
    echo " Enter Accounts' Password"
    read PASSVAR
    
    echo " Enter Group"
    read GROUPVAR
    
    net user $ACCOUNTVAR $PASSVAR /add
    net localgroup $GROUPVAR $ACCOUNTVAR /add
  • SAMULA HASSAN May 7, 2016 @ 6:08

    i DO APPRECIATE THE BLOG THANKS

  • mayur murkya Jul 7, 2016 @ 5:36

    Hi,

    We can use below command for user creation and its password entry.

    useradd mayur && echo -e “mayur@123nmayur@123” | passwd mayur

    Here,
    n is for new line

  • Pradeep Nov 17, 2016 @ 4:51

    Hi Admin,
    i need a shellscript to add a new user to server
    +to access to ssh through i need to copy my public key in the currently created user path
    +i want to prevent root permission to new user
    +this steps need to be done in centos

  • Yolo Nov 23, 2016 @ 15:56

    can you show how to do this?

    Write a script called simple-useradd.sh that adds a local user to the system. This script should:
    Take only one argument, or else exit after printing a usage message.
    . Check /etc/passwd and decide on the first free user ID. Print a message containing this ID.
    Create a private group for this user, checking the /etc/group file. Print a message containing the group ID.
    Gather information from the operator user: a comment describing this user, choice from a list of shells (test for acceptability, else exit printing a message), expiration date for this account, extra groups of which the new user should be a member.
    . With the obtained information, add a line to /etc/passwd, /etc/group and /etc/shadow; create the user’s home directory (with correct permissions!); add the user to the desired secondary groups.
    Set the password for this user to a default known string.

  • Aashish Aug 24, 2020 @ 20:38
    #!/bin/bash
    
    # Check whether the script is executed by root.
    
    if [[ $UID -ne 0 ]]
    then
      echo 'unable to create user'
      exit 1
    fi
    
    #Adding User
    
    awk -F ':' '{print $2}' /ansible_test/users.txt > password.txt
    filename='password.txt'
    
    for USER_NAME in $(awk -F ':' '{print $1}' /ansible_test/users.txt)
    do
      useradd $USER_NAME
      head -1 $filename | passwd --stdin $USER_NAME
      passwd -e $USER_NAME
      sed -i '1d' $filename
    done
    

Leave a Reply

Your email address will not be published. Required fields are marked *

Use HTML <pre>...</pre>, <code>...</code> and <kbd>...</kbd> for code samples.