在bash脚本中验证文本文件中的帐户创建

时间:2016-02-25 19:41:08

标签: linux bash grep cut

我正在尝试输出哪些帐户已经从文本文件成功创建,哪些帐户尚未成功创建。我还想输出成功创建帐户的数量。我目前得到以下错误:grep:3:没有这样的文件或目录。脚本和文本文件保存在同一个文件夹中。我在我的脚本中使用了以下命令。

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"

编辑:

#!/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

1 个答案:

答案 0 :(得分:1)

你快到了。

您的方法的主要问题是您尝试使用grep一次搜索多个帐户。变量verify有多个用户ID,因此您需要逐个处理它。

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

for循环会将verify变量中的每个元素都转换为id并使用grep进行搜索(-w仅匹配整个单词,而不是片段,^匹配行的开头和-o仅输出匹配的单词而不输出整行。 我们计算count变量中的匹配数。运行for循环两次的替代方法,并将第二个循环到wc -l。 &安培;&安培;运算符意味着如果前一个命令找到匹配项(grep的返回码为0),它将增加count

如果grep未找到匹配项(返回码不为0),则下一个循环将不会打印匹配的ID(-q),并且将回显id。这是通过||实现的操作

关于列表迭代的最后一点注意事项:如果成员可以包含空格(与用户标识不同),则应使用${verify[@]}(这是bash-ism)而不是$verify

请忘记这一点:cat /etc/passwd | grep pattern,改为使用grep pattern /etc/passwd