实验楼比赛第16期
https://www.shiyanlou.com/contests/lou16/challenges
1 备份日志
1.1 要求
https://www.shiyanlou.com/challenges/3881
作为系统管理员,小楼收到一个需求,需要每天备份系统当天的部分日志文件,日志备份的需求描述如下:
- 为 shiyanlou 用户添加计划任务
- 每天凌晨2点的时候定时打包
/var/log
下的dpkg.log
,mysql.log
,fontconfig.log
三个文件到/home/shiyanlou/backup/
目录 - 命名格式为
年-月-日.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~10,若超过10或不为正整数,则报错打印
parameter error
- 学生名前缀为字符串,只允许包含小写字母,否则报错打印
parameter error
,前缀后面跟数字序列 - 每个用户默认使用
zsh
,教师用户默认具备 sudo 权限 - 每个用户设置一个随机6位数字密码,在添加命令执行后并将用户名和对应的密码输出
- 如果某个用户名已经存在,则默认不需要创建该用户,输出时密码显示为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
注意上述每行内容的冒号后都有一个空格。
其中包括的数据项:
- CPU数量(cpu num)
- 总内存(memory total),单位为 G
- 可用内存(memorty free),单位为 M
- 挂载到
/
根目录的文件系统的总大小(disk size),单位为 G - 系统位数(system bit)
- 当前系统正在运行的进程数(process)
- 查看已安装的软件包数量(software num)
- 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}'`