实验shell编程
Posted bitguo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验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总体感觉十分有趣,也非常强大,在考完研之后会好好琢磨琢磨。
以上是关于实验shell编程的主要内容,如果未能解决你的问题,请参考以下文章