实验目的
使学生熟悉一种简单的指定用户的监测方法,熟悉UNIX的基本SHELL程序设计方法和使用技巧,包括:
命令行参数检测
用户变量
while循环控制
暂停进程(sleep)
实验内容
编写一个用户监测程序usr_monitor, 其运行格式为:
usr_monitor username
其中username是用户指定的任意一个用户名。程序运行时首先列出当前系统中的已登录用户的名单,再检查指定用户是否已登录。如果已登录,则显示相应信息;如果未登录,则等待该用户登录,直到指定用户登录进入系统为止。
实验内容:shell程序设计思路
(1)根据变量$#的值检查命令行上是否有一个用户名,如果有则继续运行;如果没有或多于一个用户名则输出提示信息:Usage: usr_monitor username
(2)运行who命令,并将运行结果中的用户名字段截取下来,保存到一个用户变量中。
(3)echo命令显示该变量的值,即当前系统中的用户名单。
(4)判断用户名单中是否包含命令行上指定的用户,如果有则输出提示信息:user [username] is logon,并退出程序。
(5)如果用户名单中没有包含命令行上指定的用户,则输出提示信息:waiting user [username] …,光标停留在省略号后面。
(6)使用while循环,用sleep命令每隔5秒钟检查指定用户是否已登录系统。检测方法与步骤2相同。
(7)如果指定用户未登录,则一直等待下去;如果指定用户已登录,则在省略号后面接着输出提示信息: [username] is log on,退出循环,并结束程序。
实验内容:shell程序编写要求
上述命令仅作参考,可以自行确定需要采用的命令,只要程序能达到“实验要求”中指定的功能即可
需要调整程序格式,在程序头加上若干行程序功能注释,在程序的重要功能语句处加上简单注释。
参考代码:user_monitor.sh
if [ $# -ne 1 ] # 利用$#判断命令行有几个参数
then
echo "Usage: usr_monitor username" # 参数不对就报错
exit
fi
user_input=$1 # 将第一个参数赋给user_input
echo -e "You will monitor [$user_input]\n"
user=$(who)
username=`who |awk '{print $1}'` # 只截取登陆了的用户名
echo -e "Current user list is:\n$username\n"
compare=$(echo $username | grep "${user_input}") #获取username中与user_input相同的部分
while [ "$compare" == "" ]
do
echo "waiting user [$user_input] ..."
sleep 5
username=`who |awk '{print $1}'`
result=$(echo $username | grep "${user_input}")
done
echo "[$user_input] is log on"
程序要求达到的运行效果
1、命令行上未指定用户名时,程序给出错误提示,并退出
2、usr_monitor程序运行时,指定ubuntu用户名,程序显示当前已登录系统的用名单,等待指定的ubuntu用户的登录,当ubuntu登录系统时,程序给出提示信息,并退出。