5

In order to simplicate the process of creating a new user in my company's NIS server, I wrote the following scripts:

#!/bin/bash
# This script will simplicate NIS user management.
# You will not be able to change password or delete users peeradmin and root through this script.
# Written by Itai Ganot 2014.

# Variables
USER=$1
GREP="/bin/grep"
PASSWDFILE="/etc/passwd"
YPPASSWD="/usr/bin/yppasswd"
USERDEL="/usr/sbin/userdel"
USERADD="/usr/sbin/useradd"
PASSWD="/usr/bin/passwd"
YPCAT="/usr/bin/ypcat passwd.byname"


# Functions
function usage {
echo -e "Usage: $0 <username to manage>"
}

function updatenis {
echo -e "\e[36m #===#  Uptdating NIS database... \e[0m"
cd /var/yp && make
}

# Script
if [ -z "$USER" ]; then
usage
exit 1
fi
if [ "$(id -u)" != "0" ]; then
echo -e "Run as root!"
exit 1
fi
"$GREP" -q "$USER" "$PASSWDFILE"
if [ "$?" = "0" ]; then
    echo -e "\e[36m #===#  User already exists \e[0m"
    echo -e "\e[36m #===#  How would you like to continue? \e[0m"
    USERID=$(id -u $USER)
    select CHOICE in 'Change user password' 'Remove user' 'View user' 'Exit'; do
        case $CHOICE in
        "Change user password")
        if [[ "$USER" = "peeradmin" || "$USER" = "root" ]]; then # Defense against changing root or peeradmin password
                        echo -e "\e[36m #===#  User $USER should never be edited! \e[0m"
                        exit 1
                        fi

        echo -e "\e[36m #===#  Provide root password for NIS server... \e[0m"
        "$YPPASSWD" "$USER"
        break
        ;;
        "Remove user")
            if [[ "$USER" = "peeradmin" || "$USER" = "root" ]]; then # Defense against deletion of user root or peeradmin.
            echo -e "\e[36m #===#  User $USER should never be edited! \e[0m"
            exit 1
            fi
        read -r -p "Remove home directory and mail? [y/n] " ANSWER1
        if [[ "$ANSWER1" = [Yy] ]]; then
        "$USERDEL" -r "$USER"
        updatenis
        echo -e "\e[36m #===#  User $USER has been deleted along with the user's home folder and mail \e[0m"
        break
        else
        "$USERDEL" "$USER"
        echo -e "\e[36m #===#  User $USER has been deleted \e[0m"
        updatenis
        break
        fi
        ;;
        "View user")
        echo -e "\e[36m #===# Displaying user $USER \e[0m"
        $YPCAT | $GREP "$USER"
        break       
        ;;
        "Exit")
        echo -e "\e[36m #===#  Exiting, No changes done.  \e[0m"
        exit 0
        ;;
        esac
    done
else
    read -r -p "User doesn't exist, would you like to add it? [y/n] " ANSWER2
    if [[ "$ANSWER2" = [Yy] ]]; then
        echo -e "\e[36m #===#  Collecting required information... \e[0m"
        sleep 2
        LASTUID=$(tail -n 1 $PASSWDFILE | awk -F: '{print $3}')
        NEXTUID=$(( LASTUID + 1 ))
        $USERADD -g users $USER -u $NEXTUID
        echo -e "\e[36m #===#  Set password for the new user \e[0m"
        $PASSWD $USER
        updatenis
        read -r -p "Would you like to test the creation of the user? [y/n] " ANSWER3
            if [[ "$ANSWER3" = [Yy] ]]; then
            $YPCAT | $GREP "$USER"
                if [ "$?" = "0" ]; then
                echo -e "\e[36m #===#  User $USER created successfully!  \e[0m"
                fi
            fi
    elif [[ "$ANSWER2" = [Nn] ]]; then
        echo -e "\e[36m #===#  Exiting, no changes done. \e[0m"
        exit 0
    fi
fi

I want to make the script public so I'll be able to share it with some communities, however I'm having a hard time to get some specific thing done. I want to define a new variable called: PROTECTEDUSERS and assign one or more usernames to it. Example:

PROTECTEDUSERS="root peeradmin"

Then, In the relevant line:

if [[ "$USER" = "peeradmin" || "$USER" = "root" ]];

I want the line to include the newly created variable. I've tried this:

if [[ "*$USER*" =~ "$PROTECTEDUSERS" ]]; then...

But it doesn't work, is that even a possible thing to do? I believe it is just don't know how to do it, please assist.

Thanks in advance

2 Answers 2

9

You are using glob in reverse direction, use this condition with == in bash:

if [[ "$PROTECTEDUSERS" == *"$USER"* ]]; then...

glob pattern is only supported on RHS of comparison.

Sign up to request clarification or add additional context in comments.

Comments

8
if [[ "$PROTECTEDUSERS" =~ $USER ]]; then

Update to not match substings like "admin":

if [[ "$PROTECTEDUSERS" =~ (^| )$USER($| ) ]]; then

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.