第16期-Linux运维挑战赛

原创
2018/02/13 22:57
阅读数 268

实验楼比赛第16期

https://www.shiyanlou.com/contests/lou16/challenges

1 备份日志

1.1 要求

https://www.shiyanlou.com/challenges/3881

作为系统管理员,小楼收到一个需求,需要每天备份系统当天的部分日志文件,日志备份的需求描述如下:

  1. 为 shiyanlou 用户添加计划任务
  2. 每天凌晨2点的时候定时打包 /var/log 下的 dpkg.log,mysql.log,fontconfig.log 三个文件到 /home/shiyanlou/backup/ 目录
  3. 命名格式为 年-月-日.tar,比如今天是2017年10月23日,那么文件名为2017-10-23.tar,若有重名则覆盖

1.2 思路

1.3 方案

#!/bin/sh
tar -Pcf /home/shiyanlou/backup/`date +%F`.tar /var/log/dpkg.log /var/log/mysql.log /var/log/fontconfig.log

# 说明
-P参数:使用绝对路径

定时任务

crontab -e
0 2 * * * shiyanlou sudo tar -Pcf /home/shiyanlou/backup/`date +%F`.tar /var/log/dpkg.log /var/log/mysql.log /var/log/fontconfig.log

实验环境中cron启动问题

sudo cron
sudo cron start

排查问题

tail -f /var/log/cron
tail -f /var/spool/mail/root

2 批量创建删除用户和组

2.1 要求

https://www.shiyanlou.com/challenges/3882

小楼是一个系统管理员,需要为一个教室中的服务器添加一个老师和若干学生用户,手动添加太麻烦了,请你为他编写一个bash脚本 userctr.sh 实现批量添加和删除用户。老师用户名,学生用户名和学生数量使用参数进行控制。

userctr.sh 脚本执行时候包括四个参数:

bash userctr.sh 操作(add或者del)教师名 学生名前缀 学生数量

脚本成功执行后将创建1个教师用户和若干个学生用户,满足下列条件:

  1. 学生数量参数,参数范围为1~10,若超过10或不为正整数,则报错打印 parameter error
  2. 学生名前缀为字符串,只允许包含小写字母,否则报错打印 parameter error,前缀后面跟数字序列
  3. 每个用户默认使用 zsh,教师用户默认具备 sudo 权限
  4. 每个用户设置一个随机6位数字密码,在添加命令执行后并将用户名和对应的密码输出
  5. 如果某个用户名已经存在,则默认不需要创建该用户,输出时密码显示为6个星号

执行脚本的范例:

# 添加一个 teacher 用户和 stu1 到 stu6 6个学生用户
$ bash userctr.sh add teacher stu 6
teacher:901231
stu1:271828
stu2:928172
stu3:******
stu4:384712
stu5:098273
stu6:921098

# 删除一个 teacher 用户和 stu1 到 stu6 6个学生用户
$ bash test.sh del teacher stu 6

其中 stu3 六个星号代表这个用户先前已经被创建了,所以该命令执行的时候并不清楚该用户的密码。删除命令执行时如果某个用户不存在也不需要报错,直接执行删除其他用户。

2.2 思路

# 6位随机数密码
date +%s%N | cut -c14-19

sudo权限

https://www.digitalocean.com/community/tutorials/how-to-edit-the-sudoers-file-on-ubuntu-and-centos

# Ubuntu
gpasswd -a username sudo
gpasswd -d username sudo

# CentOS
gpasswd -a username wheel
gpasswd -d username wheel

# 说明
# CentOS如果设置后不生效,进入sudo文件(/etc/sudoers),把wheel的注释去了
visudo
%wheel ALL=(ALL) ALL

2.3 方案

userctr.sh

#!/bin/sh

usage() {
    #echo "Usage: $0 <add/del> <teacher_name> <student_prefix> <student_count>"
    echo "parameter error"
}

