实验楼比赛第16期
1 备份日志
1.1 要求
作为系统管理员,小楼收到一个需求,需要每天备份系统当天的部分日志文件,日志备份的需求描述如下:
- 为 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/shtar -Pcf /home/shiyanlou/backup/`date +%F`.tar /var/log/dpkg.log /var/log/mysql.log /var/log/fontconfig.log# 说明-P参数:使用绝对路径
定时任务
crontab -e0 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 cronsudo cron start
排查问题
tail -f /var/log/crontail -f /var/spool/mail/root
2 批量创建删除用户和组
2.1 要求
小楼是一个系统管理员,需要为一个教室中的服务器添加一个老师和若干学生用户,手动添加太麻烦了,请你为他编写一个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 6teacher:901231stu1:271828stu2:928172stu3:******stu4:384712stu5:098273stu6:921098# 删除一个 teacher 用户和 stu1 到 stu6 6个学生用户$ bash test.sh del teacher stu 6
其中 stu3 六个星号代表这个用户先前已经被创建了,所以该命令执行的时候并不清楚该用户的密码。删除命令执行时如果某个用户不存在也不需要报错,直接执行删除其他用户。
2.2 思路
# 6位随机数密码date +%s%N | cut -c14-19
sudo权限
# Ubuntugpasswd -a username sudogpasswd -d username sudo# CentOSgpasswd -a username wheelgpasswd -d username wheel# 说明# CentOS如果设置后不生效,进入sudo文件(/etc/sudoers),把wheel的注释去了visudo%wheel ALL=(ALL) ALL
2.3 方案
userctr.sh
#!/bin/shusage() { #echo "Usage: $0" echo "parameter error"}# 参数判断# 4个参数if [ $# -ne 4 ]; then usage exit 1fi# 操作是add/delif [ $1 != "add" -a $1 != "del" ]; then usage exit 1fi# 老师姓名,小写字母if [ "`echo $2 | grep -P '^[a-z]+$'`" != $2 ]; then usage exit 1fi# 学生姓名前缀,小写字母if [ "`echo $3 | grep -P '^[a-z]+$'`" != $3 ]; then usage exit 1fi# 学生数量是整数expr $4 + 1 &>/dev/nullif [ $? -ne 0 ]; then usage exit 1fi# 学生数量范围 1-10if [ $4 -lt 1 -a $4 -gt 10 ]; then usage exit 1fi# 添加操作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}" donefi# 删除操作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 donefi
3 获取系统信息
3.1 要求
$ bash getinfo.shcpu num: 2memory total: 2.8Gmemory free: 329Mdisk size: 10Gsystem bit: 32process: 32software num: 944ip: 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/cpuinfogrep '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/shecho "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}'`