中国矿业大学LINUX实验报告.docx
《中国矿业大学LINUX实验报告.docx》由会员分享,可在线阅读,更多相关《中国矿业大学LINUX实验报告.docx(53页珍藏版)》请在冰豆网上搜索。
中国矿业大学LINUX实验报告
中国矿业大学计算机学院
2013级本科生课程报告
课程名称Linux操作系统
报告时间2016.11.10
学生姓名
学号
专业
任课教师王虎
任课教师评语
任课教师评语(①对课程基础理论的掌握;②对课程知识应用能力的评价;③对课程报告相关实验、作品、软件等成果的评价;④课程学习态度和上课纪律;⑤课程成果和报告工作量;⑥总体评价和成绩;⑦存在问题等):
成绩:
任课教师签字:
年月日
摘要
Linux作为现在的主流系统之一,开放性和可扩展性有目共睹,本报告从Linux的基础命令和基础操作延伸到Linux的权限设置,除此之外,还在已经有的编程基础上研学了Linux的Shell编程和c语言编程,并通过实践的方式亲身体会,基本上主要的命令都已给出实验的结果截图和详细解释,以增强对Linux的理解。
本报告共分为五章节,第一章节主要介绍和叙述了Linux的几个基本命令,并上手实践给出实践结果;第二章节主要介绍了Linux系统下的Shell编程,并尝试自己编写Shell脚本,并在Linux系统上运行;第三章节主要介绍了Linux的权限管理机制,包括基本权限和特殊权限的机制,并给出相关命令进行演示,相关截图都已展示在报告上;第四章节介绍了Linux系统下的c语言编程,在之前已有的编程基础上,更加深刻地理解c语言编程的核心,并且与Linux系统相结合,发挥更大的作用;第章节作为扩展章节,主要介绍了Linux的发送邮件服务器Postfix的安装和配置,并进行测试。
关键词:
Linux;Shell;权限管理;c语言;Postfix
1Linux命令
1.1建立目录命令
1.1.1命令介绍
建立目录命令:
mkdir–p[目录名]
#即会建立一个新的名为“目录名”的目录
在这里引入其他两个命令的介绍:
cd[目录名]打开一个名为“目录名”的目录;
ls列出当前目录下的文件。
1.1.2实验结果截图
首先我们用ls命令当前目录下的文件,然后用mkdir-pnew命令在家目录下建立一个名为“new”的目录;用mkdir–pnew2/a建立一个目录名为“new2”的目录下的目录名为“a”的目录,然后用ls命令再次列出当前目录下的文件,可以看到new目录和new2目录已经建立成功,然后用cdnew2命令打开new2目录,再使用ls命令列出new2目录下的文件,可以看到a目录也建立成功。
1.2删除目录命令
1.2.1命令介绍
rmdir[目录名]
#这个命令只能删除空目录。
rm–rf[文件或目录]
选项:
-r#删除目录
-f#强制
无论是不是空目录,都可以用这个命令删除。
1.2.2实验结果截图
这里我们使用1.1建立目录命令已经建好的两个目录,new目录和new2目录,new目录为空目录,new2目录下有个名为“a”的目录;则使用rmdirnew命令可以成功删除new目录,而当使用rmdirnew2命令删除new2目录时则失败,因为new2目录不是空目录,然后我们使用rm-rfnew2命令可以成功删除new2目录。
1.3文件搜索命令
1.3.1命令介绍
在这里介绍两个搜索命令。
一个是locate,一个是find。
locate文件名
#在后台数据库中按文件名搜索,搜索速度快。
updatedb
#更新数据库
在这里是在数据库中进行搜索,但是数据库不是实时更新的,如果要立即搜索新建的文件需要先用updatedb更新数据库,然后用locate文件名进行搜索。
find[搜索范围][搜索条件]
#依据搜索范围和搜索条件进行搜索文件
这个命令可以指定范围和搜索条件,确定更小的范围和更精确的搜索条件可以加快搜索效率[1]。
搜索条件有:
-name文件名#按照文件名来查找文件
-iname文件名#不区分大小写
-user文件所有者#按照所有者搜索
-group文件所属组#按照文件所属组来查找文件
-perm文件权限#按照文件权限来查找文件
-prune指定目录#不在当前指定目录中寻找
1.3.2实验结果截图
为了避免权限的问题,我们使用超级用户root来进行操作。
首先在家目录下建立两个新的目录:
new3目录和new4目录。
然后我们需要用updatedb来更新数据库,然后使用locatenew3来搜索new3的位置,系统马上就反应过来,并且给出new3的位置:
/home/new3,与我们之前建立的位置一致;然后我们使用find命令来寻找new3目录,可以发现,如果不指定查找条件的话,是无法进行查找的,然后我们使用-name搜索条件来按照文件名进行搜索,输入命令find-namenew3命令来查找new3目录,find命令的反应时间相比locate要长很多,但是当指定了目录/home后(find/home-namenew3)查找new3目录,反应时间大大缩短,所以指定更小的范围可以提高搜索的效率,Linux也是支持模糊查询的,我们使用“new*”来进行模糊查询,输入find/home-name“new*”,new3和new4目录都被查找到。
1.4压缩和解压缩命令
1.4.1命令介绍
这里介绍几个常用的压缩和解压缩命令[2]。
(1)gzip[选项][文件名]
#压缩成文件名为.gz的压缩文件
最简单的可以直接用gzip文件名来进行压缩;而如果希望压缩出最小的文件,则加一个-9选项,比如gzip-9[文件名]。
在这种情况下,压缩后的源文件是不会被保留的,如果要保存源文件,需要使用这样的格式,gzip-c源文件>压缩文件
这样源文件会被保留,gunzip是一样的用法,可以保留源文件。
gunzip[选项][文件名.gz]
#将.gz压缩文件解压
最简单的使用方法为:
gunzip文件名.gz即可进行解压缩。
gunzip甚至可以去解压缩其它压缩程序如Compress或ZIP压缩出来的文件,但不建议这样做。
(2)tar[选项][打包文件名][文件]
#打包为.tar的打包文件或解开
由于tar的选项很多这里不做太多介绍,可以自行查阅帮助文件,这里简单介绍常用的压缩和解压缩命令。
tarzxvf文件名.tar
#解压后缀名为tar的文件
tarczvf打包文件名.tar要打包的文件名
#打包文件
(3)compress[选项][文件名]
#压缩文件名为.Z的压缩文件
uncompress[选项][文件名.Z]
#将.Z压缩文件解压
(4)zip[选项][文件名.zip][文件名]
#打包并压缩成文件名为.zip的文件
unzip[选项][文件名.zip][文件名]
#将.zip压缩文件解压
(5)bzip2[选项][文件名]
#压缩成文件名为.bz2的压缩文件
bunzip2[选项][文件名.bz2]
#将.bz2压缩文件解压
1.4.2实验结果截图
这里我们在家目录下建立了一个abc.abc的文件,然后使用gzip-9abc.abc压缩这个文件,然后我们重新列出该目录下的文件,发现源文件已经被删除了,只留下了压缩后的文件:
abc.abc.gz,然后我们使用gunzipabc.abc.gz解压缩压缩包,成功之后,我们发现压缩包也已经被删除,只剩下解压缩后的文件。
如果我们使用-c选项并进行重输出操作,则可以保存源文件,并改变输出后的压缩包的名字,解压缩也是一样的原理,源文件也会被保存并改变输出文件的名字。
这里我们新建了一个名为“c.c”的文件在家目录下,然后用tarczvf/tmp/cl.tarc.c命令将该文件打包压缩并输出到tmp目录中,命名为cl.tar,然后我们进入tmp目录使用ls命令查看该目录下的文件,发现刚才的命令已经成功,然后我们使用tarzxvfcl.tar将cl.tar压缩包解压,解压后源文件c.c出现在tmp目录中。
由于其他压缩命令大同小异在这里不做过多演示。
1.5切换用户命令
1.5.1命令介绍
这里介绍切换用户的命令——su命令[3]。
su[-fmp][-ccommand][-sshell][--help][--version][-][USER[ARG]]
-f,–fast:
不必读启动文件(如csh.cshrc等),仅用于csh或tcsh两种Shell。
-l,–login:
加了这个参数之后,就好像是重新登陆一样,大部分环境变量(例如HOME、SHELL和USER等)都是以该使用者(USER)为主,并且工作目录也会改变。
如果没有指定USER,缺省情况是root。
-m,-p,–preserve-environment:
执行su时不改变环境变数。
-ccommand:
变更账号为USER的使用者,并执行指令(command)后再变回原来使用者。
–help显示说明文件。
–version显示版本资讯。
USER:
欲变更的使用者账号。
ARG:
传入新的Shell参数。
在这里简单介绍一个指令:
su[用户名]即可切换到指定用户名,但必须输入正确命令后才可以,除此之外,当执行一些必须系统管理员才能够执行的命令时,如1.3中介绍的updatedb更新数据库命令,可以使用sudo命令名称来实现命令。
1.5.2实验结果截图
我们已经在root用户下,如果我们使用su命令切换到一个不存在的用户ming,则会提示该用户不存在,当su命令跟上一个存在的用户名时,则会直接切换到该用户下,但从普通用户mingsha切换到超级用户root下时,需要输入密码,密码正确才可以切换成功。
1.6编辑文件命令
1.6.1命令介绍
在这里只简单介绍几个常用的vi命令。
vifilename
#编辑一个新文件或编辑一个已经存在的文件
#进入vi后光标停留在文件的第一行行首
vi+nfilename
#进入vi后光标位置为第n行
vi+filename
#进入vi后光标位置为文件尾行
关于vi的退出:
先按键盘上的esc键,然后输入:
即可进入底行模式,输入wq即可保存退出,而只输入w会保存但不会退出,只输入q不保存文件,退出vi,输入wfile会修改另外保存到file中,不退出vi。
1.6.2实验结果截图
首先我们在home目录下新建了一个a.a文件,然后输入via.a进行编辑。
编辑界面如上图所示,一开始是什么都没有的,因为是个空文件,
我们输入HelloWorld并按esc键后输入:
wq保存退出,之后会回到一开始的命令行界面。
然后我们使用cata.a命令显示a.a这个文件的内容。
发现与我们刚才输入的内容是一致的,然后我们再次打开a.a这个文件,
修改内容后另存到b.a文件中,然后使用
退出(使用q会报错,提示没有文件内容被改变请使用q!
)。
然后我们使用ls查看目录下的文件,发现多了一个b.a文件即我们刚才另存为的那个文件,使用cata.a查看文件发现文件内容没有改变,使用catb.a查看文件,发现文件内容与我们刚才保存的一致。
1.7总结与体会
作为对Linux系统的初次接触,还是收获很多的,从一开始的VMware虚拟中CentOS7.0的安装到后面的慢慢试验,也是经历了一个比较漫长的过程,好在在这个过程中,学会了Linux操作系统的基本操作,学会用最基本的“命令行语言”与系统进行对话而不仅限于大众使用的图形界面,对我个人而言,也是一个不小的进步。
2Shell编程
2.1Shell简介
Linux的Shell是用户和系统内核之间的接口程序,它在用户和系统之间架起了一座桥梁,使用户可以方便地实用操作系统[4]。
Shell是一种具备特殊功能的程序,它是介于使用者和UNIX/Linux操作系统核心程序(kernel)间的一个接口。
Shell是命令解释器,同时也是高级编程语言。
Shell作为命令解释器,它通过提示符响应并处理用户在命令行界面上输入的命令;而作为一门编程语言,它们将处理存放在Shell脚本文件中的命令。
如其它编程语言一样,Shell也有变量和控制流命令,可以编写Shell脚本来执行用户的指令,还可以编写执行用户指令的Shell脚本,这些脚本可以是包含复杂命令的单行脚本,也可以是更长的脚本。
长的复杂的Shell脚本不仅仅运行其他程序,其本身就是程序[5]。
2.2Shell脚本实例
2.2.1Shell脚本的编写和执行
简单的步骤如下:
(1)使用“touchShell脚本名字.sh”生成Shell脚本文件。
(2)使用“viShell脚本名字.sh”打开Shell脚本文件。
(3)输入Shell脚本内容后保存退出。
(4)Shell脚本有两种运行方式:
①直接“bashShell脚本名字.sh”即可运行;②为Shell脚本提供执行权限:
chmod755Shell脚本名字.sh,即所有者有读、写、执行的权限,所属组和其他人有读和执行的权限,然后./Shell脚本名字.sh即可运行。
2.2.2简单的随机加法题目生成器
(1)源代码
#!
/bin/bash
a=$RANDOM#生成两个初始随机数
b=$RANDOM#RANDOM的范围是[0,32767]
c=0#操作码变量
a=$(expr$a%100)#使随机数的范围在0~99以内
b=$(expr$b%100)
echo"Pleaseinputrequestcode(ifitisnotanumberthisshellwillend):
"#提示信息
readc#读入操作码
while[["$c"=~^[1-9]+$]]#操作码是数字时进入循环体
do
answer=$(expr$a+$b)#计算a+b的值
echo-n$a#并输出在屏幕上
echo-n"+"
echo-n$b
echo"=?
"
echo"Pleaseinputyouranswer:
"#输出提示信息
readuser_answer#读入用户答案
until[$user_answer-eq$answer]#如果用户答案与刚才计算的a+b的值
do#不相等则提示错误并要求重新输入
echo-e"YouranswerisFalse!
\nPleaseinputyouranswer:
"
readuser_answer#重新读入用户答案
done#echo-e表示读到其中的\n时换行
echo-e"YouranswerisRight!
\nPleaseinputrequestcode:
"
readc#重新读入操作码
if[["$c"=~^[1-9]+$]]#当操作码是数字时重置加法器的两个
then#数
a=$(expr$RANDOM%100)
b=$(expr$RANDOM%100)
fi
done
###########################################################
#代码说明:
#输入操作码为任意数字时可以继续运行程序,
#当操作码不是数字时终止程序;
#会生成两个0~99的数要求进行加法运算
#当提示“Pleaseinputyouranswer:
”时请输入数字
#若输入的结果正确,则会提示再次输入操作码
#当操作码是数字时,会重新生成两个新的数
#若输入的结果错误,会提示错误并要求重新输入直到输入正确为止
(2)实验结果截图
我们使用bashtest1.sh运行这个Shell脚本文件,一开始生成了两个数,要求输入答案,而我们一开始输入的答案是错误的,这时候题目要求重新输入,如果输入还是错的,则被要求继续重新输入,直到输入正确时,会提示正确,并要求再次输入操作码,我们在这里再次输入数字,则程序生成了两个新的随机数要求我们进行计算,这时我们直接输入正确答案,答案通过则要求重新输入操作码,我们输入非数字的字符串,则程序退出。
2.2.3用户信息显示器
(1)源代码
#!
/bin/bash
user=`whoami`#反引号里面存的是系统命令,则将系统
case$userin#命令后的信息存入user变量
root)#case进行多分支选择,已知该系统上有
echo"Helloroot!
";;#两个用户root和mingsha,不同用户不
mingsha)#同的提示信息
echo"Hellomingsha!
";;
*)
echo"hello$user,welcome!
"#若该用户不在我们设定好的列表中,则
;;#直接打印该用户的姓名
esac
echo"Currenttime:
`date`"#利用反引号+系统命令输出当前时间
echo"Yourmachinename:
`uname-n`"
#输出当前的机器名
echo"ThenameofyourOperationSystem:
`uname-s`"
#输出当前操作系统的名字
echo"TheversionofyourOperationSystem:
`uname-r`"
#输出当前操作系统的版本
echo-e"Allprocessesrunningbyyou:
\n`ps-u$user`"
#输出当前用户运行的所有进程
echo"GoodBye!
"#输出提示结束信息
(2)实验结果截图
由于进程太多,在截图中不能一一列出,在这里我们从root用户切换到mingsha用户,可以看到信息都被完整、正确地显示出来了。
2.2.4批量新建/删除目录脚本
(1)源代码
#!
/bin/bash
cd/home/test3#事前需要打开要建立目录的路径
requestcode=0;#初始化操作码
echo"Pleaseinputrequestcode:
"#提示输入操作码
readrequestcode;#读入操作码
if[[requestcode-eq1]]#若操作码为1,则新建目录
then
max=0
echo"Pleaseinputmax:
"#输入需要新建的目录的数量
readmax
for((i=1;i<=max;i=i+1))#从1循环到数量值
do
mkdir-p/home/test3/user$i
#使用mkdir命令新建目录
chmodo-xuser$i#将目录权限设置为rwxr-xr--
done
else[[requestcode-eq2]]#如果操作码为2
rm-rf/home/test3/*#删除该目录下的所有目录
fi
###########################################################
#代码说明:
#操作目录是/home/test3
#操作码为1时新建目录,操作码为2时删除目录
#新建目录会要求输入max,即需要新建多少个目录,请输入数字
#新建的目录权限均为rwxr-xr-
#命令执行完一次后,Shell脚本退出
#删除目录时会删除/home/test3下所有目录
(2)实验结果截图
如图所示,我们一开始显示/home/test3目录下的所有内容,发现为空,然后我们为test3.sh赋权限,并执行,一开始输入1,则我们输入max为8,然后进入/home/test3目录,发现已经有8个目录生成,并且权限为rwxr-xr--,然后我们再次执行test3.sh,则发现/home/test3目录下的目录都已经被完全删除。
2.3总结与体会
这是我第一次接触Shell脚本,也是我第一次尝试去编写Shell脚本并执行它,通过Shell脚本的编程,本人更进一步地熟悉了Linux系统的操作,并将命令在Shell脚本中体现,本着人性化的想法,更加智能、便捷地编写程序,方便用户。
总体上来说,在前面已经学习了多门语言的基础上,掌握Shell脚本的编程并不难,如果可以长期练习和提高,应该可以得心应手。
3Linux权限管理
3.1相关权限简介
3.1.1基本权限
Linux系统中的每个文件和目录都有访问许可权限,用来确定谁能通过何种方式对文件和目录进行访问和操作。
文件或目录的访问权限分为只读、只写和可执行三种[6]。
有三种不同类型的用户可对文件或目录进行访问:
文件所有者、同组用户、其他用户。
所有者一般是文件的创建者,所有者能允许同组用户有权访问文件,还能将文件的访问权限赋予系统中的其他用户。
在这种情况下,系统中每一位用户都能访问该用户拥有的文件或目录[6]。
每一个文件或目录的访问权限都有三组,每组用三位表示,分别文件属主的读、写和执行权限;和属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限[6]。
举例来说,
drwxr-xr--
这10个字符确定不同用户能对文件干什么:
第一个字符代表文件(-)、目录(d)、链接(l);其余字符每3个一组即(rwx),分别代表读(r)、写(w)、执行(x)。
其中,这10个字符,代表这是个目录(d)。
而这个目录对于文件属主来说是可读、可写、可执行(rwx)的;对于同组的用户来说,是可读和可执行(r-x);对于其他用户来说,是可读(r)的。
(换算成数字为r--4;w--2;x--1)
而rwx这三个权限对于文件和目录的作用是不同的,其中:
(1)对于文件而言:
r为读取文件内容(catmoreheadtail);w为编辑、新增、修改文件内容,但是不能够删除这个文件(viecho);x代表可执行这个文件。
(2)对于目录而言:
r为可以查询目录下文件名(ls);w为具有修改目录结构的权限,如新建、删除、重命名、剪切文件或目录(touchrmmvcp);x为可以进入目录(cd)。
对文件来讲,最高权限是x;对目录来讲,最高权限是w。
关于文件的默认权限:
用666减去umask值即可得到默认权限。
对于目录的默认权限:
用777减去umask值即可得到默认权限。
3.1.2特殊权限
(1)ACL权限
ACL是AccessControlList的缩写,主要目的是在提供传统的owner、group、others的r、w、x权限之外的局部权限设定。
ACL可以针对单个用户,单个文件或目录来进行r、w、x的权限设定,特别适用于需要特殊权限的使用情况[7]。
ACL主要针对用户(user)、用户组(group)以及掩码(mask)方面来控制权限[7]。
简单讲,ACL可以设置特定用户或用户组对于一个文件/目录的操作权限[7]。
(2)sudo权限
sudo通过更严谨的管理,为用户分配可通过root权限运行某些特定的命令或软件,避免直接将root用户账号的密码公开给普通用户。
sudo的操作对象是系统命令。
(3)文件特殊权限
s或S(SUID,SetSUID):
可执行的文件搭配这个权限,便能得到特权,任意存取该文件的所有者能使用的全部系统资源。
SetUID权限只在该程序执行过程中有效,也就是说身份改变只在该程序执行过程中有效。
s或S(SGID,SetGID