实验三、shell编程

一、实验内容

1. 练习 shell 中命令历史、别名、特殊字符用法(第 4 章 4.2 节~4.5 节)

2.  shell 命令应用练习(具体见实验步骤)

3. 编写一个 shell 脚本,使用 4 种方式分别执行(具体见实验步骤)

4. 结合个人学习进度条,选择在 linux 环境下进行的新尝试和新探索

二、实验步骤

1.练习shell中命令历史,别名,特殊字符用法。

2.shell命令应用练习

(1)通过帮助信息查看,简述以下文件的用途

① /etc/passwd  (提示:通过 man 5 passwd 查看此文件描述说明)

② /etc/shadow (提示:通过 man 5 shadow 查看此文件描述说明)

③ /etc/group  (提示:通过 man 5 group 查看此文件描述说明)

④ /etc/gshadow (提示:通过 man 5 gshadow 查看此文件描述说明)   

1)/etc/passwd文件描述

/etc/passwd中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:
  用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

用户名(login_name):是代表用户账号的字符串。

口令(passwd):一些系统中,存放着加密后的用户口令字。

用户标识号(UID):是一个整数,系统内部用它来标识用户。

组标识号(GID):字段记录的是用户所属的用户组。它对应着/etc/group文件中的一条记录。

注释性描述(users):字段记录着用户的一些个人情况,例如用户的真实姓名、电话、地址等。

主目录(home_directory):也就是用户的起始工作目录,它是用户在登录到系统之后所处的目录。

登录Shell(Shell):用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。

2)/etc/shadow文件描述

/etc/shadow文件格式与/etc/passwd文件格式类似,同样由若干个字段组成,字段之间用“:”隔开。

文件中字段主要含义为:

登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

“登录名”是与/etc/passwd文件中的登录名相一致的用户账号

“口令”字段存放的是加密后的用户口令字:

“最后一次修改时间”表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样。

“最小时间间隔”指的是两次修改口令之间所需的最小天数。

“最大时间间隔”指的是口令保持有效的最大天数。

“警告时间”字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。

“不活动时间”表示的是用户没有登录活动但账号仍能保持有效的最大天数。

“失效时间”字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。

3)/etc/group

/etc/group文件与/etc/passwd和/etc/shadow文件都是有关于系统管理员对用户和用户组管理时相关的文件。linux /etc/group文件是有关于系统管理员对用户和用户组管理的文件,linux用户组的所有信息都存放在/etc/group文件中。具有某种共同特征的用户集合起来就是用户组(Group)。用户组(Group)配置文件主要有 /etc/group和/etc/gshadow,其中/etc/gshadow是/etc/group的加密信息文件。

用户组的所有信息都存放在/etc/group文件中。此文件的格式是由冒号(:)隔开若干个字段,这些字段具体如下:

    组名:口令:组标识号:组内用户列表

 组名:

    组名是用户组的名称,由字母或数字构成。与/etc/passwd中的登录名一样,组名不应重复。

    口令:

    口令字段存放的是用户组加密后的口令字。一般Linux系统的用户组都没有口令,即这个字段一般为空,或者是*。

    组标识号:

    组标识号与用户标识号类似,也是一个整数,被系统内部用来标识组。别称GID.

    组内用户列表:

    是属于这个组的所有用户的列表,不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。

4)/etc/gshadow

/etc/gshadow     
 /etc/gshadow是/etc/group的加密资讯文件,比如用户组(Group)管理密码就是存放在这个文件。
/etc/gshadow和/etc/group是互补的两个文件;对于大型服务器,针对很多用户和组,定制一些关系结构比较复杂的权限模型,设置用户组密码是极有必要的。

组名:口令:组管理者:组内用户列表  
1) 组名: 是用户组的名称,由字母或数字构成。  
2) 口令:用户组密码,这个段可以是空的或!,如果是空的或有!,表示没有密码 
3) 组管理者:这个字段也可为空,如果有多个用户组管理者,用,号分割 
4) 组内用户列表:如果有多个成员,用,号分割 ;

(2) 依次输入如下命令,观察运行结果。结合 man id 查看到的帮助信息,指出每一条 命令功能

① id     显示当前用户id

② id -u 显示用户id

③ id -u root 显示root的id

④ id -u kyo   显示用户kyo的id

(3)在 shell 命令终端依次输入以下命令,观察执行结果,理解每条命令实现的具体功

① which python

whereis python

locate python

find /usr/bin -name python (说明: which, whereis, locate, find 都具有检索的功能,结合执行结果,查找帮 助信息,总结其区别)

which       查看可执行文件的位置

which是通过 PATH环境变量到该路径内查找可执行文件,所以基本的功能是寻找可执行文件
whereis    查看文件的位置

和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中。当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通 过遍历硬盘来查找,效率自然会很高。
但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。
locate       配 合数据库查看文件位置
find          实际搜寻硬盘查询文件名称

find是在硬盘上遍历查 找,因此非常消耗硬盘的资源,而且效率也非常低

② grep  -n  -E  'root|kyo|^user*'  /etc/passwd  (提示:扩展正则表达式)   

grep  -n  -E  ' [[:digit:]] '  /etc/passwd

grep  -n  -E  ' [[:alpha:]] '  /etc/passwd

grep  -n  '[0-9]\{4,\}'  /etc/group (提示: 在用户组文件中查找 GID 是 4 位数 及以上的组信息记录)

grep 默认仅支持基础正则表达式,如果要使用扩展性正则表达式,可以使用 grep - E。grep -E 与 egrep 相当于命令别名关系。

[:digit:] 匹配任意一个数字字符

[:alpha:] 匹配任意一个字母字符(包括大小写字母)

 (4)根据要求写出相应的 shell 命令

① 在目录/usr/include 下搜索文件 signal.h 是否存在 (提示: find 命令)

使用 find  /udr/include -name signal.h

② 在/usr/include 目录下的所有文件中查找包含 BUFSIZ 的行,并显示所在行号。 要求:屏幕上只显示查找到的结果,过滤错误信息。 (提示: ① 利用 grep 和通配符*; ②利用错误信息重定向和特殊设备文件/dev/null)
 ③ 在用户名密码文件/etc/passwd 中查找登录 shell 为 bash 的用户信息记录,并显 示行号(提示:使用 grep 和正则表达式中的$)

④ 从/etc/group 文件中截取第 1 列(组名)和第 3 列(组 id),并按照组 id 号的数 值大小由小到大排序。(提示:综合使用 cut, 管道线及 sort 命令)

3. 编写一个 shell 脚本,使用 4 种方式(参见第 4 章教材/课件)分别执行。

 

(2)练习 2 第 1 步,使用 vi/vim/gedit 或其它编辑器,编写 shell 脚本 ex2.sh,内容如下:

 

总结与体会

这次实验非常难受,我的虚拟机上的ubuntu不知道为什么很多实验中的命令都无法执行,很多东西也无法安装如gimp,就没进行那部分实验。等有时间会解决一下这个问题。shell总体感觉十分有趣,也非常强大,在考完研之后会好好琢磨琢磨。

猜你喜欢

转载自www.cnblogs.com/BitGuo/p/8970014.html
今日推荐