您的位置:首页 > 运维架构 > Linux

Linux笔记:Shell脚本,利用who命令和/etc/passwd用户文件夹,查看用户登录情况(ubuntu环境下)

2019-06-05 15:47 330 查看

简介:大学时,老师在一台linux服务器上为我们班每个人创建了一个普通用户,每个用户文件夹路径为/home/班级名/用户名+学号,然后要求做一个显示未登录学生名单的shell脚本,方便考勤,以下是一些思考。

我们知道Linux用户名相关信息保存在文件夹/etc/passwd(密码加密),组名相关信息保存在文件夹/etc/group,而密码则保存在/etc/shadow(需管理员权限查看)。接着上完整shell脚本代码。

#!/bin/bash
File1="login_student.txt"
File2="all_student.txt"
#将/etc/passwd里的总学生名单保存到"all_student.txt"。格式为:学号:姓名
`cat /etc/passwd|cut -d ":" -f 1,5|tail -n 53 > $File2`
#将登陆人数重定向到"login_student.txt"。格式为:学号,(ip地址)
`who|tr -s " "|tr " " ","|cut -d "," -f 1,5 > $File1`
#统计"all_student.txt"的总人员数。为下面的循环语句确定循环次数
all_lines=`wc -l $File2|cut -d " " -f 1`
login_lines=`wc -l $File1|cut -d " " -f 1`
human_num=0
for((Num=1;Num<=$all_lines;Num=$Num+1))
do
flag="False"
line=`sed -n ${Num},${Num}'p' $File2|cut -d ":" -f 1`
for((inNum=1;inNum<=$login_lines;inNum=$inNum+1))
do
inline=`sed -n ${inNum},${inNum}'p' $File1|cut -d "," -f 1`
if [ $line = $inline ]
then
flag="True"
fi
done
if [ $flag = "False" ]
then
name=`cat $File2|grep $line|cut -d ":" -f 2`
ip=`cat $File1|grep $inline|cut -d "," -f 2`
echo "当前未登录用户及ip地址:"${name}${ip}
human_num=$((human_num+1))
fi
done
echo "总共学生人数为(1-52号加一个53号测试用户)53人,有"${human_num}"个用户未登录Linux服务器!"

代码解惑:

  • 首先第3,4行反引号的作用是:把一个命令(或组合命令)括起来,把该命令的屏幕输出结果截获并当作一个字符串来使用,可以赋值给变量保存,此处只是在脚本中单纯执行管道+重定向命令输出需要的信息到两个文件(login_student.txt,all_student.txt)中。将登陆者信息(who命令)和/etc/passwd最后53行新添加的学生用户(tail命令)重定向到两个文本文件中保存好。
  • 接着all_lines和login_lines确定login_student.txt和all_student.txt文件的行数,即统计总学生用户人数和当前登录学生用户人数,便于分别确定下面双层循环的循环次数
  • 外层for循环的line(sed命令)变量从第一行到最后一行逐个取出all_student.txt的学生名单,内层for循环的inline(sed命令)变量从第一行到最后一行逐个取出login_student.txt的学生名单
  • 如果line变量在内层循环完整循环完一次后,与其相等的字符串inline,表示,匹配到登录学生,修改标志位flag为True。
  • 内层循环做完一次完整循环后,再用if语句判断标志位如果为False表示没有匹配到登录名单,打印输出(echo命令) 未登录学生名单
  • human_num将未登录学生名单计数,内外层循环结束后做一个汇总输出。

输出结果不显示了,涉及隐私。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