实验一 Linux系统简介
Linux和windows、Mac OS一样是一种操作系统。最早流行起来的操作系统是UNIX,但由于其过度商业化,价格昂贵,因此在校园里人们大多选择MINIX。1991年,Linux之父Linus Torvalds从MINIX入手,计划开发一个性能更好的操作系统。他第一次发行的版本吸引了很多黑客,这使它很快具有了一些吸引人的特性。 Linux本身只是操作系统的内核,它没有自己去开发应用程序,而是使用已有的*软件,这减少了搭建开发环境花费的工作量,Linux中许多重要的软件都来自于*软件基金GNU项目。
Linux发展到今天已经成为了具有免费、稳定、安全、资源占用少、定制性高、具有多种可选择图形用户界面的优秀系统。因此尽管Linux没有特定的支持厂商,缺少对游戏娱乐和专业软件的支持,但仍然在世界范围内受到开发人员的广泛欢迎。Linux现在拥有Debian、Ubuntu、CentOS等多个发行版。
实验二 基本概念及操作
Linux桌面环境
Linux本身是没有图形界面的,我们看到的图形界面实际上是运行在 Linux上的一套软件,这些实现了客户端功能的桌面环境有KDE,GNOME,XFCE,LXDE,用户可以根据自己的喜好选择不同的桌面环境,定制自己的桌面。实验楼目前使用XFCE桌面环境。
Linux终端
概念
我们与Linux系统的交互通过一个叫Shell的中间程序完成,在图形界面下Linux系统还为我们提供了一个叫终端模拟器的程序----Terminal。终端本质上对应着Linux上的/dev/tty设备,Linux的多用户登录实际上就是通过不同的/dev/tty设备完成。Linux默认提供6个Terminal。
Shell
对应于Linux内核,shell是linux系统提供给我们的“壳”,它之所以被称作shell是因为它隐藏了操作系统的底层细节。Shell既是用户交互的界面,也是控制系统的脚本语言,在Linux中常见的shell有bash、zsh、ksh、csh等,Ubuntu终端默认使用的是bash,实验楼中的终端则使用zsh。
命令行操作初体验
创建空文件、查看目录
运用通配符批量操作
在使用终端进行交互的过程中,会有命令打起来麻烦,容易打错,终端用起来很累的感觉,熟练使用快捷键可以大大提高终端的使用效率,linux下的快捷键如tab
补全命令、目录、文件名等都很好用,详细可以参考Linux快捷键大全。
作业
实验三 用户及文件权限管理
Linux用户管理
Linux是可以多用户登录的,他们共享一部分主机资源,也有自己的用户空间。尽管他们的文件都是放在同一个物理磁盘上,但由于Linux的用户管理和权限控制让用户看起来有属于自己的空间。
查看用户
输出的第一列表示当前伪终端用户的用户名,第二列pts/0
中的pts
表示伪终端,0
表示伪终端序号。
创建用户
在Linux系统中,root账户拥有着最高的权利,可以新建/添加用户。我们一般登录都是以普通用户的身份登录,要创建用户需要root权限,这需要用到sudo
命令。要使用这个命令需要两个条件:
- 知道当前用户的登录密码
- 当前用户在sudo组中
su <user>
可以切换到用户user;sudo <cmd>
可以以root权限运行命令cmd,这需要当前用户属于sudo组,且需要当前用户的密码;su -<user>
也可以切换用户,并且会把环境变量改为目标用户的环境变量。
新建用户、查看用户目录、切换用户
用户组
Linux中每个用户都属于一个用户组,一个用户可以属于多个用户组,同一用户组中的用户可以共享一部分特定的资源,当创建一个新用户时会同时创建一个同名的用户组,查看用户属于那个用户组可以用groups
命令或者查看/etc/group
文件。
查看用户组
删除用户
文件权限
文件权限就是文件的访问控制权限,即哪些用户和组群可以访问文件及可执行什么样的操作。
查看文件权限
使用长格式列出文件ls -l
可以看到文件的权限。其中r
表示读权限,w
表示写权限,x
表示执行权限。
命令ls
还可以添加其他的参数实现更多的功能,如下
变更文件所有者
chown
命令可以变更文件的所有者,如下
修改文件权限
文件权限修改使用chmod
命令。文件权限可以用二进制多项式表示,也可以用加减赋值的方法表示。对于二进制表示法,按照rwx的顺序,对应的值分别为4、2、1,即如果一个文件对某用户有rw权限,则值就是6。如下所示:
作业
添加一个用户loutest
,使用sudo
创建文件/opt/forloutest
,设置用户loutest
可以读写。
思考
命令chmod
后接一组数字——一般是三位——表示对应用户的权限,那么哪一位数字对应哪些用户呢?经查证和实验,第一位数字表示文件所有者权限,第二位表示与文件所有者同组的用户的权限,第三个数字表示其他用户组的权限。对于四位数字的情况,相当于在原来三位之前再加一位,这一位的用法详见详解。
实验四 Linux目录结构及文件基本操作
Linux目录结构
Linux目录看起来和windows相似,但实际上实现机制完全不同。Windows以存储介质为基础实现文件管理,Linux则是以树形目录的形式来构建整个系统。
FHS标准
Linux的目录结构是规定好的,FHS(Filesystem Hierarchy Standard)定义了两层规范:
-
/
目录下应该存放什么文件数据。 -
/usr
和/var
这两个目录的子目录应该放什么文件数据。详见FHS2.3标准文档
目录路径
使用cd
命令可以切换目录,在linux里用.
表示当前目录,用..
表示上一级目录,用-
表示上一次所在目录,用~
表示当前用户home目录。
路径分为相对路径和绝对路径,绝对路径可以理解为完整路径,相对路径则是相对于当前目录的路径。使用pwd
命令可以获得当前目录的绝对路径。
Linux文件的基本操作
新建文件、目录
复制文件、目录
删除文件、目录
移动、重命名、查看等
查看、编辑文件
vim
是一个强大的文件编辑器,Linux下还有一些其他的文件编辑器都很好用。
作业
批量建立并删除文件
环境变量与文件查找
变量
变量准确的说是Shell变量,变量的作用域即变量的有效范围(比如一个函数中、一个源文件中或者全局范围),在该范围内只能有一个同名变量。一旦离开则该变量无效,如同不存在这个变量一般。
Shell中创建变量
环境变量
通常我们会涉及到的变量类型有三种:
- 当前 Shell 进程私有用户自定义变量,如上面我们创建的 tmp 变量,只在当前 Shell 中有效。
- Shell 本身内建的变量。
- 从自定义变量导出的环境变量。
可以简单地理解为在当前进程的子进程有效则为环境变量,否则不是。
也有三个与上述三种环境变量相关的命令:set
,env
,export
。这三个命令很相似,都是用于打印环境变量信息,却别在于打印的变量类型不同。
可以直观的使用vimdiff
工具比较他们的差别:
命令的查找路径与顺序
Shell执行用户输入的命令是通过环境变量PATH
来搜索的,将自己的程序路径加入到PATH
中,再运行自己的程序使就不需要输入完整路径了。
通过source
命令可以让自己的环境变量立即生效
搜索文件
与搜索相关的常用命令有whereis
、which
、find
、locate
。whereis
搜索简单快速,locate
搜索快而全,which
小而精,find
精而细。如图。
作业
找出/etc
目录下所有以.list
结尾的文件。
挑战一 寻找文件
寻找在/etc
目录下的sources.list
文件并修改文件权限为只有自己可以访问。
思考
可以看到本次挑战中修改权限时犯过不少次错误,因为对命令中的参数对应哪些用户还不够熟悉,可见要想高效的的使用Linux需要很多的练习。
文件打包与解压缩
概念
文件压缩的格式有很多,但在Linux下掌握zip
,tar
即可。
实战
zip
压缩和unzip
解压缩
废话不多说直接看操作。
tar
打包工具
tar
原本是一个打包工具,但在Linux上同时还实现了对7z、 bzip2等压缩工具的支持,只是需要多加几个参数,非常方便。
作业
创建test
文件,分别用zip和tar压缩并解压到用户根目录
实验七 文件系统操作与磁盘管理
基本操作
查看磁盘和目录的容量
因为在实验楼的字符界面对汉字支持有问题,所以文中出现一些“印章”请谅解。df
命令
du
命令
简单磁盘管理
Linux下一切即文件,首先尝试使用dd
命令从标准输入读入并输出到标准输出或文件。
使用dd
命令创建虚拟镜像文件
其他磁盘操作
mkfs
命令可以格式化磁盘;mount
命令可以挂载磁盘到目录树;unmount
可以卸载已挂载磁盘;fdisk
命令可以为磁盘分区。losetup
命令可以建立镜像与回环设备的关联。
作业
找出当前目录下占用最大的前十的文件。
如图,首先du
命令得到文件的大小,sort
命令按文件大小排序,用head
命令取前十。
实验八 Linux下的帮助命令
内建命令与外部命令
内建命令实际上是 shell 程序的一部分,其中包含的是一些比较简单的 Linux 系统命令,这些命令是写在bash源码的builtins里面的,由 shell 程序识别并在 shell 程序内部完成运行,通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中。而且解析内部命令 shell 不需要创建子进程,因此其执行速度比外部命令快。比如:history、cd、exit 等等。
外部命令是 Linux 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调入内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin等等。比如:ls、vi等。
在系统中我们可以使用type
命令来了解一个命令的类型。
帮助命令的使用
help
、man
和info
以上三个命令都可以获得帮助信息,不同的是,help
命令用于显示Shell内建命令的简要帮助信息;man
命令没有内建和外部之分,它显示系统手册页中的内容,更加详细;info
是GNU的超文本帮助系统,显示的信息更多。
实验九 Linux任务计划crontab
crontab的使用
crontab简介
crontab
命令从输入设备读取指令,并将其存放于crontab文件中,以供之后读取和执行。通常,crontab
储存的指令被守护进程激活,crond
为其守护进程,crond常常在后台运行,每一分钟会检查一次是否有预定的作业需要执行。
crontab准备和使用
在实验楼需要先启动rsyslog
,以便通过日志中的信息了解任务是否真的被执行了。其次手动启动crontab
,通过crontab -e
添加任务。添加每分钟01秒时新建文件的任务如下:
在文件中首先用五个参数表示任务执行的时间,后面接具体的任务。五个时间参数分别为分、时、天、月份、周几。
挑战二 备份日志
为shiyanlou用户添加计划任务,每天三点备份alternative.log到/home/shiyanlou/tmp目录下,命名为时间,如2018年-10月-08日,并删除前一天备份的文件。
实际上图中的句子有一个错误,那就是&&
应该为||
,这在后面才会学到。然而即便有错在实验楼提交依然通过了,可见实验楼的在检测结果时并没有判断之前的文件是否被删除了。
实验十 命令执行顺序控制与管道
命令执行的顺序控制
通常情况下我们都是一条一条命令输入,系统自然也就一条一条的执行,如果我们一次输入多条呢?
顺序执行多条命令
多条命令间可以用;
隔开,这样系统就会顺序执行这些命令,这在更新并安装软件时十分方便。
有选择的执行命令
实际上命令顺序执行很可能遇到问题,那就是如果下一条命令的执行需要用到前一条命令的结果,那么顺序执行就会出错。所以我们可以用&&
或||
来连接多条命令进行有选择的执行。当&&
命令返回值是0的时候,&&
后的命令会继续执行;||
则在前面的命令返回值不为零时才会执行后面的命令。要知道前一条命令的返回值,使用echo $?
。
思考
||
和&&
任意顺序连接命令都可以吗?当然是可以的,其实只要记住一条标准,那就是||
或&&
后面的命令是否执行之和他们前面一条命令的返回值有关就行了。
管道
我们在使用一些过滤程序时经常会用到的就是匿名管道,在命令行中用分隔符|
表示。管道连接两条命令,将前一条命令的输出直接作为下一条命令的输入。如图
一些搭配管道食用更佳的命令
-
wc
命令。这个命令用于统计并输出一个文件中行、单词和字节的数目。比如统统计/etc下所有的目录数ls -dl /etc/*/ | wc -l
。 -
sort
命令。排序命令,前面已经用过很多次了,这里不再举例。 -
uniq
去重命令。可用于过滤或者输出重复行,注意这里的重复指连续重复,所以经常搭配sort
一起使用。如输出重复过的行及重复次数history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc
.
实验十一 简单的文本处理
文本处理命令
-
tr
命令。此命令可以用来删除或修改一段文本信息中的某些文字。如图78 -
col
命令。将tab
转为一定数量的空格或者反之。图 79 -
jion
命令。将两个文件中包含相同内容的一行合并到一起。 -
paste
命令。在不对比数据的情况下,直接将多个文件合并到一起。
作业
不使用转换工具的情况下,使用学过的命令手动完成dos文本到UNIX格式的转换。
很简单就可以完成转换,但dos文本格式和UNIX文本格式的差别真的只有这么点吗?
实验十二 数据流重定向
数据流重定向简单的理解就是将原本输出到一个地方的数据转到另一个输出位置,如输出到标准输出中的数据转而输出到文件中。需要注意的是,标准输出和标准错误输出是两种不同的输出,要对这两种信息同时进行重定向需要特殊的操作,即使用&>
。对比以下两图。
使用tee
命令可以实现数据的多重重定向,使用exec
可以实现“永久”重定向。
挑战三 历史命令
从命令记录中找出频次前三的命令并存储。对这个实验我是有一些疑问的。下面是提交通过的命令。
下面是两种输出。
显然我理解的命令是下面那种输出,但这种提交是错误的,正确的反而是上面那种,感觉实验楼把文件行数减掉后的第一个字段直接当成命令了,似乎是实验楼错了?
实验十三 正则表达式基础
正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
正则表达式不论是在什么操作系统下,都是字符流处理的一种很常用也很重要的方式。在Linux下要注意正则表达式和通配符的区分。正则表达式中的基本语法和特殊符号如下。
挑战四 数据提取
在文件中匹配出数字开头的行,匹配出正确的邮箱格式。
邮箱匹配实际上取巧了,因为该文件中的数据很少这样做不会出问题。
实验十四 Linux下软件安装
- 联网安装
apt-get install <软件包名>
。 - 修复安装
apt-get --reinstall install <软件包名>
- 卸载
apt-get remove <软件包名>
- 本地安装
dpkg
实验十五、十六 进程相关
程序(procedure):不太精确地说,程序就是执行一系列有逻辑、有顺序结构的指令,帮我们达成某个结果。就如我们去餐馆,给服务员说我要牛肉盖浇饭,她执行了做牛肉盖浇饭这么一个程序,最后我们得到了这么一盘牛肉盖浇饭。它需要去执行,不然它就像一本武功秘籍,放在那里等人翻看。
进程(process):进程是程序在一个数据集合上的一次执行过程,在早期的UNIX、Linux 2.4及更早的版本中,它是系统进行资源分配和调度的独立基本单位。同上一个例子,就如我们去了餐馆,给服务员说我要牛肉盖浇饭,她执行了做牛肉盖浇饭这么一个程序,而里面做饭的是一个进程,做牛肉汤汁的是一个进程,把牛肉汤汁与饭混合在一起的是一个进程,把饭端上桌的是一个进程。它就像是我们在看武功秘籍这么一个过程,然后一个篇章一个篇章地去练。
通过本实验我们初步的了解进程在系统中存在的概念,以及进程如何在系统中衍生,发展,以及进程之间存在的相互关系,学会了进程的查看命令 ps,pstree,top,以及使用这些命令时所得到的信息的含义,从而获取我们需要的信息,同时我们学会了进程的管理命令 kill,nice,renice可以为我们在后续学习进程管理打下基础,同时了解了工作与进程,以及工作管理的一些使用性的操作。
实验十七 日志系统
日志数据可以是有价值的信息宝库,也可以是毫无价值的数据泥潭。它可以记录下系统产生的所有行为,并按照某种规范表达出来。我们可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些信息调整系统的行为。收集你想要的数据,分析出有价值的信息,可以提高系统、产品的安全性,还可以帮助开发完善代码,优化产品。日志会成为在事故发生后查明“发生了什么”的一个很好的“取证”信息来源。日志可以为审计进行审计跟踪。
系统日志主要是存放系统内置程序或系统内核之类的日志信息如 alternatives.log 、btmp 等等,应用日志主要是我们装的第三方应用所产生的日志如 tomcat7 、apache2 等等。
配置的日志可以使用syslog
方便操作,日志转储使用logrotate
十分方便。
通过本实验我们了解系统日志结构,以及我们可以从中获取什么样的信息,给我们带来什么样的价值。还有日志工具的配置,以及省心省力的 logrotate。
实验感想
Linux表面死板,实则是一个*度很高的系统。在终端中进行操作看似困难,但熟悉之后很多事情的效率却远高于图形界面。本次实验之前我其实用过一些Linux,那时对它的感觉就是虽然难用但是干净,它只做用户让它做的事。经过这两天连续使用Linux,感觉Linux其实没那么难用,相反在应用安装,环境配置时感觉比windows要方便好多,而且真的是能做到“我输入了什么,就产生什么结果”。这和windows等图形界面的操作系统有很大不同,图形界面经常鼠标不小心点一下哪里就完全偏离了预想的方向。继续练习,相信Linux的使用会更加得心应手。