# 参数判断
# 4个参数
if [ $# -ne 4 ]; then
    usage
    exit 1
fi
# 操作是add/del
if [ $1 != "add" -a $1 != "del" ]; then
    usage
    exit 1
fi
# 老师姓名,小写字母
if [ "`echo $2 | grep -P '^[a-z]+$'`" != $2 ]; then
    usage
    exit 1
fi
# 学生姓名前缀,小写字母
if [ "`echo $3 | grep -P '^[a-z]+$'`" != $3 ]; then
    usage
    exit 1
fi
# 学生数量是整数
expr $4 + 1 &>/dev/null
if [ $? -ne 0 ]; then
    usage
    exit 1
fi
# 学生数量范围 1-10
if [ $4 -lt 1 -a $4 -gt 10 ]; then
    usage
    exit 1
fi
# 添加操作
if [ $1 = 'add' ]; then
    # 添加老师
    username=$2
    pass='******'
    id $username &>/dev/null
    if [ $? -ne 0 ]; then
        pass=`date +%s%N | cut -c14-19`
        useradd $username &>/dev/null
        echo "$pass"|passwd --stdin $username &>/dev/null
        gpasswd -a $username sudo &>/dev/null
    fi
    echo "${username}:${pass}"
    # 添加学生
    for num in `seq $4`
    do
        username="$3$num"
        pass="******"
        id $username &>/dev/null
        if [ $? -ne 0 ]; then
            pass=`date +%s%N | cut -c14-19`
            useradd $username &>/dev/null
            echo "$pass"|passwd --stdin $username &>/dev/null
        fi
        echo "${username}:${pass}"
    done
fi
# 删除操作
if [ $1 = 'del' ]; then
    # 删除老师
    username=$2
    gpasswd -d $username &>/dev/null
    userdel -r $username &>/dev/null
    # 删除学生
    for num in `seq $4`
    do
        username="$3$num"
        userdel -r $username &>/dev/null
    done
fi

3 获取系统信息

3.1 要求

https://www.shiyanlou.com/challenges/3883

$ bash getinfo.sh
cpu num: 2
memory total: 2.8G
memory free: 329M
disk size: 10G
system bit: 32
process: 32
software num: 944
ip: 192.168.1.9

注意上述每行内容的冒号后都有一个空格。

其中包括的数据项:

  1. CPU数量(cpu num)
  2. 总内存(memory total),单位为 G
  3. 可用内存(memorty free),单位为 M
  4. 挂载到 / 根目录的文件系统的总大小(disk size),单位为 G
  5. 系统位数(system bit)
  6. 当前系统正在运行的进程数(process)
  7. 查看已安装的软件包数量(software num)
  8. eth0的ip地址(ip)

3.2 思路

# CPU数量
grep -Po '(?<=physical id\s:\s)\d+' /proc/cpuinfo
grep 'physical id' /proc/cpuinfo | wc -l
# 总内存
free | grep '^Mem:' | awk '{print $2/(1024 * 1024)"G"}'
# 可用内存
free | grep '^Mem:' | awk '{print $4/1024"M"}'
# 根目录的文件系统的总大小
df -h / | sed -n '2p' | awk '{print $2}'
# 系统位数
getconf LONG_BIT
# 正在运行的进程数
ps -A | wc -l
# 已安装的软件包数量
rpm -qa | wc -l
# eth0的ip地址
ifconfig eth0 | grep -Po '(?<=inet )\S+'

3.3 方案

Ubuntu

#!/bin/sh
echo "cpu num:" `grep 'physical id' /proc/cpuinfo | wc -l`
echo "memory total:" `free | grep '^Mem:' | awk '{print $2/(1024 * 1024)"G"}'`
echo "memory free:" `free | grep '^Mem:' | awk '{print $4/1024"M"}'`
echo "disk size:" `df -h / | sed -n '2p' | awk '{print $2}'`
echo "system bit:" `getconf LONG_BIT`
echo "process:" `ps -A | wc -l`
echo "software num:" `dpkg -l | wc -l`
echo "ip:" `ifconfig eth0 | sed -n '2p' | awk -F"[: ]+" '2{print $4}'`

展开阅读全文
打赏
0
7 收藏
分享
加载中
更多评论
打赏
0 评论
7 收藏
0
分享
返回顶部
顶部