简体   繁体   中英

Verify account creation from text file in bash script

I am trying to output which accounts have been successfully created from a text file and which haven't. I would also like to output the number of successfully created accounts. I currently the get the following error: grep: 3: No such file or directory. The script and text file and saved in the same folder. I have use the following commands in my script.

file=users.txt
verify =grep "verify" $file |cut -f2 -d:`
cat /etc/passwd | grep $verify 

echo -e "\nYou have Currently" 
cat /etc/passwd | grep $verify |wc -l; 
echo "users added from your Text File"

Edit:

#!/bin/bash
ROOT_UID=0  #The root user has a UID of 0
if [ "$UID" -ne "$ROOT_UID" ]; then
    echo "**** You must be the root user to run this script!****"
    exit
fi
clear
echo
echo  "######################################################"
echo  "##### Batch script to automate creation of users #####"
echo -e "######################################################\n"

while true;
do
    file=notvalid
    while [ $file == "notvalid" ]
    do
    #echo "repeat $repeat"
    #echo -e "\n"
    echo -n "Please enter import filename:"
    read filename
    echo -e "\r"
    exists=0
    if  [ -e $filename ]; then
        file=valid

        while IFS=":" read  firstname lastname userid password group
        do  
            egrep -i "^$userid:" /etc/passwd &>/dev/null
            if [ $? -eq 0 ]; then
                exists=$((exists+1)) 
                #echo -e "${firstname} ${lastname} already exists on the system"
                #grep ${userid} /etc/passwd
                aname=$( getent passwd "$userid" | cut -d: -f3)
                echo "Account Exists: $aname" 
                euserid=$( getent passwd "$userid" | cut -d: -f1)
                echo "User ID: $userid"
                homedir=$( getent passwd "$userid" | cut -d: -f6)
                echo "Home Directory: $homedir"
                usershell=$( getent passwd "$userid" | cut -d: -f7)
                echo "User Shell: $usershell"   
                g=$( id -Gn "$userid")
                echo "Groups: $g"
                echo -e "\r" 
            else
                egrep -i "^$group:" /etc/group &>/dev/null
                if [ $? -eq 1 ]; then
                    /usr/sbin/addgroup ${group} &>/dev/null
                fi
                useradd -d /home/"${userid}" -m -s /bin/bash -c \
"${firstname}${lastname}" -g "${group}" "${userid}"
                echo "Creating Account: ${firstname} ${lastname}"
                nuserid=$( getent passwd "$userid" | cut -d: -f1)
                echo "Creating User ID: ${nuserid}"
                { echo ${password}; echo ${password}; } |  sudo passwd ${userid} > /dev/null 2>&1
                echo "Creating Password: ${password}"
                echo "Creating Home Directory: /home/${userid}"
                echo "Creating User Shell: /bin/bash"
                echo -e "Assigning Group: ${group}\n"
            fi

        done < $filename
    else
        echo -e "##### CANNOT  FIND OR LOCATE FILE #####"
    fi

    verify=`grep "verify" /home/pi/$filename | cut -f3 -d:`
    echo "$verify"
    count=0
    for id in $verify
        do grep -wo ^$id /etc/passwd && count=$((count+1))
    done
    echo $count users added from your text file
    echo these are not added:
    for id in $verify
        do grep -wq ^$id /etc/passwd || echo $id
    done 
    while true
    do
    echo -n "Create additional accounts [y/n]: "
    read opt
    if [[ $opt == "n" || $opt == "y" ]];then
        break
    else
        echo "Invalid Input"
    fi
    done

    if [ $opt = "n" ]; then
        clear
        break
    else
        clear
    fi
done

You were almost there.

The main issue with your approach is that you try to search for multiple accounts at once with grep. The variable verify has multiple userids so you need to process it one by one.

file=users.txt
verify=`grep "verify" $file | cut -f2 -d:`
count=0
for id in $verify
  do grep -wo ^$id /etc/passwd && count=$((count+1))
done
echo $count users added from your text file
echo these are not added:
for id in $verify
  do grep -wq ^$id /etc/passwd || echo $id
done

The for loop will take each element in your verify variable into id and search with grep (-w matches only whole words, not fragments, ^ matches the beginning of line and -o outputs only the matching word not the whole line). We count the number of matches in the count variable. Alternative approach to run the for loop twice and pipe the second one to wc -l as you did. && operator means it will increase count if the previous command found a match (the return code of grep was 0).

The next loop will not print matching ids (-q), and will echo id if grep did not found a match (the return code was not 0). This is achieved with the || operator.

One last note on iteration of a list: if the members can contain spaces (unlike userids), you should use ${verify[@]} (this is a bash-ism) instead of $verify .

And forget this: cat /etc/passwd | grep pattern cat /etc/passwd | grep pattern , use grep pattern /etc/passwd instead.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM