10分钟

任务 4 错误判断处理与功能改写

任务目标

对前面的Shell脚本工具进行改写,以实现更多的功能,并对用户使用过程中可能出现的常见异常情况进行处理,主要包括:对用户信息文件不存在、或未指定文件的情况的处理;内建命令使用绝对路径以获得更好的可移植性;针对用户修改属性需求的改写等。

任务步骤

1.编写文件判断逻辑

针对用户没有指定文件,或指定的文件不存在的报错处理。在while循环前添加以下if判断语句,其中-f用于判断,仅当用户传入的$1是一个真实存在的文件时才会返回“真”,否则报错后exit退出。

  if [ ! -f "$1" ];then
    echo "File not exists!"
    exit
  fi
错误文件的判断功能

2.命令改写为全路径

把脚本中的内建命令改成全路径,因为不同Linux中命令别名可能不同,使用绝对路径具有更好的可移植能力,且更容易修改。脚本中的echocutuseraddpasswd等均属于Linux内部自带命令的别名,均可以用命令文件的绝对路径代替。使用which命令可以查看命令的绝对路径。如图所示,可用/usr/sbin/useradd代替原有的useradd命令。

查找命令原文件

修改后原脚本变为以下内容。

#!/bin/bash
 USERADD=/usr/sbin/useradd
 PASSWD=/usr/bin/passwd
 CUT=/usr/bin/cut
 ECHO=/usr/bin/echo

  if [ ! -f "$1" ];then
    echo "File not exists!"
    exit
  fi

 while read LINES
  do
     username=`$ECHO "$LINES" | $CUT -f1 -d ","`
     password=`$ECHO "$LINES" | $CUT -f2 -d ","`
     $USERADD "$username"
     if [ $? -eq 0  ];then
     echo "$password" | $PASSWD --stdin $username
     else
     echo "$username already exists,skip the password"
     fi
done < $1
命令修改为全路径

3.脚本改写为批量删除功能

当前脚本可以根据用户指定的用户文件,自动按照文件的内容,批量创建出大量用户。如果用户误操作,指定了错误的用户文件,创建了大量的错误用户,可以将该脚本稍作更改,提供批量删除的功能。

删除用户不需要考虑密码问题,直接使用userdel命令对用户名进行操作即可。将原脚本复制一份到userdel.sh,修改内容如下:

#!/bin/bash
 USERDEL=/usr/sbin/userdel
 CUT=/usr/bin/cut
 ECHO=/usr/bin/echo

  if [ ! -f "$1" ];then
    echo "File not exists!"
    exit
  fi

 while read LINES
  do
     username=`$ECHO "$LINES" | $CUT -f1 -d ","`
     $USERDEL "$username"
     if [ $? -ne 0  ];then
       echo "$username not exists,can't userdel"
     fi
done < $1
批量删除用户

直接运行脚本,指定用户文件名,执行删除即可。第一次删除了用户,第二次再删除时会提示用户已经不存在,无法再删除,因此跳过。

批量删除用户效果验证

4.为脚本添加修改属性的功能

如果用户需要批量修改用户的属性,可以在脚本中加入usermod命令进行属性的修改。例如:现在对users.txt中的用户默认shell有要求,其中部分用户只能进行非交互式登录,即默认登录shell为/sbin/nologin,效果为可以调用该服务器的资源,但无法直接交互式登录到该服务器。

首先修改users.txt文件,后面增加一列用于指明特殊的用户的shell。此处以第2个用户和第4个用户为例。

用户属性的改写

接下来修改原Shell脚本,增加一个usermod修改命令如下。

#!/bin/bash
 USERADD=/usr/sbin/useradd
 PASSWD=/usr/bin/passwd
 CUT=/usr/bin/cut
 ECHO=/usr/bin/echo

  if [ ! -f "$1" ];then
    echo "File not exists!"
    exit
  fi

 while read LINES
  do
     username=`$ECHO "$LINES" | $CUT -f1 -d ","`
     password=`$ECHO "$LINES" | $CUT -f2 -d ","`
     shell=`$ECHO "$LINES" | $CUT -f3 -d ","`
     $USERADD "$username"
     if [ $? -eq 0  ];then
     echo "$password" | $PASSWD --stdin $username
     usermod -s "$shell" $username
     else
     echo "$username already exists,skip the password"
     fi
done < $1
脚本中添加属性的修改功能

再进行一次新建用户。

测试指定属性的新建用户功能

通过su命令切换用户,可以看到指定的两个用户不会被允许直接登录。

验证新建用户属性是否正确