Automating Linux User Creation with Bash Script
Published: 2024-07-02 19:08:05

In today's fast-paced technology environment, efficiency and automation are key. Automating tasks with a Bash script can save a significant amount of time and reduce errors. In this technical report, we will walk through the process of creating a Bash script to automate user and group creation, setting up home directories, and managing permissions and passwords.

**Project Overview**
Your company has recently hired several new developers, and you need to create user accounts and groups for them. To streamline this process, we will write a Bash script called create_users.sh. 
This script will;
1. Read a text file containing usernames and group names,
2. Create users and groups as specified, 
3. Set up home directories, 
4. Generate random passwords, and
5. Log all actions to /var/log/user_management.log and store the generated passwords securely in /var/secure/user_passwords.txt.

We can create the Bash script called "create_users.sh" with this command;
![Bash script](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rlrlnubgk69oenjh7pg4.png)

**Implementation steps**
Let's walk through the script step-by-step to understand its functionality.

1. **Checking root privileges;**
This line specifies that the script should be executed with the Bash shell.
![shabang](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5qj5s563xpld9w9dwtfx.png)
The script checks if it is being run as root. If not, it prompts the user to run the script with root privileges and exits.
![Root privileges](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qjfw2b8t25gcolgfveyh.png)

2. **Checking for User Data File**;
The script checks if the filename (user-data-file) is provided as an argument. If not, it displays the correct usage and exits.
![user data file](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x5gmlxooqum4uygsxkdj.png)

3. **Initializing Variables and Creating Directories**;
The script creates the necessary directories and sets appropriate permissions to ensure security.
Here, The 'user_data_file' stores the filename provided as an argument. Additionally 'log_file' and 'password_file' store the paths for logging actions and storing passwords.
![Initialize variables](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hjwq0np80u25r6ootdt9.png)

4. **Generating Random Passwords**;
A function to generate random passwords using openssl.
![Random password](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0y3e660c1eh1cgpg5me8.png)

5. **Reading User Data File and Creating Users**;
The script reads the user data file line by line. For each line, it:
. Trims any leading or trailing whitespaces from the username and groups.
. Checks if the user already exists. If so, it logs the information and moves to the next user.
. Creates the user and assigns them a personal group.
![creating users](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7ecbk90f3wurbou6rj3y.png)

6. **Adding Users to Additional Groups**;
If additional groups are specified, the script adds the user to these groups, creating the groups if they do not exist.
![Adding users](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7wsp86xk9v7604zyrvpy.png)

7. **Setting Home Directory Permissions**;
The script sets appropriate permissions for the user's home directory.
![Directory permission](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d6ts2xn15ok5n9ty4lqx.png)

8. **Generating and Storing Passwords**;
It generates a random password, sets it for the user, and stores it in the password file.
![Store paswwords](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7voq25yw1n8w381rcrze.png)

09. **Logging Actions**;
Finally, the script logs all actions and completes the user creation process.
![Logging actions](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/16crcyxklkmlx28z8mse.png)


**Running the script**;
1. **Create the txt file containing the users and the groups;**
The user accounts' structure is contained in this text file. Save and close the file.
![txt file](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sv1buhgsl6xol3n1i7zn.png).
Every line in the file identifies a user along with the groups (such "admin" or "finance") to which they are assigned. The semicolon divides the groups and users. users.txt has the structure:
![user datafile](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gpo5vu37lvux5nbm84kt.png).

2. **Ensure the script is executable**;
![Execute script](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b1ycaehf2wce8qi6tafa.png)

3. **Run script**;
![Run script](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ltto8i2w05if31v4jecf.png)



**Verify the results**
1. Check the log file for actions performed;
![log file](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7xn71tqo39di2cvw0b0n.png)

2. Verify the user passwords file;
![verify passwd](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5ughb8osml4fncs80gwn.png)

3. Ensure the new users and groups are created correctly;
![verify results](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bno7rv1pwj7i07q14tg5.png)


**Conclusion**
This script automates the creation of users and groups, ensuring a streamlined onboarding process. This article is a stage two task in the DevOps of HNG internship. For more information about the HNG Internship and how it can benefit your organization, visit [HNG Internship](https://hng.tech/internship) and [HNG Hire](https://hng.tech/hire).

By using this tutorial, you can make your organization's user management procedure more efficient and ensure that new developers are onboarded promptly.

Happy Scripting.