一、实验目的:
使中学生熟悉一种简单的指定用户的检测方式,熟悉UNIX的基本SHELL程序设计方式和使用方法,包括:
(1)命令行参数测量
(2)用户变量
(3)while循环控制
(4)暂停进程(sleep)
二、实验原理:
(1)SHELL程序的主要用途
在SHELL程序中不仅仅可以使用命令的集合,并且可以安排手动化处理过程,因而可以通过编撰SHELL程序使大量的任务执行实现手动化。SHELL比较擅长完成系统管理任务linux系统的安装与调试,尤其适宜完成这些易用性、可维护性和便携性比执行效率更优先的任务。我们可以使用任意一种文本编辑器完成SHELL程序的编撰,在SHELL编程中要遵守一定的程序设计规则和变量使用规则。
(2)SHELL程序的执行与调试
在bash的SHELL程序设计中,程序必须以下边的行开始:
#!/bin/bash
这儿符号#!拿来告诉系统linux 常用命令,前面给出的参数是拿来执行该文件的程序。
借助vi,gedit等文本编辑器编撰Shell脚本的格式是固定的,如下:
#!/bin/sh
#comments
Yourcommandsgohere
filename.sh,文件名后缀sh表明这是一个Bash脚本文件
当编辑完一个SHELL脚本后,要使该脚本才能执行,还必须使该脚本文件具有可执行权。须要执行命令:
chmod+xfilename
在shell程序中,以#开头到一个行结束的短语表示注释信息。建议你们在编撰shell程序时养成添加注释的习惯,由于注释除了能给其他须要熟悉该程序的人以帮助,也能给出脚本编撰者设计原理的提示。
进行shell程序设计时,必将会用到变量。Shell编程中使用的变量有自己的特色,即所有的变量都是由字符串组成的,并且对变量无须进行申明,可直接进行变量形参操作。
(3)SHELL程序注意事项
SHELL编程中不仅须要遵循一些规则外,还有一些注意事项linux桌面,假若做得好会对编程有推动,这儿列举几条仅供你们参考,更多的内容还需自己通过编程积累。
由于LINUX中命令使用的是大写字符,因而在SHELL编程中可以使用小写字符表示变量以示区别。
在SHELL句子中加入必要的注释,便于之后阅读和维护,注释以”#”开头。
对SHELL变量进行数字运算时,使用加法符号”*”时,要用通配符符””进行通配符。事例:multiplication=`expr$j*$j`
因为SHELL对命令中多余的空格不进行任何处理,因而程序员可以借助这一特点调整程序缩进格式,达到提高程序可读性的疗效。
在对函数命名时最好能使用有含意且容易理解的名子,虽然函数名才能比较确切地抒发函数所完成的任务。同时建议对于较大的程序要完善函数命名和变量命名对照表。
假如一行未完成,可以在行尾加上“这个符号表明下一行与此行会合并为同一行。
(4)SHELL简单调试
最简单的调试命令其实是使用echo命令。可以使用echo在任何怀疑出错的地方复印任何变量值。另外还可以借助Bash中提供的选项进行检测
-n,读一遍脚本中的命令但不执行,用于检测脚本中的句型错误。
-v,一边执行脚本,一边将执行过的脚本命令复印到标准输出。
-x,提供跟踪执行信息,将执行的每一条命令和结果依次复印下来。该选项会显示刚才执行的命令及参数。用户可以通过set命令打开-x选项或在启动Shell使用-x选项将Shell设置成跟踪模式。
使用这种选项有三种方式(注意:防止几种调试选项混用)
1.在命令行提供参数:$sh-xscript.sh
2.脚本开头提供参数:#!/bin/sh-x
3.在脚本中用set命令启用or禁用参数:其中set-x表示启用,set+x表示禁用。
(4)Sh和bash的区别
Linux系统中的/bin/sh本是bash的符号链接,鉴于bash过分复杂,有人把bash从NetBSD移植到Linux并改名为dash,并建议将/bin/sh指向它,以获得更快的脚本执行速率。DashShell比BashShell小的多,符合POSIX标准。
由于bash是sh的提高版本,在我们平时实地操作的时侯假如sh这个命令不灵了我们应该使用bash。
(5)用户切换操作
1.sudosu//切换到root权限(但不是root用户)
2.addusertongxue1降低一个朋友1
3.logintongxue1登陆朋友1
4这个时侯使用who命令来查看都会发觉多了一个登陆帐户tongxue1了
三、实验内容:
编撰一个用户检测程序usr_monitor,其运行格式为:
usr_monitorusername
其中username是用户指定的任意一个用户名。
程序运行时首先列举当前系统中的已登陆用户的名单,再检测指定用户是否已登陆。倘若已登陆,则显示相应信息;若果未登陆,则等待该用户登入,直至指定用户登入步入系统为止。具体步骤如下所示:
(1)按照变量$#的值检测命令行上是否有一个用户名,假如有则继续运行;假如没有或少于一个用户名则输出提示信息:
Usage:usr_monitorusername
(2)运行who命令,并将运行结果中的用户名子段截取出来,保存到一个用户变量中。
(3)echo命令显示该变量的值linux系统的安装与调试,即当前系统中的用户名单。
(4)判定用户名单中是否包含命令行上指定的用户,假如有则输出提示信息:user[username]islogon,并退出程序。
(5)假如用户名单中没有包含命令行上指定的用户,则输出提示信息:waitinguser[username]…,光标逗留在省略号旁边。
(6)使用while循环,用sleep命令每隔5秒钟检测指定用户是否已登陆系统。检查方式与步骤2相同。
(7)假如指定用户未登入,则仍然等待下去;假如指定用户已登陆,则在省略号旁边接着输出提示信息:[username]islogon,退出循环,并结束程序。
参考代码如下:
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: usr_monitor username"
exit 1
fi
username=$1
users=$(who | awk '{print $1}')
echo "Current logged-in users:"
echo "$users"
while true; do
users=$(who | awk '{print $1}')
if echo "$users" | grep -w "$username" > /dev/null; then
echo "User [$username] is logged on"
break
else
echo "Waiting for user [$username] ..."
sleep 5
fi
done
echo "User [$username] is logged on. Exiting."