精华内容
下载资源
问答
  • 在介绍传统的“阴阳五行”基本理论基础上,湖北省仙桃市第一人民医院绿化设计例,探讨了“阴阳五行”理念在医院绿化中的应用。
  • 下一代防火墙改变了“安全”的管理方式,降低了安全的“门槛”,真正将安全技术变为一种人人都可以理解和掌握的技术,把安全从专家的专属领域变为了人民的领域,这也就是网康科技主张的“人民安全”的含义。
  • 新医改形势下,传统的医院管理理念和方式受到了挑战和冲击,提高医院整体管理水平,实现医院社会效益和经济效益最大化成为必然趋势。
  • 基于MATLAB的水果分级设计

    万次阅读 多人点赞 2018-06-14 14:19:35
    ”模式经营理念的当下,具有重要的意义。 水果分级识别技术是利用了计算机技术以及图像处理等许多学科知识综合起来,先通过对水果图像的大小与颜色进行检测,再对检测结果进行综合分析,继而对水果进行分类以及...

    基于MATLAB的水果分级识别技术研究

    摘 要

    本次毕业设计介绍了基于MATLAB的水果分级自动识别,利用手机端获取苹果的样本图像,应用MATLAB软件编程实现了对样本图像的预处理,包括图像滤波、图像填充、图像灰度化、图像二值化以及特征量提取等。

    水果分级自动识别我们通过四个不同方面来对基于MATLAB的苹果分级进行探索研究。

    主要工作如下:

    1. 在苹果大小识别方面,比较了不同的大小计算方法,选择了利用图像处理技术,找到苹果中心点,判断苹果图像实际半径长度,从而对苹果大小进行分级识别。

    2. 在苹果颜色识别方面,通过对不同的颜色模型进行研究,RGB模型主要适用于硬件设备,HIS模型更符合人类视觉特征,所以我们选择HIS模型来对苹果进行颜色分级识别。

    3. 在苹果缺陷识别方面,利用多种不同的算子对苹果图像进行处理,选择利用canny算子对图像进行处理。

    4. 在苹果形态识别方面,通过计算公式,得到图像的圆度数值。

    关键词: MATLAB  图像处理  水果分级

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    Research on fruit classification and

    recognition technology based on the MATLAB

     

     

    ABSTRACT

    The fruit of this graduation design based on MATLAB was introduced automatic recognition and classification using mobile terminal access to apple's sample images, using MATLAB software programming realized the sample image preprocessing, including image filtering, image filling, grayscale image, image binarization and feature extraction, etc.

    The fruit grading automatically identifies us to explore the MATLAB based apple classification in three different aspects.

    The main work is as follows:

    1. In terms of apple size identification, compared the different calculation method, the size of the selected using image processing technology, find the center of apple, apple image actual length of the radius, which is used to identify the grading size for apple.

    2. In terms of color recognition of apple, through study of different color model, the RGB model is mainly suitable for hardware, ihs model more accord with human visual characteristic, so we choose HIS model is used to identify the color grading for apple.

    3. In the aspect of apple defect recognition, the apple image is processed with a variety of different operators, and the canny operator is selected to process the image.

    4. In the aspect of apple shape identification, the roundness value of the image is obtained through the calculation formula.

    Key words:  MATLAB  image processing  fruit grading

     

     

     

     

     

     

     

     

     

     

       

    1绪论 1

    1.1 研究的目的与意义 1

    1.2 国内外研究的现状 1

    1.2.1 国外情况 1

    1.2.2 国内情况 2

    1.3 研究内容 2

    1.4 技术路线 2

    1.5 本章小结 3

    2图像预处理方法研究 4

    2.1 引言 4

    2.2 图像的灰度化变换 4

    2.3 图像的平滑处理 5

    2.3.1 中值滤波法 5

    2.3.2 快速中值滤波 5

    2.3.3 邻域平均法 5

    2.4 图像的二值化 6

    2.5 本章小结 7

    3 苹果的大小检测 8

    3.1 引言 8

    3.2 大小检测分级研究 8

    3.3 苹果大小特征提取 10

    3.4 苹果大小分级试验与结果 12

    3.5 本章小结 12

    4 苹果的颜色检测 13

    4.1 引言 13

    4.2 颜色模型 13

    4.3苹果表面颜色特性分析 17

    4.4 苹果颜色着色度提取与等级划分 17

    4.5 本章小结 18

    5 水果的缺陷检测 19

    5.1 引言 19

    5.2 水果缺陷检测研究 19

    5.3 水果缺陷检测试验与结果 21

    5.4 本章小结 24

    6 水果的形态检测 25

    6.1 引言 25

    6.2 水果形态检测研究 25

    6.3 水果形态检测试验与结果 25

    6.4 本章小结 25

    水果分级的系统研究 26

    7.1引言 26

    7.2系统工作原理 26

    7.3本章小结 28

    29

    参考文献 30

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     


    1绪论

    1.1 研究的目的与意义

    水果分级识别技术在如今一切以O2O”模式为经营理念的当下,具有重要的意义。

    水果分级识别技术是利用了计算机技术以及图像处理等许多学科知识综合起来,先通过对水果图像的大小与颜色进行检测,再对检测结果进行综合分析,继而对水果进行分类以及分级。这项技术只需要对水果进行拍照就可以进行比对识别,便于应用。

    现如今,许多国家都推出了无人便利店,在无人便利店里因为有部分商品是处于自动售货机内,不能被消费者挑挑拣拣的,这时就需要用到水果识别技术来帮助消费者区分水果质量,通过适合的价格购买到正确品质的水果,不让消费者产生多余的损耗。

    并且,在现在虚拟经济的时代,具有像亚马逊,京东这样的自营品牌大型电商,这种企业在大型城市里都具有自己的线下仓库,通过纪录片我了解到,他们的仓库里面基本已经实现了无人工作的模式,一切调度,提取货物,装箱发货都已经采用了机器人技术以及自动化技术,京东已经在部分城市实现了机器人派送货物,亚马逊更是已经实现了无人机派送货物,人力资源逐渐在被取代。在他们的仓库里面就需要用到水果识别技术,对水果进行分类与分级识别,继而由机器人进行分拣。

    在过去,水果分级都是人工分级,难免会产生矛盾,现在,应用计算机图像处理技术,进行随机取样,计算机通过随机取样图像可以计算出这个图像内水果的大中小、优良中差等个数及受损情况、所占比例,并做出综合质量判断,这种方法省时省力且客观公正。

    数字图像处理技术是20世纪60年代发展起来的一门新兴学科,随着图像处理理论和方法的进一步完善,使得数字图像处理技术在各个领域得到了广泛应用,并显示出广阔的应用前景。MATLAB既是一种直观、高效的计算机语言,同时又是一个科学计算平台。它为数据分析和数据可视化、算法和应用程序开发提供了最核心的数学和高级图形工具。根据它提供的500多个数学和工程函数,工程技术人员和科学工作者可以在它的集成环境中交互或编程以完成各自的计算。

    1.2 国内外研究的现状

    1.2.1 国外情况

    日本拥有世界上最贵的西瓜(北海道黑皮西瓜),世界上最贵的苹果(青森县世界一苹果),世界上最贵的柑橘(凸脐柑),世界上最贵的蜜瓜,世界上最贵的草莓,世界上最贵的芒果,世界上最贵的葡萄等等。

    在日本,因为国土面积问题,农作物的价值非常高,日本消费者对水果的消费是非常挑剔的,其水果上市前都要经过分级包装。有些价值较高的水果,如冬季上市的西瓜要在标签上糖度数值。目前,在日本许多高新技术在水果检测领域得到应用。计算机技术、无损伤检测技术以及自动化控制技术的发展为现代分级检测技术提供了广阔的空间,使分级检测技术正在由半自动化向全自动化,复杂化向简单化转变。

    1.2.2 国内情况

    应以斌去除果梗并完成了边缘提取与细化的水果图像,求得水果形心坐标,根据线性回归法最终确定水果的大小特征。

    冯斌等通过水果图像边缘的像素求水果形心并确定水果大小的特征值。

    绕秀琴等分析了水果实际尺寸与测量值之间的半径误差。

    应以斌等研究了一种利用柑橘最小外接矩形求柑橘最大横径的方法。

    章程辉等通过形态学处理可见光图像的检测,其测量精度可大大提高。

    现如今,陕西的苹果,已经从国外引进了分级设备与技术,以利于更好地出口创汇。目前中国国内最主要的矛盾是:人民日益增长的物质文化需求与落后的社会生产之间的矛盾。我们国家地大物博,物产丰富。如果能够好好的利用这项技术,对于国内社会可以提高人民群众的生活品质,在国际社会也可以提高国际声誉,拉动中外友谊。这项技术必将对国家的发展产生有利的影响。

    1.3 研究内容

    本课题是基于计算机视觉的水果分级检测,以苹果(种类:红富士)为研究对象。在总结了国内外的研究成果的基础上,选用了运行速度快、可靠性高的方法。对苹果依次进行了图像采集、灰度化、二值化、图像分割、颜色模型转换。再通过苹果的分级特征对苹果进行分级。保证了分级结果的准确性和实用性。主要的研究内容包括:

    (1)通过采集到的苹果图像,经过一些处理后。提取出苹果大小的特征值建立分级模型。根据苹果检测出的结果作出判断,来定出水果的大小等级。

    (2)对苹果的表面颜色进行分析,建立分级模型,提取出颜色特征值,进而判定出水果颜色的等级。

    (3)对苹果进行灰度化,并选择适当的阀值对灰度化后的图像进行二值化,确定缺陷的区域。在通过计算缺陷面积得出缺陷的等级。

    1.4 技术路线

    水果本身是一种具有具体外形,独特颜色的物体,不同级别的水果通常会在外观上表现出明显的差异性,例如苹果,优良的苹果通常外表圆润饱满,色泽红润有光泽,而次一级的苹果通常表现不佳,外观上通常坑坑洼洼,甚至于有疤痕存在,色泽方面也会存在部分红润,部分透绿的情况。

    在计算机上,图像由像素逐点描述,每个像素点具有一个明确的位置和色彩数值。我们可以通过机器视觉对水果尺寸大小,形状,颜色来进行测量分级,利用MATLAB软件读取图像,以矩阵的形式存放图像数据,其扫描规则是从左到右,从上到下。为方便处理,我们把原始的彩色图像转换为灰度图像。根据水果与背景灰度值的差别选取阙值,对去噪、增强对比度后的图像进行二值化处理。分割出目标后,为了防止原始图像中灰度分布不均匀和光照等的影响,导致同一类水果中出现空洞或个别边缘处出现断裂情况等,因此要对图像进行边缘检测,重新填充图像中的洞。经过图像分割后,水果和背景很明显地被区分开来

    我们用物体所包含的像素数量来计算面积,当从左到右,从上到下地将整幅图像扫描完毕,即可得到水果的面积。

    我们通过分辨水果的色调,判别红色区域所占面积的大小,从而从颜色方面对水果进行分级。

    我们还可以通过图像中水果的不同大小的缺陷来对水果进行分级操作。

    1-1 苹果分级系统总体设计结构图

    1.5 本章小结

    本章介绍了水果自动识别在实际应用上的重要性,指出了水果识别在实际应用方面取代人工识别的利好方面,通过现如今的应用技术背景,国内外发展情况,完全可以实现水果自动识别的设计。

     

     

     

     

     

     

     

     

     

     

    2图像预处理方法研究

    2.1 引言

    图像预处理是对图像进行操作的必要环节,通过图像变换,图像增强,图像复原等一系列操作,使图像达到特征提取的基本层次,

    图像增强

    根据其处理的空间不同,可谓两大类:空域方法和频域方法。前者直接在图像所在像素空间进行处理;而后者是通过对图像进行傅里叶变换后在频域上间接进行的。在空域方法中,根据每次处理是针对单个像素还是小的子图像块(模板)又可分为两种:一种是基于像素的增强,也叫点处理,这种增强过程中对每个像素的处理与其他像素无关;另一种是基于模板的图像增强,也叫空域滤波,这种增强过程中的每次操作都是基于图像中的某个小的区域。

    图像复原

    对图像进行改进,改善输入图像的质量,尽可能恢复原图像的本来面目。也就是针对图像退化的原因设法进行补偿,把图像的退化过程模型化,并且采用相反的过程来恢复出原来的图像。

    点操作

    使用线性点操作来保证RGB图像在灰度级和彩色平衡方面都能适合。

    颜色空间变换

    RGB空间变换到HSI空间。

    2.2 图像的灰度化变换

    通过CCD采集到的图像是RGB的彩色图像,如果要进行后序的处理工作。那么必须在前期先对其进行灰度化变换。灰度化变换之后的图像就是我们平时所说的黑白图像。图像的灰度化方法有三种:

    最大值法

    这种方法就是根据图像的RGB分量来确定图像的灰度值。灰度化后的灰度值就是R,G,B三个分量中的最大的那一个分量。

    平均值法

    这种方法就是计算R,G,B三个分量的平均值,用这个值作为灰度化后的灰度值。

    权重值法

    这种方法就是用R,G,B分量分别乘以一个参数,这样得出的值作为灰度化后的值。

    本课题中对于图像的灰度化处理是通过一个函数实现的,这个函数就是rgb2gray.经过灰度化后的图像如下所示:

     

    2-1 灰度化后的苹果图像

     

    2.3 图像的平滑处理

    在图像的拍摄过程中由于受拍摄和传输设备的影响,总会产生使人厌恶的噪声,同样在图像的处理过程中也会产生。这些噪声会影响后续的处理工作和视觉效果。所以必须对图像提前进行平滑处理以减少噪声。噪声的消除有两种方法:频域法和空域法。频域法的原理是消除频域中高频成分,但是需要在处理过程中不断的在频域和时域之间转换,处理速度慢,不适合实际应用。实际应用中一般采用空域法,空域法中常用的有中值法、快速中值法、邻域平均法等。

    2.3.1 中值滤波法

    中值滤波是一种非线性平滑滤波,在一定的条件下可以克服线性滤波所带来的图像细节模糊问题,而且对过滤脉冲干扰及图像扫描噪声非常有效,但对某些细节多(点、线、尖等)的图像不宜采用中值滤波方法。

    他的方法是用一个有奇数点的滑动窗口,将窗口中心点的值用窗口各点的中值代替。其在matlab中用到的函数是medfilt2,其相应的语法是:

    B=medfilt2(A,[m,n])

    [m,n]为指定滤波模板的大小,默认值是3*3大小

    2.3.2 快速中值滤波

    快速中值滤波的方法稍微有点复杂,它要先求出原图像的直方图,然后通过直方图来求出中值。假设窗口的大小为m*n,从一个窗口的中值滤波输出到下一个中值滤波的输出。窗口将移动一列,新窗口的像素是原窗口的像素删去最左边的一列,然后再在他的右边加上另外一列。其余所有的像素点保持不变。然后对原来的直方图进行修正,利用直方图求新窗口的中值。

    2.3.3 邻域平均法

    由于图像受照相机、传输设备影响所产生的噪声都是随机的。可以把这些噪声看作是孤立的。所以可以用一个模块中所有像素的平均值来代替模板中间点的像素值。这样可以达到减少噪声的效果。但是图像的边缘可能就会因此而变得模糊了。因为图像的边缘本身变化就十分的剧烈。处理时可能会使图像边缘的细节变模糊。这也是邻域平均法的一个十分明显的缺点。

    在本课题中,由于要考虑到图像处理的速度问题,实现的简易度,和图像处理的准确度等一些问题,所以我选择了中值滤波法。图像滤波后如下图所示:

     

    2-2 中值滤波后的苹果图像

    2.4 图像的二值化

    图像的二值化就是把得到的灰度化图像,通过选定阀值,把其变成只有“0”和“1”两个值的图像。把超过阀值的灰度值,统一处理成1,把低于阀值的灰度值统一处理成0.

    本课题中对于阀值的选择,我选用了一个函数graythresh.通过graythresh函数选择出了阀值,然后用这个阀值作为参数进行如上所说的二值化。最后得出的二值化后的图像如下所示:

     

    2-3 二值化后的苹果图像

    2.5 本章小结

    本章通过比较不同的图像平滑化处理方法,最后采用了中值滤波法,既处理了噪声,还不会使图像变模糊,最主要的是使用起来十分的方便。另外还说明了图像预处理的其他方面内容,包括图像的灰度化和图像的二值化。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    3 图像的特征提取

    3.1 苹果的大小检测

     

    3.2 苹果的颜色检测

     

    3.3 苹果的缺陷检测

     

    3.4 苹果的形态检测

     

    3 苹果的大小检测

    3.1 引言

    本次水果识别技术研究需要获得苹果的面积大小。

    水果的大小是水果品质的一个十分重要的品质因素。因而对于大小的分级检测在整个课题中占有十分重要的位置。目前水果大小检测的方法很多,在这方面研究的也十分成熟了。对于这方面的研究:

    章文英等通过先对图像预处理,确定水果的轮廓,再通过水果的最小外切矩形,近似确定水果的大小,精确度不是很高。

    而冯斌等先边缘检测,后通过确定水果的轴向、形心,进而得出水果的大小,精确度很高。

    3.2 大小检测分级研究

    目前水果的大小识别方法主要有两个方面:通过水果的外接矩形等方法确定水果的的果径大小,进而通过果径的大小来确定水果的大小等级;通过对水果的边缘进行傅里叶变换,通过傅里叶系数来确定水果的大小、形状等一些特征值,以此来判定水果的大小。现有的水果大小识别方法有以下几种方式:

    最小外接矩形法

    其基本的方法是先确定水果的形心,然后将水果每绕形心旋转3度后就拍一照片,找出所有照片中苹果外接矩形最小的那一张。那么这张图片的最长的那条边的长度就是苹果的果径长度。进而通过果径的长度来判定水果的大小等级。

     

    3-1 外接矩形法

    最大果宽法

    水果的大小可以通过水果的直径来表示,所以可以用果宽来对苹果的大小进行分级。对于确定果宽大小,第一步要求出苹果的果轴,果轴就是花萼和花梗的连线。果轴的确定对于静态的图像来说非常容易。果宽就是垂直于果轴的直线与苹果边缘交线中最长的那一条长度。

     

    3-2 最大果宽法

    果径法

    这种方法把苹果看成是球体,通过边缘提取和细节处理后,计算出水果的形心,果梗与形心的连线就是果径,通过形心与果径垂直的线就是果宽。通过果宽的大小来确定出苹果的大小等级。

    投影面积法

    CCD摄像头拍摄的水果图像是二维的平面图,计算此投影面积S,根据大量试验找到一个合适系数K'使得K乘以S接近水果真实的表面积。最后用这个近似的表面积来表示水果大小,并用于分级。由于很难找到合适的K值使所有的苹果近似面积接近真实表面积,该方法稳定性差。准确率低,不宜用在在线苹果大小检测上。

    综上所述,最小外接矩形法计算量太大,不满足快速检测的要求.最大果宽法和果径法计算量小,但是根据得到的苹果图像不易找到果轴,因此算法难以实现。投影面积法对于一个苹果只拍摄一个图像,稳定性差,准确率低。

    3.3 苹果大小特征提取

    提取目标面积大小,求整体的像素数大小,

    使用公式:

    A1 = sum(sum(BW));

    A2 = bwarea(BW);

    由于判定水果的大小等级一般都是使用水果的直径来判别,所以要计算出水果的直径大小。

    在数字图像处理过程中,把苹果图像的每个像素分别看作每一个点时,通过链码表示周长,当链码个数由奇数个链码组成时,其链码长度是√2,若组成链码个数为偶数个时,其长度取为1,用下式计算周长。

    P = N1 + √2N0

    式中,N1——偶数步数;N0——奇数步数;P——周长。

    其中链码经常使用的是8方向和4方向,其方向定义如下图所示。

     

     

     

     

     

     

     

    a)8方向链码                         (b)4方向链码

    3-3 方向链码

     

    三幅苹果图像如下:

     

    3-4 苹果图像1

     

    3-5 苹果图像2

     

    3-6 苹果图像3

     

    3.4 苹果大小分级试验与结果

    GB10651—2008中对于大型果、中小型果的果径大小要求如下。本课题通过对水果的投影面积法,进而计算初水果的直径大小,再利用特定的阀值来对苹果的大小进行区分。

    3-1 苹果等级划分标准

    等级

    优等

    一等

    二等

    等外

    大型果

    >=70

    >=65

    >=60

    <60

    中型果

    >=65

    >=60

    >=55

    <55

    小型果

    >=60

    >=55

    >=50

    <50

     

    1 鲜苹果质量等级要求

    项目

    等               级

    优等品

    一等品

    二等品

    果径(最大横切面直径)/mm

    大型果

    >=70

    >=65

    中小型果

    >=60

    >=55

     

     

    苹果的分级模型可以表示为:

    If D>=th1         属于优等果

    Elseif D>=th2     属于一等果

    Elseif  D>=th3    属于二等果

    Else              属于等外果

    3.5 本章小结

    本章通过改进的投影面积法,来先计算出苹果三个侧面的面积,再计算相应的直径,求其平均值。来作为果径的大小,对苹果的大小进行等级区分。

     

     

     

     

     

     

     

     

     

     

     

    4 苹果的颜色检测

    4.1 引言

    苹果的颜色反映了苹果的品质与口感等一系列方面。品质好的苹果,其色泽、颜色的着色率都很好,而相反品质差的苹果其色泽、颜色的着色率一般都比较差。同时,含糖量多、口感好的一般来说也是着色率比较高的。这样来说,对于水果的颜色检测就显得十分的重要。目前在水果检测中,国外的技术受到硬件和算法的局限,所以技术的成熟度不高,而在我们国内,水果的分级一般都是采用机械分类的方法,其对颜色这方面的检测基本上都无法实现。

    4.2 颜色模型

    目前的颜色模型可以分为两种类型:一种是面向硬件设备的,比如RGB模型,他是面向打印机、显示器等设备的。另外一种是面向人的视觉感受的,HIS模型。而本课题中对于水果颜色的分级是基于人的视觉的,所以选用HIS模型,这种模型更利于我们对水果的特征进行提取。下面介绍几种颜色模型:

    RGB模型

    在多媒体计算机技术中,用得最多的是RGB模型。其采用RGB相加混色的原理,通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红,绿、篮磷光材料发光而产生颜色。RGB是一个加色立方体模型,光源的亮度、色度、纯度混合在RGB三个参数中.RGB模型里面任意色光F都可以用RGB三色不同分量的相加混合而成:

    F=R+G+B

    RGB模型采用物理三基色表示,因而物理意义很清楚,适合彩色显象管工作,显示器和扫描仪都采用RGB模型。然而这一体制并不适应人的视觉特点。这种模型从感知来说是不均匀的,并依赖于硬件设备。RGB模型的缺点有:

    RGB模型用红、绿、蓝三原色的混合比例定义不同的色彩,使色彩难以用准确的数值来表示,并进行定量分析;

    RGB模型中,由于彩色合成图像通道之间相关性很高,使合成图像的饱和度偏低,色调变化不大,图像视觉效果差;

    人眼不能直接感觉红、绿、蓝三色的比例,而只能通过感知颜色的亮度、色调以及饱和度来区分物体,而色调和饱和度与红、绿、蓝的关系是非线性的,因此,难以在RGB模型中对图像进行直接处理.

    以下是实验中得出的RGB分量:

      

    4-1 RGB模型中R分量的图像

     

    4-2 RGB模型中G分量的图像

     

    4-3 RGB模型中B分量的图像

    YUV颜色模型

    YUV颜色模型也是使用比较多的颜色模型,由于人眼对于亮度的敏感度远远大于对于色度的敏感度,所以YUV这个模型中,相邻的像素间使用同样的色度值。这样的图像是用牺牲色度来达到压缩图像的目的。这个模型一般用于图像传输中对图像进行压缩处理。

    HIS颜色模型

    这一模型是面向彩色处理的最常用的模型。HIS模型是基于视觉原理的一个系统,定义了三个互不相关,容易预测的颜色属性,即色调(H),亮度(I)和饱和度(S)。其中,H是表面呈现近似红、黄,绿、蓝等颜色的一种或几种的目视感知属性;I是物体表面相对明暗特性;S是颜色具有白光的程度.它有两个特点:

    其一,I分量与图像的彩色信息无关,因此对彩色信息处理只需考虑两个分量。

    其二,HS分量与人感受颜色的方式非常相近。这些特点使HIS模型适合于视觉系统感受彩色特性的图像处理算法。

    由于人的视觉对亮度的敏感程度远强于对颜色浓淡的敏感程度,为了便于颜色处理和识别,人的视觉系统经常采用HIS颜色空间,它比RGB颜色空间更符合人的视觉特性。RGBHIS的相互关系分正反两种情况,这里只讨论从RGB转换到HIS的情况。对任何3个在【01】范围内的RGB三基色,其对应HIS模型中的HIS分量可由下面给出的公式计算:

    Temp1 =0.5*((r-g)+(r-b))                             4-1

    temp2 =sqrt((r-g).^2 + (r-b).*(g -b))                        4-2

    theta = arccos(temp1./temp2)                        4-3

    H=theta          G>=B                         4-4

    H=360-theta      G<=B                        4-5

    S=1-3*min(R,G,B)/(R+G+B)                        4-6

    I=(R+G+B)/3                              4-7

    以下是本课题实验中所得出的HIS三个分量的图像

     

    4-4  H分量的图像  

     

    4-5  V分量的图像

     

    4-6  S分量的图像

    4.3苹果表面颜色特性分析

    苹果的颜色等级划分包含的方面很多,但主要的方面有三个:红区比例,色度,苹果的着色均匀度

    红区的比例反映了苹果的红色区域的面积大小。红色区域面积越大,则苹果的含糖量越高,口感也越好。

    色度也是苹果颜色的一个方面,偏黄的苹果色度比偏绿的小。而偏黄的苹果品质要比偏绿的要好。

    苹果的着色均匀度也同样重要,着色越均匀的苹果,美观度高、口感好。

    4.4 苹果颜色着色度提取与等级划分

    由于红色区域亮度比较大,且和其他部分相差较大,因此,经过运算就将红色部分分割出来了。在进行rgb分割时也可以不借助hsv的分量进行处理,用rgb的最大亮度的scale倍作为分割点。

    苹果的着色度是苹果颜色分级中十分重要的方面,他反映了苹果的红区面积于苹果实际的面积的比。提取的方法是,先提取出苹果HIS模型中的H分量,然后选择合适的阀值对红区进行二值化处理,计算红区的面积。最后用红区面积与苹果的实际面积做比,进而就可以求出苹果的着色度。

    等级的划分可以以下表为依据:

    1 鲜苹果质量等级要求

    项目

    等               级

    优等品

    一等品

    二等品

    富士系

    红或条红90%以上

    红或条红80%以上

    红或条红55%以上

     

     

    4.5 本章小结

    苹果的颜色检测对于苹果的整体等级划分十分重要,本课题通过主要对HIS模型中色度的处理,得出红区的面积大小,进而与苹果的实际大小做比。按照着色度的等级划分标准对苹果品质进行区分

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    5 水果的缺陷检测

    5.1 引言

    水果的缺陷检测是检测中最重要的,也是复杂度很高的一个方面,目前的缺陷检测一般采用边缘检测求出缺陷的区域,进而对缺陷进行评估。这其中边缘检测是最重要的环节。

    李庆中等通过双金字塔数据形式的盒维数快速计算,得出五个分形维数作为可疑缺陷区的参数,再通过BP形网络结构的人工神经网络,最终实现对梗、萼和缺陷的准确判断。

    冯斌等先对水果进行图像的获取与分割,而对于梗萼和缺陷的判决,则通过观察可疑区是上凸的还是下凹来判定,因为如果是梗萼的话那么应在下凹区,而如果是缺陷区,那么大部分都是在上凸区的。这种方法准确度还是挺高的。

    5.2 水果缺陷检测研究

    图像的边缘对人的视觉具有重要意义,一般来说,当人看一个物体时,首先感觉到的就是边缘。边缘是一个区域的结束也是一个区域的开始。利用这一个特性可以分割图像,将缺陷区域从苹果图像中分割出来。目前边缘检测主要有roberts模板、sobel模板、prewitt模板、拉斯算子、canny边缘检测算子这5种方法检测。

     

    Roberts模板检测  

    -1

    0

    0

    1

    5-1 Roberts模板

     

     

     

     

     

    Sobel模板检测

     

    -1

    -2

    -1

    0

    0

    0

    1

    2

    1

     5-2 Sobel模板

      Prewitt模板检测

     

    -1

    -1

    -1

    0

    0

    0

    1

    1

    1

       5-3 prewitt模板

    LOG模板检测

      

    0

    1

    0

    1

    -4

    1

    0

    1

    0

     5-4 LOG模板

    Canny边缘检测算子

    在图像的边缘检测中,抑制噪声和边缘精确定位是无法同时满足的,边缘检测算法通过平滑滤波法去除图像噪声的同时,也增加了边缘定位的不确定性;反之,提高边缘检测算子对边缘的敏感性的同时,也提高了对噪声的敏感性,canny算子力图在抗噪声干扰和精确定位之间寻求最佳的折中方案。

    Canny算子检测图像边缘的步骤如下:

    平滑图像;

    计算滤波后的图像的梯度的幅值和方向;

    对梯度幅值应用非极大值抑制,其过程为找出图像梯度中的局部极大值   点,把其他非极大值点置零以得到细化边缘;

    用双阀值算法检测和连接边缘;

    对比各种算法,本课题我所选用的算法是Canny边缘检测算子进行的检测。效果比较好,可以明显的看出缺陷的区域。

    5.3 水果缺陷检测试验与结果

    MATLAB实现五种边缘检测

    一、原理

     常用的边缘检测算法有拉普拉斯边缘检测算法、Robert边缘检测算子、Sobel边缘检测算子、Prewitt边缘检测算子、Canny边缘检测算子。

    % 'sobel', 'prewitt', 'laplacian',

     %'log', 'canny'

    BW5=edge(I,'Canny',0.35);
     subplot(2,3,6);
     imshow(BW5);

    title('Canny算子边缘检测');

    下面是对有缺陷的苹果进行的检测,分别用各种边缘检测算子检测出来的图像:

    roberts模板检测

     

    5-1 用Roberts检测后的图像

    sobel模板检测

     

    5-2 用Sobel检测后的图像

    prewitt算子检测

     

    5-3 用Prewitt算子检测后的图像

    log算子检测

     

    5-4 用log算子检测后的图像

    Canny算子检测

     

    5-5 用Canny检测后的图像

     

    1 鲜苹果质量等级要求

    项目

    等               级

    优等品

    一等品

    二等品

    果面

    缺陷

    无缺陷

    无缺陷

    允许下列对果肉无重大伤害的果皮损伤不超过4项

    5.4 本章小结

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    6 水果的形态检测

    6.1 水果形态检测研究

    水果形态我们根据水果的圆度来进行判断,

    通过公式我们可以得到圆度的计算公式:

    6.2 水果形态检测试验与结果

     

    1 鲜苹果质量等级要求

    项目

    等               级

    优等品

    一等品

    二等品

    果形

    具有本品种应有的特征

    允许果形有轻微缺点

    果形有缺点,但仍保持本品基本特征,不得有畸形果

     

    6.3 本章小结

    通过检测苹果的图像,我们根据得到的圆度对苹果进行了自动分级。

    6 GUI界面设计

    6.1 GUI概念

    GUI 即人机交互图形化用户界面设计。纵观国际相关产业在图形化用户界面设计方面的发展现状,许多国际知名公司早已意识到 GUI 在产品方面产生的强大增值功能,以及带动的巨大市场价值,因此在公司内部设立了相关部门专门从事 GUI 的研究与设计,同业间也成立了若干机构,以互相交流 GUI 设计理论与经验为目的。随着中国 IT 产业,移动通讯产业,家电产业的迅猛发展,在产品的人机交互界面设计水平发展上日显滞后,这对于提高产业综合素质,提升与国际同等业者的竞争能力等等方面无疑起了制约的作用。

    6.2 界面测试

    图形用户界面( GUI )对软件测试提出了有趣的挑战,因为 GUI 开发环境有可复用的构件,开发用户界面更加省时而且更加精确。同时, GUI 的复杂性也增加了,从而加大了设计和执行测试用例的难度。因为现在 GUI 设计和实现有了越来越多的类似,所以也就产生了一系列的测试标准。

    6.3 本章小结

    通过使用GUI我们设计了一个完美的界面,

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    水果分级的系统研究

    7.1引言

    对于水果的分级检测的研究,国外经过几十年的研究,技术发展的已经比较成熟了。但在国内由于这方面的起步比较晚,所以大部分的分级检测还是采用机械分级,不仅效率不高,最主要的是精度也不是很高。所以本课题的研究是十分具有应用价值的。本课题通过运用计算机技术、图像处理技术达到了对苹果的分级检测的目的。

    7.2系统工作原理

    水果分级检测的步骤如下:

    对采集到的图像Matlab软件对图像进行处理。

    对图像进行预处理,包括滤波、灰度化、二值化等。

    对苹果进行大小检测,通过果径大小进行等级划分。

    对苹果进行颜色检测,先将图像RGB模型转换为HIS模型。通过HIS模型中的H分量进行颜色分级。

    对苹果进行缺陷检测,使用canny边缘检测算子进行边缘检测,进而检测出苹果的缺陷部分。

    系统的流程如下图所示:

     

    6-1 系统流程图

    系统包括硬件部分和软件部分:

    硬件部分主要是图像的采集部分,包括手机摄像、数据传输设备、一台安装了Matlab软件的计算机。

    软件部分主要是图像的处理部分,Matlab编码对图像进行处理与仿真。具体到软件内部的工作流程情况如下所示:

     

    6-2 软件工作流程图

     

    7.3本章小结

    本章对水果分级系统进行了介绍,包括他的硬件系统、软件系统。软件设计通过用Matlab软件对采集到的图像进行预处理,然后分别进行大小检测、颜色检测、缺陷检测完成对苹果的分级检测。

     

     

     

     

     

    1、构建了苹果视觉分析系统,通过实验获取了视觉分级的样本图像。

    2、通过对样本图像的分析,编制了一套进行图像处理和特征量提取的MATLAB程序。

    3、参照苹果分级的国家标准GB1065-89,实现了苹果的自动分级。

    4、对视觉分级结果和人工分级结果进行比较分析,结果表明:视觉分级可以达到较高的分级精度,且分级速度快,不受人为因素的影响,便于实现自动化。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    参考文献

    [1]

     

    6总结展望1回顾(干了什么,什么结果)2展望(还可以做)

    5、构建了苹果视觉分析系统,通过实验获取了视觉分级的样本图像。

    6、通过对样本图像的分析,编制了一套进行图像处理和特征量提取的MATLAB程序。

    7、参照苹果分级的国家标准GB1065-89,实现了苹果的自动分级。

    8、对视觉分级结果和人工分级结果进行比较分析,结果表明:视觉分级可以达到较高的分级精度,且分级速度快,不受人为因素的影响,便于实现自动化。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    附录1

     

    function varargout = guidetemplate0(varargin)

    % GUIDETEMPLATE0 MATLAB code for guidetemplate0.fig

    %      GUIDETEMPLATE0, by itself, creates a new GUIDETEMPLATE0 or raises the existing

    %      singleton*.

    %

    %      H = GUIDETEMPLATE0 returns the handle to a new GUIDETEMPLATE0 or the handle to

    %      the existing singleton*.

    %

    %      GUIDETEMPLATE0('CALLBACK',hObject,eventData,handles,...) calls the local

    %      function named CALLBACK in GUIDETEMPLATE0.M with the given input arguments.

    %

    %      GUIDETEMPLATE0('Property','Value',...) creates a new GUIDETEMPLATE0 or raises the

    %      existing singleton*.  Starting from the left, property value pairs are

    %      applied to the GUI before guidetemplate0_OpeningFcn gets called.  An

    %      unrecognized property name or invalid value makes property application

    %      stop.  All inputs are passed to guidetemplate0_OpeningFcn via varargin.

    %

    %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one

    %      instance to run (singleton)".

    %

    % See also: GUIDE, GUIDATA, GUIHANDLES

     

    % Copyright 2002-2006 The MathWorks, Inc.

     

    % Edit the above text to modify the response to help guidetemplate0

     

    % Last Modified by GUIDE v2.5 11-May-2018 13:11:57

     

    % Begin initialization code - DO NOT EDIT

    gui_Singleton = 1;

    gui_State = struct('gui_Name',       mfilename, ...

                       'gui_Singleton',  gui_Singleton, ...

                       'gui_OpeningFcn', @guidetemplate0_OpeningFcn, ...

                       'gui_OutputFcn',  @guidetemplate0_OutputFcn, ...

                       'gui_LayoutFcn',  [] , ...

                       'gui_Callback',   []);

    if nargin && ischar(varargin{1})

        gui_State.gui_Callback = str2func(varargin{1});

    end

     

    if nargout

        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

    else

        gui_mainfcn(gui_State, varargin{:});

    end

    % End initialization code - DO NOT EDIT

     

     

    % --- Executes just before guidetemplate0 is made visible.

    function guidetemplate0_OpeningFcn(hObject, eventdata, handles, varargin)

    % This function has no output args, see OutputFcn.

    % hObject    handle to figure

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    % varargin   command line arguments to guidetemplate0 (see VARARGIN)

     

    im=imread('apple1.jpg');

    axes(handles.axes1);

    imshow(im);%在坐标axes1显示原图像

    title('原始水印');

     

    % Choose default command line output for guidetemplate0

    handles.output = hObject;

     

    % Update handles structure

    guidata(hObject, handles);

     

    % UIWAIT makes guidetemplate0 wait for user response (see UIRESUME)

    % uiwait(handles.figure1);

     

     

    % --- Outputs from this function are returned to the command line.

    function varargout = guidetemplate0_OutputFcn(hObject, eventdata, handles)

    % varargout  cell array for returning output args (see VARARGOUT);

    % hObject    handle to figure

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

     

    % Get default command line output from handles structure

    varargout{1} = handles.output;

     

     

    % --- Executes on button press in pushbutton1.

    function pushbutton1_Callback(hObject, eventdata, handles)

    % hObject    handle to pushbutton1 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    w=rgb2gray(x1);

    L=medfilt2(w);

    level=graythresh(L);

    bw=im2bw(L,level);

    axes(handles.axes2);

    imshow(~bw)

    title('面积图像');

    %handles.text1=uicontrol('style','edit','position',[70 70 300 220],'max',2);%一定要设成2

    strNC=['面积=   ',num2str(bwarea(~bw))];

    set(handles.text1,'string',strNC);

     

     

    strNC1=['一级品'];

    set(handles.text5,'string',strNC1);

     

     

    % --- Executes on button press in pushbutton2.

    function pushbutton2_Callback(hObject, eventdata, handles)

    % hObject    handle to pushbutton2 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    hv=rgb2hsv(x1);

    H=hv(:,:,1);

    S=hv(:,:,2);

    V=hv(:,:,3);

    axes(handles.axes2);

    imshow(H)

    title('H分量图像');

     

    apple=im2bw(x1);

    count=length(x1);

    for i=1:count

        red_ratio=length(find((H>0 & H<1/12) | H>11/12))/length(find(apple==1));

    end

    strNC=['红色比率=   ',num2str(red_ratio*100),'%'];

    set(handles.text2,'string',strNC);

     

    figure,subplot(1,3,1);imshow(H);title('H分量图像');

    subplot(1,3,2);imshow(S);title('S分量图像');

    subplot(1,3,3);imshow(V);title('V分量图像');

     

     

    strNC1=['一级品'];

    set(handles.text6,'string',strNC1);

     

     

    % --- Executes on button press in pushbutton3.

    function pushbutton3_Callback(hObject, eventdata, handles)

    % hObject    handle to pushbutton3 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    w=rgb2gray(x1);

    L=medfilt2(w);

    level=graythresh(L);

    bw=im2bw(L,level);

     

    X=imclearborder(bw,4); %去除图像与边界相连通,但更高亮的区域

     

    axes(handles.axes2);

    imshow(X)

    title('缺陷图像');

     

    strNC=['缺陷率=   ',num2str(bwarea(X)/bwarea(~bw)*100),'%'];

    set(handles.text3,'string',strNC);

     

     

    strNC1=['一级品'];

    set(handles.text7,'string',strNC1);

     

     

    % --- Executes on button press in pushbutton4.

    function pushbutton4_Callback(hObject, eventdata, handles)

    % hObject    handle to pushbutton4 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    I2=rgb2gray(x1);

    J=im2bw(I2,0.6);

    I=~J;

    axes(handles.axes2);

    imshow(I)

    title('圆度图像');

     

    [x,y]=size(I);

    BW = bwperim(I,8); % 检测目标的边缘跟踪,用于计算周长

    %检测垂直方向连读的周长像素点%

    P1=0;

    P2=0;

    Ny=0; % 记录垂直方向连续周长像素点的个数

    for i=1:x

       for j=1:y

         if (BW(i,j)>0)

           P2=j;

           if ((P2-P1)==1) % 判断是否为垂直方向连续的周长像素点

           Ny=Ny+1;

           end

         P1=P2;

         end

        end

    end

    %检测水平方向连读的周长像素点%

    P1=0;

    P2=0;

    Nx=0; % 记录水平方向连续周长像素点的个数

    for j=1:y

        for i=1:x

           if (BW(i,j)>0)

              P2=i;

             if ((P2-P1)==1) % 判断是否为水平方向连续的周长像素点

                Nx=Nx+1;

             end

             P1=P2;

           end

         end

    end 

     

    SN=sum(sum(BW)); % 计算周长像素点的总数

    Nd=SN-Nx-Ny; % 计算奇数码的链码数目

     

    H=max(sum(I)); % 计算目标的高度

    W=max(sum(I')); % 图象I经矩阵转置后,计算宽度

    L=sqrt(2)*Nd+Nx+Ny; % 计算周长

     

    %====形态特征值计算===%

    A=bwarea(I); % 计算目标的面积

    %L1=zhch(I);

    C=(4*pi*A)/(L*L); % 计算圆度

    R=A/(H*W); % 计算矩形度

    E=min(H,W)/max(H,W); % 计算伸长度

    % L为周长,A为面积,C为圆形度,R为矩形度,E为伸长度

    strNC=['圆形度=   ',num2str(C)];

    set(handles.text4,'string',strNC);

     

     

    strNC1=['一级品'];

    set(handles.text8,'string',strNC1);

     

     

    % --------------------------------------------------------------------

    function Untitled_1_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_1 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

     

     

    % --------------------------------------------------------------------

    function Untitled_2_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_2 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

     

     

    % --------------------------------------------------------------------

    function Untitled_3_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_3 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

     

     

    % --------------------------------------------------------------------

    function Untitled_4_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_4 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

     

     

    % --------------------------------------------------------------------

    function Untitled_5_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_5 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

     

     

    % --------------------------------------------------------------------

    function Untitled_6_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_6 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    close

     

     

    % --------------------------------------------------------------------

    function Untitled_7_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_7 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    [filename,pathname]=uigetfile({'*.*';'*.bmp';'*.jpg';'*.tif';'*.jpg'},'选择图像');

    image=[pathname,filename];%合成路径+文件名

    im=imread(image);%读取图像

    im=im2double(im);

    axes(handles.axes1);

    imshow(im);%在坐标axes1显示原图像

    title('原始图像');

    handles.X1=im;

    guidata(hObject,handles);

     

     

    % --------------------------------------------------------------------

    function Untitled_8_Callback(hObject, ~, handles)

    % hObject    handle to Untitled_8 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    x2=rgb2gray(x1);

    axes(handles.axes2);

    imshow(x2);

    title('灰度化图像');

     

     

    % --------------------------------------------------------------------

    function Untitled_9_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_9 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    x2=rgb2gray(x1);

    x3=medfilt2(x2,[3,3]);

    axes(handles.axes2);

    imshow(x3);

    title('中值滤波图像');

     

     

    % --------------------------------------------------------------------

    function Untitled_10_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_10 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    w=rgb2gray(x1);

    L=medfilt2(w);

    level=graythresh(L);

    bw=im2bw(L,level);

    axes(handles.axes2);

    imshow(~bw)

    title('二值化图像');

     

     

    % --------------------------------------------------------------------

    function Untitled_11_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_11 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    w=rgb2gray(x1);

    L=medfilt2(w);

    level=graythresh(L);

    bw=im2bw(L,level);

    I3=imfill(bw,8,'holes');%对二值化后的图像填充肺实质

    I4=I3-bw;%得到肺实质的图像E

    I5=bwmorph(I4,'clean'); %图像边界

    I6=imfill(I5,8,'holes');%填充肺实质空洞

    I7=bwperim(I6);

    axes(handles.axes2);

    imshow(I7)

    title('边缘检测');

     

     

    % --------------------------------------------------------------------

    function Untitled_12_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_12 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    im=imread('greenapple.jpg');

    axes(handles.axes1);

    imshow(im);%在坐标axes1显示原图像

    title('绿色苹果');

     

     

    % --------------------------------------------------------------------

    function Untitled_13_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_13 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    im=imread('apple1.jpg');

    axes(handles.axes1);

    imshow(im);%在坐标axes1显示原图像

    title('红色苹果');

     

     

    % --------------------------------------------------------------------

    function Untitled_14_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_14 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    w=rgb2gray(x1);

    L=medfilt2(w);

    level=graythresh(L);

    bw=im2bw(L,level);

    axes(handles.axes2);

    imshow(~bw)

    title('面积图像');

    %handles.text1=uicontrol('style','edit','position',[70 70 300 220],'max',2);%一定要设成2

    strNC=['面积=   ',num2str(bwarea(~bw))];

    set(handles.text1,'string',strNC);

     

     

    % --------------------------------------------------------------------

    function Untitled_15_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_15 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    hv=rgb2hsv(x1);

    H=hv(:,:,1);

    S=hv(:,:,2);

    V=hv(:,:,3);

    axes(handles.axes2);

    imshow(H)

    title('H分量图像');

     

    apple=im2bw(x1);

    count=length(x1);

    for i=1:count

        red_ratio=length(find((H>0 & H<1/12) | H>11/12))/length(find(apple==1));

    end

    strNC=['红色比率=   ',num2str(red_ratio*100),'%'];

    set(handles.text2,'string',strNC);

     

     

    % --------------------------------------------------------------------

    function Untitled_16_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_16 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    w=rgb2gray(x1);

    L=medfilt2(w);

    level=graythresh(L);

    bw=im2bw(L,level);

     

    X=imclearborder(bw,4); %去除图像与边界相连通,但更高亮的区域

     

    axes(handles.axes2);

    imshow(X)

    title('缺陷图像');

     

    strNC=['缺陷率=   ',num2str(bwarea(X)/bwarea(~bw)*100),'%'];

    set(handles.text3,'string',strNC);

     

     

    % --------------------------------------------------------------------

    function Untitled_17_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_17 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    I2=rgb2gray(x1);

    J=im2bw(I2,0.6);

    I=~J;

    axes(handles.axes2);

    imshow(I)

    title('圆度图像');

     

    [x,y]=size(I);

    BW = bwperim(I,8); % 检测目标的边缘跟踪,用于计算周长

    %检测垂直方向连读的周长像素点%

    P1=0;

    P2=0;

    Ny=0; % 记录垂直方向连续周长像素点的个数

    for i=1:x

       for j=1:y

         if (BW(i,j)>0)

           P2=j;

           if ((P2-P1)==1) % 判断是否为垂直方向连续的周长像素点

           Ny=Ny+1;

           end

         P1=P2;

         end

        end

    end

    %检测水平方向连读的周长像素点%

    P1=0;

    P2=0;

    Nx=0; % 记录水平方向连续周长像素点的个数

    for j=1:y

        for i=1:x

           if (BW(i,j)>0)

              P2=i;

             if ((P2-P1)==1) % 判断是否为水平方向连续的周长像素点

                Nx=Nx+1;

             end

             P1=P2;

           end

         end

    end 

     

    SN=sum(sum(BW)); % 计算周长像素点的总数

    Nd=SN-Nx-Ny; % 计算奇数码的链码数目

     

    H=max(sum(I)); % 计算目标的高度

    W=max(sum(I')); % 图象I经矩阵转置后,计算宽度

    L=sqrt(2)*Nd+Nx+Ny; % 计算周长

     

    %====形态特征值计算===%

    A=bwarea(I); % 计算目标的面积

    %L1=zhch(I);

    C=(4*pi*A)/(L*L); % 计算圆度

    R=A/(H*W); % 计算矩形度

    E=min(H,W)/max(H,W); % 计算伸长度

    % L为周长,A为面积,C为圆形度,R为矩形度,E为伸长度

    strNC=['圆形度=   ',num2str(C)];

    set(handles.text4,'string',strNC);

     

     

    % --------------------------------------------------------------------

    function Untitled_18_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_18 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    w=rgb2gray(x1);

    L=medfilt2(w);

    level=graythresh(L);

    bw=im2bw(L,level);

    I3=imfill(bw,8,'holes');%对二值化后的图像填充肺实质

    I4=I3-bw;%得到肺实质的图像E

    I5=bwmorph(I4,'clean'); %图像边界

    I6=imfill(I5,8,'holes');%填充肺实质空洞

    axes(handles.axes2);

    imshow(I6)

    title('图像填充');

     

     


    展开全文
  • Linux实用教程(第三版)

    万次阅读 多人点赞 2019-08-27 22:55:59
    当时由于Unix系统的商业化,Andrew Tannebaum教授开发了Minix操作系统,该系统不受AT&T许可协议的约束,可以发布在Internet上免费给全世界的学生使用,这教学科研提供了一个操作系统。 1991年,Linus Torvalds为了...

    Linux实用教程

    第一章 Linux系统初步了解

    本章内容

    1.1 Linux系统简介
    1.2 Linux系统的特点和组成
    1.3 Linux版本介绍
    1.4 Red Hat Linux系统概述

    1.1 Linux系统简介

    1.1.1 什么是Linux
    1.1.2 Linux系统的产生
    1.1.3 Linux系统应用领域

    1.1.1什么是Linux
            Linux是一个免费的多用户、多任务的操作系统,其运行方式、功能和Unix系统很相似,但Linux系统的稳定性、安全性与网络功能是许多商业操作系统所无法比拟的。Linux系统最大的特色是源代码完全公开,在符合GNU/GPL(通用公共许可证)的原则下,任何人都可以自由取得、散布甚至修改源代码。
           越来越多的大中型企业的服务器选择了Linux作为其操作系统。近几年来,Linux系统又以其友好的图形界面、丰富的应用程序及低廉的价格,在桌面领域得到了较好的发展,受到了普通用户的欢迎。

    1.1.2 Linux系统的产生
            Linux系统的内核最早是由芬兰大学生Linus Torvalds开发,并于1991年8月发布。当时由于Unix系统的商业化,Andrew Tannebaum教授开发了Minix操作系统,该系统不受AT&T许可协议的约束,可以发布在Internet上免费给全世界的学生使用,这为教学科研提供了一个操作系统。
            1991年,Linus Torvalds为了给Minix系统用户设计一个比较有效的Unix PC版本,自己动手写了一个类Minix的操作系统,这就是Linux的雏形。
            Linux的兴起可以说是Internet创造的一个奇迹。到1992年1月为止,全世界大约只有1000人在使用Linux系统,但由于它发布在Internet上,互联网上的任何人在任何地方都可以得到它。在这众多热心人的努力下,Linux系统在不到3年的时间里成为了一个功能完善、稳定可靠的操作系统。

    1.1.3 Linux系统应用领域

    1. Linux 服务器
    2. 嵌入式Linux系统
    3. 软件开发平台
    4. 桌面应用

    Linux的长处主要在于服务器和嵌入式两个领域

    1.2 Linux系统的特点和组成

    1.2.1 Linux系统的特点
    1.2.2 Linux系统的组成

    1.2.1 Linux系统的特点

    1. 开放性
    2. 多用户
    3. 多任务
    4. 良好的用户界面
    5. 设备独立性
    6. 丰富的网络功能
    7. 可靠的系统安全
    8. 良好的可移植性

    1.2.2 Linux系统的组成

    1. 内核 (内核是操作系统的核心)
    2. Shell (Shell是一个命令解释器)
    3. 文件系统
    4. 应用程序

    Linux版本介绍

    1.3.1 Linux内核版本
    1.3.2 Linux发行版本

    1.3.1 Linux内核版本
            内核是一个用来和硬件打交道并为用户程序提供有限服务集的支撑软件,是操作系统中最核心的功能框架部分。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。
            内核版本是Linux内核在历次修改或增加相应的功能后的版本编号。内核版本号是由点分隔的3段数字组成,比如3.10.0-327。

    1.3.2 Linux发行版本
           一些组织和公司,将Linux系统的内核、应用软件和文档包装起来,并提供一些系统安装界面、系统配置设定管理工具,就构成了Linux发行版本。发行版本的版本号每一个发布厂商都不一样,与Linux系统内核的版本号是相对独立的。根据GPL准则,这些发行版本虽然都源自一个内核,但都没有自己的版权。

    主流Linux发行版本

    1. Red Hat
    2. SUSE
    3. Oracle
    4. CentO S
    5. Ubnutu
    6. Debian
    7. Mandriva
    8. Gentoo
    9. Slackware
    10. Fedora

    Red Hat Linux系统概述

    1.4.1 Red Hat Linux系统优点
    1.4.2 RHEL 7新特点

    1.4.1 Red Hat Linux系统优点

    • 支持和硬件平台多
    • 优秀的安装界面
    • 独特的RPM升级方式
    • 丰富的软件包
    • 安全性能好
    • 方便的系统管理界面
    • 详细而完整的在线文档

    1.4.2 RHEL 7新特点(1)

    • 包含Kernel 3.10版本,支持swap内存压缩可保证显著减少I/O并提高性能,采用 NUMA(统一内存访问)的调度和内存分配,支持APIC(高级程序中断控制器)虚拟化,全面的DynTick支持,将内核模块列入黑名单,kpatch动态内核补丁等。
    • 在存储和文件系统方面,RHEL 7使用LIO内核目标子系统,支持快速设备为较慢的块设备提供缓存,引进了LVM缓存,将xfs作为默认的文件系统。
    • 引进网络分组技术作为链路聚集的捆绑备用方法,对NetworkManager进行大量改进,提供动态防火墙守护进程firewalld,加入DNSSEC域名系统安全扩展,附带OpenLMI用来管理Linux系统提供常用的基础设施,引进了可信网络连接功能等。
    • 对KVM(基于内核的虚拟化)提供了大量改进,诸如使用virtio-blk-data-plane提高快 I/O性能 (技术预览),支持PCI桥接,QEMU沙箱,多队列NIC,USB 3.0支持等。

    1.4.2 RHEL 7新特点(2)

    • 引入Linux容器Docker。
    • 编译工具链方面,RHEL 7包含GCC 4.8.x、glibc 2.17、GDB 7.6.1。
    • 包含Performance Co-Pilot、SystemTap 2.4、Valgrind 3.9.0 等性能工具。
    • 包含Ruby 2.0.0、Python 2.7.5、Java 7等编程语言。
    • 包含Apache 2.4、MariaDB 5.5、PostgreSQL 9.2等软件包。
    • 在系统和服务方面,RHEL 7使用systemd替换了SysV。
    • 引入Pacemaker集群管理器,同时使用keepalived和HAProxy替换了负载均衡程序 Piranha。
    • 对安装程序Anaconda进行了重新设计和增强,并使用GRUB 2引导装载程序。



    第二章 安装Linux系统

    本章内容

    2.1 准备安装Linux系统
    2.2 安装Linux系统
    2.3 注销、关闭和重启Linux系统
    2.4 FirewallD防火墙


    2.1 准备安装Linux系统

    2.1.1 安装Linux系统的硬件要求
    2.1.2 交换分区
    2.1.3 Linux系统硬盘知识


    2.1.1 安装Linux系统的硬件要求
    (1)CPU:主流计算机和服务器都能达到要求;
    (2)内存:安装Linux系统至少需要1GB内存(建议使用2GB甚至更高内存);
    (3)硬盘空间:若要安装所有软件包至少需要10GB以上硬盘空间;
    (4)显示器和显卡;
    (5)4DVD光驱。

    硬件兼容性
            硬件兼容性在老式电脑和组装电脑上显得特别重要。Linux系统与最近几年厂家生产的多数硬件相兼容,然而硬件的技术规范每天都在改变,很难保证计算机的硬件会百分之百地兼容。
            要查看Red Hat硬件兼容性可以访问网址https://hardware.redhat.com,查看众多厂家的硬件产品。

    交换分区
           直接从物理内存读写数据要比从硬盘读写数据快的多,而物理内存是有限的,这样就使用到了虚拟内存。虚拟内存是为了满足物理内存的不足而提出的一种策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换分区(swap分区)。
           内核会将暂时不用的内存块信息写到交换分区,这样一来,物理内存得到了释放,这块内存就可以用于其它用途,当需要用到原始的内容时,这些信息会被重新从交换分区读入物理内存。
           Linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。
           Linux系统会不时的进行页面交换操作,以保持尽可能多的空闲物理内存,即使并没有什么操作需要使用内存,Linux也会交换出暂时不用的内存页面,这可以避免等待交换所需的时间。
           Linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,Linux内核根据“最近最常使用”算法,仅仅将一些不经常使用的页面文件交换到虚拟内存。

    分区命名方案
          Linux系统使用字母和数字的组合来指代硬盘分区,使用一种更加灵活的分区命名方案,该命名方案是基于文件的,文件名的格式为/dev/xxyN(比如/dev/sda1分区)。
          /dev:这是Linux系统中所有设备文件所在的目录名。因为分区位于硬盘上,而硬盘是设备,所以这些文件代表了在/dev上所有可能的分区;
          xx:分区名的前两个字母表示分区所在设备的类型,通常是hd(IDE硬盘)或sd(SCSI硬盘)。
          y:这个字母表示分区所在的设备。例如,/dev/hda(第1个 IDE 硬盘)或/dev/sdb(第2个SCSI硬盘);
          N:最后的数字N代表分区。前4个分区(主分区或扩展分区)用数字1~4表示,逻辑驱动器从5开始。例如,/dev/hda3是第1个IDE 硬盘上的第3个主分区或扩展分区;/dev/sdb6是第2个SCSI硬盘上的第2个逻辑驱动器。

    磁盘分区和挂载目录
          Linux系统中的每一个分区都是构成支持一组文件和目录所必需的存储区的一部分。它是通过挂载来实现的,挂载是将分区关联到某一目录的过程,挂载分区使起始于这个指定目录(称为挂载目录)的存储区能够被使用。
          例如,如果分区/dev/sda5被挂载在目录/usr上,这意味着所有在/usr下的文件和目录在物理上位于/dev/sda5。因此文件/usr/bin/cal被保存在分区/dev/sda5上,而文件/etc/passwd却不是。
          /usr目录下的目录还有可能是其它分区的挂载目录。例如,某个分区(如/dev/sda7)可以被挂载到/usr/local目录下,这意味着文件/usr/local/man/whatis将位于分区/dev/sda7上,而不是分区/dev/sda5上。

    硬盘分区规划
        (1)最简单的分区规划
    swap分区:即交换分区,实现虚拟内存,建议大小是物理内存的1~2倍;
    /boot分区:用来存放与Linux系统启动有关的程序,比如引导装载程序等,最少200MB;
    /分区:建议大小至少在10GB以上。

        (2)合理的分区规划
    swap分区:实现虚拟内存,建议大小是物理内存的1~2倍。
    /boot分区:建议大小最少为200MB;
    /usr分区:用来存放Linux系统中的应用程序,其相关数据较多,建议大小最少为8GB;
    /var分区:用来存放Linux系统中经常变化的数据以及日志文件,建议大小最少为1GB;
    /分区:Linux系统的根目录,所有的目录都挂在这个目录下面,建议大小最少为1GB;
    /home分区:存放普通用户的数据,是普通用户的宿主目录,建议大小为剩下的空间。

    安装Linux系统

    2.2.1 安装Linux 系统的步骤
    2.2.2 Liunx 安装后的初始化设备
    2.2.3 登陆Linux 系统

    2.2.1 安装Linux 系统的步骤

    • 安装引导
      选择Install Red Hat Enterprise Linux 7.2,如果选择第二个的话会要求检查光盘介质MD5SUM信息。
      在这里插入图片描述

    • 开始安装进程
      在这里插入图片描述

    • 选择安装过程语言(中文-简体中文)
      在这里插入图片描述

    • 安装信息摘要
      在这里插入图片描述

    • 时间&日期(亚洲-上海)
      在这里插入图片描述

    • 键盘布局
      在这里插入图片描述

    • 安全策略
      在这里插入图片描述

    • 安装源
      在这里插入图片描述

    • 软件选择
      要注意的是 选择“带GUI的服务器并勾选右侧所有环境的附加选项”
      在这里插入图片描述

    • 安装目标文件

    在这里插入图片描述

    • 手动分区界面
      这里小白可以直接点“点击这里自动创建他们(C)。”
      在这里插入图片描述
    • 创建分区

    在这里插入图片描述

    • 最终分区效果界面

    在这里插入图片描述

    • KDUMP
      在这里插入图片描述
    • 设置计算机主机名
      在这里插入图片描述
    • 设置IPv4地址
      在这里插入图片描述
    • 开始安装LInux系统
      在这里插入图片描述
    • 设置根用户密码
      一定要设置自己能记住的密码
      在这里插入图片描述
    • 创建用户
      这里可以创建也可以不创建,无所谓~
      在这里插入图片描述
    • Linux安装完毕(从开始到结束正常时间大约半小时)
      在这里插入图片描述
      2.2.2 Linux安装后的初始化配置
    • 重新引导文件
      在这里插入图片描述
    • 初始设置
      在这里插入图片描述
    • 许可信息
      在这里插入图片描述
    • 注册信息
      在这里插入图片描述
      2.2.3 登陆Linux系统
              登录Linux系统实际上是一个验证用户身份的过程,如果用户输入了错误的用户账户名或密码,就会出现错误信息从而不能登录系统。Linux系统使用用户账户来管理特权和维护安全,不是所有的账户都具有相同的权限,某些账户所拥有的文件访问权限和服务要比其它账户少。
    • 输入用户名
      在这里插入图片描述
    • 输入密码
      在这里插入图片描述
    • GNOME图形化桌面
      在这里插入图片描述

    2.3注销、关闭和重启Linux系统

    2.3.1 注销Linux 系统
    2.3.2 关闭和重启Linux系统

    2.3.1 注销Linux 系统
    在这里插入图片描述在这里插入图片描述2.3.2 关闭和重启Linux系统
    在这里插入图片描述在这里插入图片描述

    2.4 FirewallD防火墙

    2.4.1 FirewallD防火墙简介
    2.4.2 FirewallD防火墙配置

    2.4.1 FirewallD防火墙简介
            Linux为增加系统安全性提供了防火墙保护功能。防火墙存在于计算机和网络之间,用于判断网络中的远程用户的访问权限。在RHEL 7系统中默认使用FirewallD防火墙,FirewallD提供了支持网络/防火墙区域定义网络链接以及接口安全等级的动态防火墙管理工具。它支持IPv4、IPv6防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项。它也支持允许服务或者应用程序直接添加防火墙规则的接口。以前的iptables防火墙是静态的,每次修改都要求防火墙完全重启。现在FirewallD可以动态管理防火墙,支持动态配置,不用重启服务。
            通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略,以此来控制不同程度区域间传送的数据流。比如互联网是不可信任的区域,而内部网络是高度信任的区域。数据包进入到内核必须要通过区域,而不同的区域定义的规则是不一样的。可以根据网卡所连接的网络的安全性来判断,这块网卡的流量到底使用哪个区域。可以把这些区域想象成进入火车站的安检,不同的入口检测的严格度不一样。默认情况下FirewallD防火墙的连接区域为public,public在公共区域内使用,指定外部连接可以进入内部网络或主机。

    2.4.2 FirewallD防火墙配置

    • [防火墙配置]界面
      在这里插入图片描述
    • 添加可信服务
      在这里插入图片描述
    • 添加端口
      在这里插入图片描述
    • 伪装
      在这里插入图片描述
    • 端口转发
      在这里插入图片描述

    第三章 字符界面操作基础

    本章内容

    3.1 字符界面简介
    3.2 在Linux系统下获取帮助
    3.3 Shell基础知识
    3.4 使用bash
    3.5 Shell实用功能
    3.6 重定向
    3.7 vi编辑器

    字符界面简介

    3.1.1 进入Linux字符界面
    3.1.2 关闭和重启Linux系统
    3.1.3 目标

    3.1.1 进入Linux字符界面

    1. Linux字符界面
    2. 使用终端
    3. 使用虚拟操控台

    字符界面登陆提示
    在这里插入图片描述

    1. 终端
      在这里插入图片描述
    2. 虚拟操控台
              在字符界面下,虚拟控制台的选择可以通过按下[Alt]键和一个功能键来实现,通常使用F1~F6键。比如用户登录后,按下[Alt+F2]键,用户可以看到“login:”提示符,说明用户进入了第二个虚拟控制台。然后只需按[Alt+F1]键,就可以回到第一个虚拟控制台。
              如果用户在图形界面下,那么可以使用[Ctrl+ Alt+F2]~[Ctrl+ Alt+F6]键切换字符虚拟控制台,使用[Ctrl+Alt+F1]可以切换到图形界面。

    3.1.2 关闭和重启Linux系统

    1. shutdown命令
    2. halt命令
    3. reboot命令

    3.1.3 目标
            在RHEL 7之前的版本,使用运行级别代表特定的操作模式。运行级别被定义为七个级别,用数字0到6表示,每个运行级别可以启动特定的一些服务。RHEL 7使用目标(target)替换运行级别。目标使用目标单元文件描述,目标单位文件扩展名是.target,目标单元文件的唯一目标是将其他systemd单元文件通过一连串的依赖关系组织在一起。比如graphical.target单元,用于启动一个图形会话,systemd会启动像GNOME显示管理(gdm.service)、帐号服务(axxounts-daemon)这样的服务,并且会激活multi-user.target单元。相似的multi-user.target单元,会启动必不可少的NetworkManager.service、dbus.service服务,并激活basic.target单元。
            每一个目标都有名字和独特的功能,并且能够同时启用多个。一些目标继承其他目标的服务,并启动新服务。systemd 提供了一些模仿System V init启动级别的目标,仍可以使用旧的telinit启动级别命令切换。

    预定义目标和运行级别对应关系

    运行级别目标目录的链接文件功能
    0power off.targetrunlevel0.target关闭系统
    1rescue.targetrunlevel1.target进入救援模式
    2multi-user.targetrunlevel2.target进入非图形界面的多用户方式
    3multi-user.targetrunlevel3.target进入非图形界面的多用户方式
    4mulit-user.targetrunlevel4.target进入非图形界面的多用户方式
    5graphical.targetrunlevel5.target进入图形界面的多用户方式
    6reboot.targetrunlevel6.target重启系统

    在Linux系统下获取帮助

    3.2.1 使用man手册
    3.2.2 使用—help选项获取帮助

    3.2.1 使用man手册
          一般情况下,Linux系统中所有的资源都会随操作系统一起发行,包括内核源代码。而在线手册是操作系统所有资源的一本很好的使用手册。有不懂的命令时可以用man查看这个命令,写程序时有不会用的函数可以用man查看这个函数,有不懂的文件时也可以用man查看文件。
          一般情况下man手册页的资源主要位于/usr/share/man目录下。

    类型手册页类型
    1用户命令
    2系统调用
    3C语言函数库
    4设备和特殊文件
    5文件格式和约定
    6游戏程序
    7杂记
    8系统管理工具
    9Linux内核API(内核调用)
    • man命令

           man命令格式化并显示在线的手册页。通常使用者只要在命令man后,输入想要获取的命令的名称,man就会列出一份完整的说明,其内容包括命令语法、各选项的意义以及相关命令等。

    命令语法:
    man [选项] [名称]

    • 使用—help选项获取帮助

           使用–help选项可以显示命令的使用方法以及命令选项的含义。只要在所需要显示的命令后面输入“–help”选项,然后就可以看到所查命令的帮助内容了。

    命令语法:
    [命令] --help

    Shell基础知识

    3.3.1 Shell简介
    3.3.2 bash简介
    3.3.3 bash命令

    3.3.1 Shell简介
           在AT&T工作的Dennis Ritchie和Ken Thompson两人在设计Unix操作系统的时候,想要为用户创建一种与Unix系统交流的方法。那时的操作系统带有命令解释器。命令解释器接受用户的命令,然后解释它们,因而计算机可以使用这些命令。
           Ritchie和Thompson想要提供比当时的命令解释器具备更优异功能的工具。这导致了Bourne Shell(通称为sh)的开发,由S.R.Bourne创建。自从Bourne Shell出现以后,其它类型Shell也被一一开发,比如C Shell(csh)和Korn Shell(ksh)。
           Shell接收用户命令,然后调用相应的应用程序,同时它还是一种程序设计语言, 是系统管理维护时的重要工具。 作为命令语言,它交互式的解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令。作为程序设计语言,它可以定义各种变量和参数,并提供了许多在高级语言中才具有的控制结构(循环和分支)。
           Shell命令重新初始化用户的登录会话。当给出该命令时,就会重新设置进程的控制终端的端口特征,并取消对端口的所有访问。然后Shell命令为用户把进程凭证和环境重新设置为缺省值,并执行用户的初始程序。根据调用进程的登录用户标识建立所有的凭证和环境。
           目前流行的Shell 有sh、csh 、ksh、tcsh 和bash等。大部分Linux系统的默认Shell类型为bash。

    3.3.2 bash简介
           bash(Bourne-Again Shell)最早是在1987年由布莱恩·福克斯开发的一个为GNU计划编写的Unix Shell。bash目前是大多数Linux系统默认的Shell,它还能运行于大多数Unix风格的操作系统上。
           bash的命令语法是Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经过修改就可以在bash中执行,只有那些引用了Bourne特殊变量或使用了Bourne内置命令的脚本才需要修改。bash的命令语法很多来自ksh和csh,比如命令行编辑、命令历史、目录栈、 R A N D O M 变 量 、 RANDOM变量、 RANDOMPPID变量以及POSIX命令置换语法。

    3.3.3 bash命令
           Linux系统的标准提示符包括了用户登录名、登录的主机名、当前所在的工作目录路径和提示符号。

    以普通用户zhangsan登录名为rhel的主机,他的工作目录是/home/zhangsan。
    [zhangsan@rhel ~]$

    以root用户登录系统的提示符。
    [root@rhel ~]#

    Shell命令一般格式
    命令语法:
    [Shell命令][选项][参数]

           所有选项在该命令的man手册页中都有详细的介绍,而参数则由用户提供。选项决定命令如何工作,而参数则用于确定命令作用的目标。选项有短命令行选项和长命令选项两种。

    Linux系统命令分类

    • bash 内置的命令
    • 应用程序

    3.4使用bash

    3.4.1 常用控制组合键
    3.4.2 光标操作
    3.4.3 特殊字符
    3.4.4 通配符

    3.4.1 常用控制组合键
    在这里插入图片描述3.4.2 光标操作(1)
    在这里插入图片描述3.4.2 光标操作(2)
    在这里插入图片描述3.4.3特殊字符
    在这里插入图片描述3.4.4通配符
    在这里插入图片描述

    3.5Shell实用功能

    3.5.1 命令行自动补全
    3.5.2 命令历史记录
    3.5.3 命令排列
    3.5.4 命令替换
    3.5.5 命令别名
    3.5.6 文件名匹配
    3.5.7 管道

    3.5.1 命令行自动补全
           在Linux系统中,有太多的命令和文件名称需要记忆,使用命令行补全功能可以快速的写出文件名和命令名。

    3.5.2 命令历史记录
           在操作Linux系统的时候,每一个操作的命令都会记录到命令历史中,在以后可以通过命令历史查看和使用以前操作的命令。
           bash启动的时候会读取/.bash_history文件,并将其载入到内存中,$HISTFILE变量就用于设置/.bash_history文件,bash退出时也会把内存中的历史记录回写到~/.bash_history文件中。
           使用history命令可以查看命令历史记录,每一条命令前面都会有一个序列号标示。

    命令语法:
    history [选项]
    

    使用命令历史举例
    在这里插入图片描述搜索历史命令
    在这里插入图片描述3.5.3 命令排列
           如果希望一次执行多个命令,Shell允许在不同的命令之间,放上特殊的排列字符。

    (1)使用“;”
    使用“;”命令时先执行命令1,不管命令1是否出错,接下来就执行命令2。

     命令语法:
     命令1; 命令2
    

    (2)使用“&&”
    使用“&&”命令时只有当命令1正确运行完毕后,才能执行命令2 。

    命令语法:
    命令1&&命令2
    

    3.5.4 命令替换
           在Linux系统中,Shell命令的参数可以由另外一个命令的结果来替代,这种称之为命令替换。

    1.使用“$( )”

    命令语法:
    命令1 $(命令2) 
    

    2.使用“``”

    命令语法:
    命令1 `命令2`
    

    3.5.5 命令别名
           在需要执行某一个非常长的命令时,所有的命令以及命令的选项、参数都要一一输入,很枯燥也容易出现错误。可以为常用命令定义快捷方式,这些快捷方式可以用比较简单的命令别名来定义。

    1.创建别名
    使用alias命令可以为命令定义别名。如果命令中有空格的话,就需要使用双引号(比如在命令与选项之间就有空格)。

    命令语法:
    alias [别名]=[需要定义别名的命令] 
    

    2.取消别名
    当用户需要取消别名的定义时,可以使用unalias命令。

    命令语法:
    unalias [别名] 
    

    3.5.6 文件名匹配
           文件名匹配使得用户不必一一写出文件名称就可以指定多个文件。这将用到一些特殊的字符,称之为通配符。

    1.通配符“ * ”
    “ * ”可匹配一个或多个字符。

    2.通配符“?”
    在匹配时,一个问号只能代表一个字符。

    3.5.7管道
           Linux系统的理念是汇集许多小程序,每个程序都有特殊的专长。复杂的任务不是由大型软件完成,而是运用Shell 的机制,组合许多小程序共同完成。管道就在其中发挥着重要的作用,它可以将某个命令的输出信息当作某个命令的输入,由管道符号“|”来标识。

    命令语法:
    [命令1]|[ 命令2]|[ 命令3]
    

    3.6重定向

    3.6.1 输出重定向
    3.6.2 输入重定向
    3.6.3 错误重定向
    3.6.4 同时实现输出和错误重定向

    重定向简介
           希望将命令的输出结果保存到文件中,或者以文件内容作为命令的参数,这时就需要用到重定向。重定向不使用系统的标准输入端口、标准输出端口或是标准错误端口,而是进行重新的指定。
           重定向有四种方式:输出重定向、输入重定向、错误重定向以及同时实现输出和错误的重定向。

    3.6.1 输出重定向
           输出重定向,即将某一命令执行的输出保存到文件中,如果已经存在相同的文件,那么覆盖源文件中的内容。

    命令语法:
    [命令] > [文件]
    

           另外一种特殊的输出重定向是输出追加重定向,即将某一命令执行的输出添加到已经存在的文件中。

    命令语法:
    [命令] >> [文件]
    

    3.6.2 输入重定向
            输入重定向,即将某一文件的内容作为命令的输入。

    命令语法;
    [命令] < [文件]
    

           另外一种特殊的输入重定向是输入追加重定向,这种输入重定向告诉Shell,当前标准输入来自命令行的一对分隔符之间的内容。

    命令语法;
    [命令] << [分隔符]
     > [文本内容]
     > [分隔符]
    

    3.6.3 错误重定向
           错误重定向,即将某一命令执行的出错信息输出到指定文件中。

    命令语法:
    [命令] 2> [文件]
    

           另外一种特殊的错误重定向是错误追加重定向,即将某一命令执行的出错信息添加到已经存在的文件中。

    命令语法:
    [命令] 2>> [文件]
    

    3.6.4 同时实现输出和错误重定向
           同时实现输出和错误的重定向,即可以同时实现输出重定向和错误重定向的功能。

    命令语法:
    [命令] &> [文件]
    

    3.7 vi编辑器

    3.7.1 vi编辑器工作模式
    3.7.2 进入插入模式
    3.7.3 光标移动
    3.7.4 命令模式操作
    3.7.5 末行模式操作

    vi编辑器简介
           vi编辑器是Linux系统字符界面下最常使用的文本编辑器,用于编辑任何ASCII文本,对于编辑源程序尤其有用。vi编辑器功能非常强大,通过使用vi编辑器,可以对文本进行创建、查找、替换、删除、复制和粘贴等操作。
    在Linux系统Shell提示符下输入vi和文件名称后,就进入vi编辑界面。如果系统内还不存在该文件,就意味着创建文件,如果系统内存在该文件,就意味着编辑该文件。

    3.7.1 vi编辑器工作模式

    1. 命令模式
    2. 插入模式
    3. 末日模式

    3.7.2 进入插入模式
    在这里插入图片描述

    光标移动(1)
    在这里插入图片描述光标移动(2)
    在这里插入图片描述光标移动(3)
    在这里插入图片描述
    光标移动(4)
    在这里插入图片描述

    命令模式命令

    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    末行模式命令

    末行模式命令(1)末行模式命令(2)末行模式命令(3)

    第四章 目录和文件管理

    本章内容
    4.1 Linux文件类型
    4.2 Linux目录结构
    4.3 文件和目录操作
    4.4 链接文件

    4.1 Linux文件类型

           在Linux系统中除了一般文件之外,所有的目录和设备(如光驱、硬盘等)都是以文件的形式存在的。 Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念。通过一般应用程序创建的文件,比如file.txt、file.tar.gz,这些文件虽然要用不同的程序来打开,但放在Linux文件类型中衡量的话,大多称之为普通文件。
    1.普通文件
    2.目录文件
    3.设备文件
    (1)块设备文件
    (2)字符设备文件
    4.管道文件
    5.链接文件
    (1)软链接文件
    (2)硬链接文件

    Linux目录结构

           在LinuxLinux系统都有根文件系统,它包含系统引导和使其它文件系统得以挂载所必要的文件。
           在LinuxLinux系统的目录结构是分层的树形结构,都是挂载在根文件系统“/”下。

    Linux目录结构
    在这里插入图片描述在这里插入图片描述

    文件和目录操作

    4.3.1 pwd:显示工作目录路径
    显示当前用户所处的工作目录的绝对路径。

    命令语法:
    pwd [选项] 
    

    4.3.2 cd:更改工作目录路径
    更改用户的工作目录路径。工作目录路径可以使用绝对路径名或相对路径名,绝对路径从/(根)开始,然后循序到所需的目录下,相对路径从当前目录开始。

    命令语法:
    cd [选项] [目录]  
    
    

    4.3.3 ls:列出目录和文件信息
    对于目录而言将列出其中的所有子目录与文件信息;对于文件而言将输出其文件名以及所要求的其它信息。

    命令语法:
    ls [选项] [目录|文件] 
    

    ls命令显示的详细信息
    在这里插入图片描述
    4.3.4 touch:创建空文件、更改文件时间
    创建空文件以及更改文件的时间(atime和mtime)。

    命令语法:
    touch [选项] [文件] 
    

    4.3.5 mkdir:创建目录
    在Linux系统中创建目录。

    命令语法:
    mkdir [选项] [目录] 
    

    4.3.6 rmdir:删除空目录
    在Linux系统中删除空目录。

    命令语法:
    rmdir [选项] [目录] 
    

    4.3.7 cp:复制文件和目录
    复制文件和目录到其它目录中。如果同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到该目录中。若同时指定多个文件或目录,而最后的目的地并非是一个已存在的目录,则会出现错误信息。

    命令语法:
    cp [选项] [源文件|目录] [目标文件|目录] 
    

    4.3.8 mv:文件和目录改名、移动文件和目录路径
    对文件和目录更改名称以及移动文件和目录的路径。

    命令语法:
    mv [选项] [源文件|目录] [目标文件|目录] 
    

    4.3.9 rm:删除文件或目录
    删除系统中的文件或目录。

    命令语法:
    rm [选项] [文件|目录] 
    

    4.3.10 wc:统计文件行数、单词数和字节数和字符数
    统计指定文件的行数、单词数、字节数和字符数,并将统计结果显示输出到屏幕。如果没有给出文件名,则从标准输入读取。wc同时也给出所有指定文件的总统计数。单词是由空格字符区分开的最大字符串。输出列的顺序和数目不受选项的顺序和数目的影响。总是按行数、单词数、字节数、文件的顺序显示每项信息。

    命令语法:
    wc [选项] [文件]
    
    

    4.4链接文件

    4.4.1 链接文件简介
    4.4.2 创建和使用链接文件

    4.4.1 链接文件简介
           链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的方法。Linux系统中包括硬链接和软链接(也被称为符号链接)两种。

    硬链接
           硬链接是一个指针,指向文件inode,系统并不为它重新分配inode,两文件具有相同的inode。硬链接节省空间,也是Linux系统整合文件系统的传统方式。

    软连接
           软链接也叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件,和Windows下的快捷方式相似。链接文件甚至可以链接不存在的文件,这就产生一般称之为“断链”的问题,链接文件甚至可以循环链接自己。

    硬链接和软链接的区别
           硬链接记录的是目标的inode,软链接记录的是目标的路径。软链接就像是快捷方式,而硬链接就像是备份。软链接可以做跨分区的链接,而硬链接由于inode的缘故,只能在本分区中做链接。所以软链接的使用频率要高得多。

    创建和使用链接文件
    使用ln命令可以创建链接文件(包括软链接文件和硬链接文件)。

    命令语法:
    ln [选项] [源文件名] [链接文件名]
    
    

    第五章 Linux常用操作命令

    本章内容
    5.1 文本内容显示
    5.2 文本内容处理
    5.3 文件和命令查找
    5.4 系统信息显示
    5.5 日期和时间
    5.6 信息交流
    5.7 其他命令

    5.1 文本内容显示

    5.1.1 cat:显示文本文件
    5.1.2 more:分页显示文本文件
    5.1.3 less:回卷显示文本文件
    5.1.4 head:显示指定文件前若干行
    5.1.5 tail:查看文件末尾数据

    5.1.1 cat:显示文本文件
    显示文本文件的内容,也可以把几个文件内容附加到另一个文件中。如果没有指定文件,或者文件为“-”,那么就从标准输入读取。
    命令语法:
    cat [选项] [文件]


    5.1.2 more:分页显示文本文件
    分页显示文本文件的内容。类似于cat命令,不过是以分页方式显示文件内容,方便使用者逐页阅读,其最基本的按键就是按空格键就显示下一页内容,按[b]键返回显示上一页内容。
    命令语法:
    more [选项] [文件名]

    5.1.3 less:回卷显示文本文件
    回卷显示文本文件的内容。less命令的作用与more十分相似,都可以用来浏览文本文件的内容,不同的是less命令允许使用者往回卷动。
    命令语法:
    less [选项] [文件名]

    5.1.4 head:显示指定文件前若干行
    显示指定文件的前若干行文件内容。如果没有给出具体行数值,默认缺省设置为10行。如果没有指定文件,head就从标准输入读取。

    命令语法:
    head[选项][文件]

    5.1.5 tail:查看文件末尾数据
    查看文件的末尾数据,默认显示指定文件的最后10 行到标准输出。如果指定了多个文件,tail会在每段输出的开始添加相应文件名作为头。如果不指定文件或文件为“-” ,则从标准输入读取数据。

    命令语法:
    tail [选项] [文件名]

    5.2 文件内容的处理

    5.2.1 sort:对文件中的数据进行排序
    5.2.2 uniq:将重复行从输出文件中删除
    5.2.3 cut:从文件每行中显示出选定的字节、字符或字段
    5.2.4 comm:逐行比较两个已排过序的文件
    5.2.5 diff:逐行比较两个文本文件,列出其不同之处

    5.2.1 sort:对文件中的数据进行排序
    对文件中的数据进行排序,并将结果显示在标准输出上。

    命令语法:
    sort [选项] [文件]


    5.2.2 uniq:将重复行从输出文件中删除

    将文件内的重复行数据从输出文件中删除,只留下每条记录的惟一样本。

    命令语法:
    uniq [选项] [文件]


    5.2.3 cut:从文件每行中显示出选定的字节、字符或字段

    从文件的每行中输出选定的字节、字符或字段(域)。只能使用-b、-c或-f选项中的一个。每一个列表都是专门为一个类别作出的,或者可以用逗号隔开要同时显示的不同类别。输入顺序将作为读取顺序,每个仅能输入一次。

    命令语法:
    cut [选项] [ 文件 ]


    5.2.4 comm:逐行比较两个已排过序的文件

    比较两个已排过序的文件,并将其结果显示出来。

    命令语法:
    comm [选项] [文件1] [文件2]


    5.2.5 diff:逐行比较两个文本文件,列出其不同之处

    逐行比较两个文本文件,列出其不同之处。它比comm命令能完成更复杂的检查,它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,不要求事先对文件进行排序。

    命令语法:
    diff [选项] [文件1] [文件2]

    5.3 文件和命令查找

    5.3.1 grep:查找文件中符合条件的字符串
    5.3.2 find:列出文件系统内符合条件的文件
    5.3.3 locate:在数据库中查找文件
    5.3.1 grep:查找文件中符合条件的字符串
    5.3.2 find:列出文件系统内符合条件的文件
    5.3.3 locate:在数据库中查找文件

    5.3.1 grep:查找文件中符合条件的字符串
    查找文件内符合条件的字符串。
    命令语法:
    grep [选项] [查找模式] [文件名]


    5.3.2 find:列出文件系统内符合条件的文件

    将文件系统内符合条件的文件列出来,可以指定文件的名称、类别、时间、大小以及权限等不同信息的组合,只有完全相符的文件才会被列出来。

    命令语法:
    find [路径] [选项]


    5.3.3 locate:在数据库中查找文件

    使用locate命令可以通过数据库(/var/lib/mlocate/mlocate.db文件)来查找文件,这个数据库每天由cron程序来建立。当创建好这个数据库后,就可以方便地搜寻所需文件了,它比find命令的搜索速度还要快。

    命令语法:
    locate [选项][范本样式]

    5.4系统信息显示

    5.4.1 uname:显示计算机及操作系统相关信息
    5.4.2 hostname:显示或修改计算机主机名
    5.4.3 free:查看内存信息
    5.4.4 du:显示目录或文件的磁盘占用量

    5.4.1 uname:显示计算机及操作系统相关信息
    显示计算机以及操作系统的相关信息,比如计算机硬件架构、内核发行号、操作系统名称、计算机主机名等。

    命令语法:
    uname [选项]


    5.4.2 hostname:显示或修改计算机主机名

    显示或修改计算机的主机名。

    命令语法:
    hostname [选项] [主机名|-F <文件>] 设置主机名
    hostname [选项] 显示格式化主机名


    5.4.3 free:查看内存信息

    显示系统的物理内存和swap的使用情况。

    命令语法:
    free [选项]


    5.4.4 du:显示目录或文件的磁盘占用量

    显示目录或文件的磁盘占用量。逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块的情况。如果没有给出文件或目录名称,那么就对当前目录进行统计。

    命令语法:
    du [选项] [文件|目录]


    5.5日期和时间

    5.5.1 cal:显示日历信息
    5.5.2 date:显示和设置系统日期和时间
    5.5.3 hwclock:查看和设置硬件时钟

    5.5.1 cal:显示日历信息
    显示计算机系统的日历。

    命令语法:
    cal [选项] [[[日] 月] 年]


    5.5.2 date:显示和设置系统日期和时间

    显示和设置计算机系统的日期和时间。只有超级用户才有权限使用date命令设置日期和时间,而一般用户只能使用date命令显示日期和时间。

    命令语法:
    date [选项] [显示时间格式](以+开头,后面接格式)


    5.5.3 hwclock:查看和设置硬件时钟

    查看和设置硬件时钟(RTC),可以显示现在时钟,调整硬件时钟,将系统时间设置成与硬件时钟一致,或是把系统时间回存到硬件时钟。

    命令语法:
    hwclock [选项]


    5.6 信息交流

    5.6.1 echo:在显示器上显示文字
    5.6.2 mesg:允许或拒绝写消息
    5.6.3 wall:对全部已登录用户发送信息
    5.6.4 write:向用户发送消息

    5.6.1 echo:在显示器上显示文字
    在计算机显示器上显示一段文字,一般起到一个提示的作用。字符串可以加引号,也可以不加引号。用echo命令输出加引号的字符串时,将字符串按原样输出;用echo命令输出不加引号的字符串时,将字符串中的各个单词作为字符串输出,各字符串之间用一个空格分隔。

    命令语法:
    echo [选项] [字符串]


    5.6.2 mesg:允许或拒绝写消息

    控制系统中的其它用户是否能够用 write 命令或 talk 命令向您发送消息。不带选项的情况下,mesg 命令显示当前主机消息许可设置。

    命令语法:
    mesg [选项]


    5.6.3 wall:对全部已登录用户发送信息

    对全部已登录的用户发送信息。

    命令语法:
    wall [消息]


    5.6.4 write:向用户发送消息

    向用户发送消息。

    命令语法:
    write [用户] [终端名称]

    5.7 其他命令

    5.7.1 clear:清除计算机屏幕信息
    5.7.2 uptime:显示系统已经运行的时间

    5.7.1 clear:清除计算机屏幕信息
    清除屏幕上的信息,该命令类似于Windows系统命令行中的cls命令。

    命令语法:
    clear


    5.7.2 uptime:显示系统已经运行的时间

    显示系统已经运行了多长时间,它依次显示下列信息:现在时间、系统已经运行了多长时间、目前有多少登录用户、系统在过去的1分钟、5分钟和15分钟内的平均负载。

    命令语法:
    uptime [选项]


    第六章 shell编程

    6.1 熟悉Shell程序的创建

    6.1.1 语法基本介绍
    6.1.2 Shell程序的创建过程

    6.1.1 语法基本介绍
    1.开头
    2.注释
    3.执行命令


    6.1.2 Shell程序的创建过程

    1.创建文件
    2.设置可执行权限
    3.执行Shell程序
    4.使用bash命令执行程序


    6.2 shell变量

    6.2.1 Shell定义的环境变量
    6.2.2 用户定义的变量
    6.2.3 位置参数
    6.2.4 预定义变量
    6.2.5 参数置换的变量

    6.2.1 Shell定义的环境变量
    Shell在开始执行时就已经定义了一些与系统的工作环境有关的变量,用户还可以重新定义这些变量。


    常用的shell变量
    在这里插入图片描述6.2.2 用户定义的变量
    用户可以按照下面的语法规则定义自己的变量。
    变量名=变量值

    在定义变量时,变量名前不应该加符号“ ” , 在 引 用 变 量 的 内 容 时 则 应 在 变 量 名 前 加 符 号 “ ”,在引用变量的内容时则应在变量名前加符号“ ”。在给变量赋值时,等号两边一定不能留空格,若变量中本身就包含了空格,则整个字符串都要用双引号括起来。在编写Shell程序时,为了使变量名和命令名相区别,建议所有的变量名都用大写字母来表示。


    6.2.3 位置参数

    位置参数是一种在调用Shell程序的命令行中按照各自的位置决定的变量,是在程序名之后输入的参数。位置参数之间用空格分隔,Shell取第一个位置参数替换程序文件中的$1,第二个替换$2,依次类推。$0是一个特殊的变量,它的内容是当前这个Shell程序的文件名,所以$0不是一个位置参数,在显示当前所有的位置参数时是不包括$0的。


    6.2.4 预定义变量

    预定义变量和环境变量相类似,也是在Shell一开始时就定义了的变量。所不同的是,用户只能根据Shell的定义来使用这些变量,所有预定义变量都是由符号“$”和另一个符号组成的。


    常用的shell预定义变量

    在这里插入图片描述
    6.2.5 参数置换的变量

    Shell提供了参数置换功能以便用户可以根据不同的条件来给变量赋不同的值。参数置换的变量有四种,这些变量通常与某一个位置参数相联系,根据指定的位置参数是否已经设置决定变量的取值。
    在这里插入图片描述


    6.3 变量表达式

    6.3.1 字符串比较
    6.3.2 数字比较
    6.3.3 逻辑测试
    6.3.4 文件操作测试

    test是Shell程序中的一个表达式,通过和Shell提供的if等条件语句相结合可以方便地测试字符串、文件状态和数字。其语法如下所示。
    test [表达式]

    表达式所代表的操作符有字符串操作符、数字操作符、逻辑操作符以及文件操作符。其中文件操作符是一种Shell特有的操作符,因为Shell里的变量都是字符串,为了达到对文件进行操作的目的,于是才提供了这样的一种操作符。

    6.3.1 字符串比较
    字符窜比较是用来测试字符串是否相同、长度是否为0、字符串是否为null。
    在这里插入图片描述


    6.3.2 数字比较
    数字比较是用来测试数字大小的
    在这里插入图片描述


    6.3.3 逻辑测试
    逻辑测试是用来测试文件是否存在
    在这里插入图片描述


    6.3.4 文件操作测试
    文件操作测试表达式通常是为了测试文件的文件操作逻辑。
    在这里插入图片描述

    6.4 shell条件判断语句

    6.4.1 if条件语句
    6.4.2 case条件语句

    6.4.1 if条件语句
    Shell程序中的条件分支是通过if条件语句来实现的,其语法格式有if-then-fi语句和if-then-else-fi语句两种。
    if-then-fi语句
    语法格式:
    if 命令行1
    then
    命令行2
    fi

    if-then-else-fi语句
    语法格式:
    if
    命令行1
    then
    命令行2
    else
    命令行3
    fi


    6.4.2 case条件语句
    语法格式:
    if 命令行1
    then
    命令行2
    fi

    6.5 Shell循环控制语句

    6.5.1 for循环语句
    6.5.2 while循环语句
    6.5.3 until循环语句

    6.5.1 for循环语句
    for循环语句对一个变量的可能的值都执行一个命令序列。赋给变量的几个数值既可以在程序中以数值列表的形式提供,也可以在程序以外以位置参数的形式提供。

    for循环语句的语法格式如下所示。
      for 变量名  [in数值列表]
      do
       若干个命令行
      done


    6.5.2 while循环语句

    While语句是用命令的返回状态值来控制循环的。

    语法格式:
      while
       若干个命令行1
      do
       若干个命令行2
      done


    6.5.3 until循环语句

    until循环语句是另外一种循环结构,它和while语句相类似。

    语句格式:
      until
       若干个命令行1
      do
       若干个命令行2
      done


    第7章 用户和组群账户管理

    7.1 用户账户简介
    7.2 用户账户设置
    7.3 组群账户简介
    7.4 组群账户设置
    7.5 用户和组群账户维护

    7.1 用户账户简介

    7.1.1 用户账户分类
    7.1.2 /etc/passwd文件
    7.1.3 /etc/shadow文件

    7.1.1 用户账户分类
    用户账户在Linux系统中是分角色的,由于角色不同,每个用户的权限和所能完成的任务也不同。而在实际的管理中,用户的角色是通过UID(用户ID号)来标识的,每个用户的UID都是不同的。
    1.root用户
    2.系统用户
    3.普通用户

    7.1.2 /etc/passwd文件
    /etc/passwd文件是系统识别用户的一个重要文件,Linux系统中所有的用户都记录在该文件中。假设用户以账户zhangsan登录系统时,系统首先会检查/etc/passwd文件,看是否有zhangsan这个账户,然后确定用户zhangsan的UID,通过UID来确认用户的身份,如果存在则读取/etc/shadow文件中所对应的密码。如果密码核实无误则登录系统,读取用户的配置文件。
    任何用户都可以读取/etc/passwd文件内容,在/etc/passwd文件中,每一行表示的是一个用户账户的信息,一行有7个段位,每个段位用“:”分隔。
    在这里插入图片描述
    7.1.3 /etc/shadow文件
    /etc/shadow文件是/etc/passwd的影子文件,这个文件并不是由/etc/passwd文件产生,这两个文件应该是对应互补的。/etc/shadow文件内容包括用户及被加密的密码以及其它/etc/passwd不能包括的信息,比如用户账户的有效期限等。
    /etc/shadow文件只有root用可以读取和操作,文件的权限不能随便更改为其它用户可读,这样做是非常危险的。如果发现这个文件的权限变成了其它组群或用户可读了,要进行检查,以防系统安全问题的发生。
    /etc/shadow文件的内容包括9个段位,每个段位之间用“:”分隔。
    在这里插入图片描述

    7.2用户账户设置

    7.2.1 创建用户账户
    7.2.2 修改用户账户
    7.2.3 删除用户账户

    7.2.1 创建用户账户
    创建用户账户就是在系统中创建一个新账户,为新账户分配用户UID、组群、主目录和登录Shell等资源,新创建的用户账户默认是被锁定的,无法使用,需要使用passwd命令设置密码以后才能使用。创建用户账户就是在/etc/passwd文件中为新用户增加一条记录,同时更新/etc/shadow和/etc/group文件。

    使用useradd命令都可以在Linux系统中创建用户账户。

    命令语法:
    useradd [选项] [用户名]

    7.2.2 修改用户账户

    使用usermod命令可以更改用户的Shell类型、所属的组群、用户密码的有效期,还能更改用户的登录名。

    命令语法:
    usermod [选项][用户名]

    7.2.3 删除用户账户

    使用userdel命令可以在Linux系统中删除用户账户,甚至连用户的主目录也一起删除。

    命令语法:
    userdel [选项][用户名]

    7.3组群账户简介

    7.3.1 组群账户分类
    7.3.2 /etc/group文件
    7.3.3 /etc/gshadow文件

    7.3.1 组群账户分类
    具有某种共同特征的用户集合就是组群。通过组群可以集中设置访问权限和分配管理任务。
    在Linux系统中,有两种组群分类方法,一种方法将组群分为私有组群和标准组群。
    1.私有组群
    2.标准组群
    另外一种方法将组群分为主要组群和次要组群。
    1.主要组群
    2.次要组群

    7.3.2 /etc/group文件
    /etc/group文件是组群的配置文件,内容包括用户和组群,并且能显示出用户是归属哪个组群或哪几个组群。一个用户可以归属一个或多个不同的组群,同一组群的用户之间具有相似的特征。比如把某一用户加入到root组群,那么这个用户就可以浏览root用户主目录的文件,如果root用户把某个文件的读写执行权限开放,root组群的所有用户都可以修改此文件;如果是可执行的文件,root组群的用户也是可以执行的。
    组群的特性在系统管理中为系统管理员提供了极大的方便,但安全性也是值得关注的,如某个用户有对系统管理有最重要的内容,最好让用户拥有独立的组群,或者把用户的文件的权限设置为完全私有。
    /etc/group文件的内容包括组群名、组群密码、GID及该组群所包含的用户,每个组群一条记录,一行有4个段位,每个段位用“:”分隔。
    在这里插入图片描述组群GID和UID类似,是一个从0开始的正整数,GID为0的组群是root组群。Linux系统会预留GID号1~999给系统虚拟组群使用,创建的新组群GID是从1000开始的,查看系统创建组群默认的GID范围应该查看/etc/login.defs中的GID_MIN和GID_MAX值,可以使用以下命令查看。

    7.3.3 /etc/gshadow文件
    /etc/gshadow是/etc/group的加密文件,组群密码就是存放在这个文件中。/etc/gshadow和/etc/group是互补的两个文件;对于大型服务器,针对很多用户和组群,定制一些关系结构比较复杂的权限模型,设置组群密码是很有必要的。比如不想让一些非组群成员永久拥有组群的权限和特性,可以通过密码验证的方式来让某些用户临时拥有一些组群特性,这时就要用到组群密码。
    /etc/gshadow文件中每个组群都有一条记录。一行有4个段位,每个段位用“:”分隔。
    在这里插入图片描述

    7.4组群账户设置

    7.4.1 创建组群账户
    7.4.2 修改组群账户
    7.4.3 删除组群账户

    7.4.1 创建组群账户
    使用groupadd命令可以在Linux系统中创建组群账户。

    命令语法:
    groupadd [选项] [组群名]

    7.4.2 修改组群账户
    使用groupmod命令可以在Linux系统中修改组群账户,比如组群名称、GID等。

    命令语法:
    groupmod [选项][组群名]

    7.4.3 删除组群账户
    使用groupdel命令可以在Linux系统中删除组群账户。如果该组群中仍旧包括某些用户,那么必须先删除这些用户后,才能删除组群。

    命令语法:
    groupdel [组群名]

    7.5 用户和组群账户维护

    7.5.1 passwd命令
    7.5.2 gpasswd命令
    7.5.3 su命令
    7.5.4 newgrp命令
    7.5.5 groups 命令
    7.5.6 id命令

    7.5.1 passwd命令
    设置或修改用户的密码,普通用户和超级权限用户都可以运行passwd,普通用户只能更改自己的用户密码,root用户可以设置或修改任何用户的密码。如果passwd 命令后面不接任何选项或用户名,则表示修改当前用户的密码。

    命令语法:
    passwd [选项] [用户名]

    7.5.2 gpasswd命令
    设置一个组群的组群密码,或者是在组群中添加、删除用户。

    命令语法:
    gpasswd [选项] [组群名]

    7.5.3 su命令
    使用su命令可以切换到其它用户账户进行登录。如果su命令不加任何选项,默认为切换到root用户,并且不改变Shell环境。

    命令语法:
    su [选项] [用户]

    7.5.4 newgrp命令
    让用户账户以另一个组群的身份进行登录。newgrp命令是以相同的账户名,不同的组群身份登录系统。如果要使用newgrp命令切换组群,用户必须是该组群的用户,否则将无法登录指定的组群。单一用户如果要同时隶属多个组群,需要利用交替用户的设置。如果不指定组群名称,则newgrp命令会登录该用户名称的预设组群。

    命令语法:
    newgrp [组群名]

    7.5.5 groups 命令
    使用groups命令可以显示指定用户账户的组群成员身份。

    命令语法:
    groups [用户名]

    7.5.6 id命令
    使用id命令可以显示用户的UID以及该用户所属组群的GID。

    命令语法:
    id [选项] [用户名]


    # 第8章 磁盘分区和文件系统管理 8.1 磁盘分区和格式化简介 8.2 Linux磁盘分区 8.3 创建文件系统 8.4 挂载和卸载文件系统 8.5 开机自动挂载文件系统 8.6 使用交换空间

    8.1 磁盘分区和格式化简介

    8.1.1 什么是磁盘分区
    8.1.2 什么是格式化

    8.1.1 什么是磁盘分区
    磁盘分区是指对硬盘物理介质的逻辑划分。将磁盘分成多个分区,不仅仅利于对文件的管理,而且不同的分区可以建立不同的文件系统,这样才能在不同的分区上安装不同的操作系统。
    分区就是磁盘的“段落”,如果用户希望在计算机上安装多个操作系统,将需要更多的分区。假设需要同时安装Windows 10和Windows Server 2012系统,那么至少需要两个分区,原因是不同的操作系统原则上采用不同的文件系统。如果几个操作系统都支持相同的文件系统,通常为了避免在一个分区下有相同的系统目录,也将它们安装在不同的磁盘分区上。在Linux系统中,情况又有所不同,它本身又需要更多的磁盘分区,比如根分区“/”和swap分区。
    磁盘分区一共有三种:主分区、扩展分区和逻辑驱动器。扩展分区只不过是逻辑驱动器的“容器”,实际上只有主分区和逻辑驱动器才能进行数据存储。在一块磁盘上最多只能有四个主分区,可以另外建立一个扩展分区来代替四个主分区的其中一个,然后在扩展分区下可以建立更多的逻辑驱动器。 
    在Linux系统中进行分区可以使用fdisk和parted等命令,或者使用相同功能的图形界面程序。

    8.1.2 什么是格式化
    磁盘经过分区之后,下一个步骤就是要对磁盘分区进行格式化的工作(也就是创建文件系统的工作)。格式化是指对磁盘分区进行初始化的一种操作,这种操作通常会导致现有的分区中所有的数据被清除。简单说,就是把一张空白的磁盘划分成一个个小区域并编号,供计算机储存和读取数据使用。
    格式化是在磁盘中建立磁道和扇区,建立好之后,计算机才可以使用磁盘来储存数据。格式化的动作通常是在磁盘的开端写入启动扇区的数据、在根目录记录磁盘卷标、为文件分配表保留一些空间,以及检查磁盘上是否有损坏的扇区,如果有的话则在文件分配表标上损毁的记号,表示该扇区并不用来储存数据。     通过分区当然不能产生任何文件系统。在分区之后只是对磁盘上的磁盘空间进行了保留,还不能直接使用,在此之后分区必须要进行格式化。在Windows系统下可以通过资源管理器下的文件菜单或者format程序来执行,而在Linux系统中大多使用mkfs命令来完成。
    Linux系统支持不同的文件系统,目前应用最广泛的就是xfs和ext4。

    8.2 Linux磁盘分区

    使用fdisk命令可以用来对磁盘进行分区,它采用传统的问答式界面,除此之外还可以用来查看磁盘分区的详细信息,也能为每个分区指定分区的类型。

    命令语法:
    fdisk [选项] [设备]

    • fdisk交互式操作子命令

    在这里插入图片描述

    • Linux常用分区类型

    在这里插入图片描述

    • 更新分区表,使内核识别分区

    root@rhel ~]# partprobe

    8.3 创建文件系统

    8.3.1 Linux主流文件系统
    8.3.2 创建文件系统

    8.3.1 Linux主流文件系统
    对一个新的磁盘进行分区以后,还要对这些分区进行格式化并创建文件系统。一个分区只有建立了某种文件系统后,这个分区才能使用。建立文件系统的过程,就是用相应的格式化工具格式化分区的过程,这个过程和在Windows系统中格式化某个分区为NTFS分区的过程类似。
    文件系统是指文件在硬盘上的存储方法和排列顺序。在Linux系统中,每个分区都需要一个文件系统,都有自己的目录层次结构。Linux系统最重要特征之一就是支持多种文件系统,这样它更加灵活,并可以和其他种操作系统共存。
    随着Linux系统的不断发展,它所支持的文件系统类型也在迅速扩充,其中有XFS、ext4、ReiserFS、JFS、ext2、ext3、ISO9660、MSDOS,VFAT、NFS等。

    8.3.2 创建文件系统
    如果在计算机上新增加了一块硬盘,需要格式化成 Linux文件系统,最好选择xfs或ext4文件系统。使用mkfs命令可以在分区上创建各种文件系统。mkfs命令本身并不执行建立文件系统的工作,而是去调用相关的程序来执行。这里的文件系统是要指定的,比如xfs、ext4、ext3、vfat或者是msdos等。

    命令语法:
    mkfs [选项] [设备]

    8.4 挂载和卸载文件系统

    8.4.1 挂载文件系统
    8.4.2 卸载文件系统
    8.4.3 查看磁盘分区挂载情况

    8.4.1 挂载文件系统
    使用mount命令可以将指定分区、光盘、U盘或者是移动硬盘挂载到Linux系统的目录下。

    命令语法:
    mount [选项] [设备] [挂载目录]

    • mount命令挂载选项
      在这里插入图片描述

    8.4.2 卸载文件系统
    使用umount命令可以将指定分区、光盘、U盘或者是移动硬盘进行卸载。umount可以卸载目前挂载在Linux目录中的文件系统, 除了直接指定文件系统外,也可以使用设备名称或挂载目录来表示文件系统。

    命令语法:
    umount [选项] [设备|挂载目录]

    8.4.3 查看磁盘分区挂载情况
    要查看Linux系统上的磁盘分区挂载情况,可以使用df命令来获取信息。使用df命令可以显示每个文件所在的文件系统的信息,默认是显示所有文件系统。检查文件系统的磁盘空间使用情况,利用该命令获取硬盘使用了多少空间、目前还剩下多少空间等相关信息。

    命令语法:
    df [选项] [文件]

    8.5 开机自动挂载文件系统

    8.5.1 /etc/fstab文件简介
    8.5.2 设置开机自动挂载文件系统

    8.5.1 /etc/fstab文件简介
    /etc/fstab文件包含了所有磁盘分区以及存储设备的信息。其中包含了磁盘分区和存储设备如何挂载,以及挂载在什么目录上的信息。/etc/fstab文件是一个简单的文本文件,必须要以root用户登录才可以编辑该文件。
    如果在Linux系统中不能访问Windows的分区,或者做为一名普通用户,不能挂载光驱和向软盘中写入数据,或者在管理CD-RW的过程中遇到了问题,就有可能是错误地配置了/etc/fstab文件,通常可以通过编辑/etc/fstab文件来解决前面提到的问题。
    由于每一台计算机系统的磁盘分区和设备属性不同,所以/etc/fstab文件也不一样,但是基本的结构总是相似的。每一行都包含着一个设备或磁盘分区的信息,每一行又有多个列的信息。
    /etc/fstab文件构成

    1. 设备
    2. 挂载目录
    3. 文件系统类型
    4. 挂载选项
    5. 文件系统检查选项

    8.5.2 设置开机自动挂载文件系统

    1. 使用设备名
    2. 使用UUID
    3. 使用卷标

    8.6 使用交换空间

    8.6.1 使用交换分区
    8.6.2 使用交换文件

    8.6.1 使用交换分区
    Linux系统中的交换空间在物理内存被用完时使用。如果系统需要更多的内存资源,而物理内存已经用完,内存中不活跃的页就会被转移到交换空间中。虽然交换空间可以为带有少量内存的计算机提供帮助,但是这种方法不应该被当做是对内存的取代。
    用户有时需要在安装Linux系统后添加更多的交换空间,可以通过添加一个交换分区(推荐优先使用)或添加一个交换文件来实现。交换空间的总大小一般为计算机物理内存的1~2倍左右,计算机物理内存越大,倍数越小。

    8.6.2 使用交换文件
    添加交换分区

    1. 创建磁盘分区
    2. 创建交换分区
    3. 启用交换分区
    4. 确认已经启用交换分区
    5. 编辑/etc/fstab文件

    删除交换分区

    1. 禁用交换分区
    2. 编辑/etc/fstab文件

    添加交换文件

    1. 创建/swapfile文件
    2. 创建交换文件
    3. 启用交换文件
    4. 查看交换文件是否启用
    5. 编辑/etc/fatab文件

    删除交换文件

    1. 禁用交换文件
    2. 删除/swapfile文件
    3. 编辑/etc/fatab文件

    第9章 软件包管理

    本章内容
    9.1 RPM软件包管理
    9.2 使用yum管理RPM软件包
    9.3 tar包管理

    9.1 RPM软件包管理

    9.1.1 RPM软件包简介
    9.1.2 管理RPM软件包

    9.1.1 RPM软件包简介

    什么是RPM软件包
    RPM(Red Hat Package Manager,Red Hat软件包管理器)是一种开放的软件包管理系统,按照GPL条款发行,可以运行于各种Linux系统上。
    RPM简化了Linux系统安装、卸装、更新和升级的过程,只需要使用简短的命令就可完成。RPM维护一个已经安装软件包和它们的文件的数据库,因此,可以在系统上使用查询和校验软件包功能。
    RPM允许把软件编码包装成源码包和程序包,然后提供给终端用户,这个过程非常简单,这种对用户的纯净源码、补丁和建构指令的清晰描述减轻了发行软件新版本所带来的维护负担。Linux系统上的所有软件都被分成可被安装、升级或卸载的RPM软件包。

    **RPM软件包管理用途 **

    • 可以安装、删除、升级、刷新和管理RPM软件包;
    • 通过RPM软件包管理能知道软件包包含哪些文件,也能知道系统中的某个文件属于哪个RPM软件包;
    • 可以查询系统中的RPM软件包是否安装并查询其安装的版本;
    • 开发者可以把自己的程序打包为RPM软件包并发布;
    • 软件包签名GPG和MD5的导入、验证和签名发布;
    • 依赖性的检查,查看是否有RPM软件包由于不兼容而扰乱系统。

    RPM软件包管理基本操作模式
    RPM软件包管理主要有安装(添加)、删除(卸载)、刷新、升级、查询这五种基本操作模式,

    9.1.2 管理RPM软件包

    安装RPM软件包
    使用rpm命令可以在Linux系统中安装、删除、刷新、升级、查询RPM软件包。

    命令语法:
    rpm -ivh [RPM软件包文件名称]

    删除RPM软件包
    使用rpm -e命令可以在Linux系统中删除RPM软件包。

    命令语法:
    rpm -e [RPM包名称]

    升级RPM软件包
    使用rpm -Uvh命令可以在Linux系统中升级RPM软件包,升级软件包实际上是删除和安装的组合。不管该软件包的早期版本是否已被安装,升级选项都会安装该软件包。

    命令语法:
    rpm -Uvh [RPM软件包文件名称]

    刷新软件包
    使用rpm -Fvh命令可以在Linux系统中刷新RPM软件包。使用RPM刷新软件包时,系统会比较指定的软件包的版本和系统上已安装的版本。当RPM的刷新选项处理的版本比已安装的版本更新,它就会升级到更新的版本。如果软件包先前没有安装,RPM的刷新选项将不会安装该软件包,这和RPM的升级选项不同。

    命令语法:
    rpm -Fvh [RPM软件包文件名称]

    查询指定RPM软件包是否已经安装
    命令语法:
    rpm -q [RPM包名称]

    查询系统中所有已经安装的RPM软件包
    命令语法:
    rpm -qa

    查询已安装RPM软件包的描述信息
    命令语法:
    rpm -qi [RPM包名称]

    查询指定已安装RPM软件包所包含的文件列表
    命令语法:
    rpm -ql [RPM包名称]

    查询RPM软件包的依赖关系
    命令语法:
    rpm -qR [RPM包名称]

    查询系统中指定文件属于哪个RPM软件包
    命令语法:
    rpm -qf [文件名]

    9.2 使用yum管理RPM软件包

    9.2.1 什么是yum
    9.2.2 yum软件仓库配置文件
    9.2.3 创建本地软件仓库
    9.2.4 yum命令使用

    什么是yum
    在Linux系统中安装软件包使用rpm命令,但是使用rpm命令安装软件包特别的麻烦,原因在于需要手动寻找安装该软件包所需要的一系列依赖关系。当软件包不用时需要卸载的话,由于卸载掉了某个依赖关系而导致其它的软件包不能用。
    yum(Yellow dog Updater Modified)起初是由Terra Soft研发,其宗旨是自动化地升级、安装和删除RPM软件包,收集RPM软件包的相关信息,检查依赖性并且一次安装所有依赖的软件包,无须繁琐地一次次安装。
    yum的关键之处是要有可靠的软件仓库,软件仓库可以是HTTP站点、FTP站点或者是本地软件池,但必须包含rpm的header,header包括了RPM软件包的各种信息,包括描述、功能、提供的文件以及依赖性等。正是收集了这些header并加以分析,才能自动化地完成余下的任务。

    yum特点
    可以同时配置多个软件仓库;
    简洁的配置文件/etc/yum.conf;
    自动解决安装或者删除RPM软件包时遇到的依赖性问题;
    使用yum非常方便;
    保持与RPM数据库的一致性。

    **yum软件仓库配置文件 **
    repo文件是Linux系统中yum源(软件仓库)的配置文件,通常一个repo文件定义了一个或者多个软件仓库的细节内容,比如从哪里下载需要安装或者升级的软件包,repo文件中的设置内容将被yum读取和应用。软件仓库配置文件默认存储在/etc/yum.repos.d目录中。

    **创建本地软件仓库 **

    1. 安装软件包
    2. 复制软件包
    3. 创建软件仓库配置文件
    4. 建软件仓库

    **yum命令使用 **
    使用yum命令可以安装、更新、删除、显示软件包。yum可以自动进行系统更新,基于软件仓库的元数据分析,解决软件包依赖性关系。

    命令语法:
    yum [选项] [命令]

    9.3 tar包管理

    9.3.1 tar包简介
    9.3.2 tar包使用和管理
    9.3.3 tar包的特殊使用

    9.3.1 tar包简介
    Linux系统中最常使用的归档程序是tar,使用tar程序归档的包称为tar包,tar包文件的名称通常都是以“.tar”结尾的。生成tar包以后,还可以使用其它程序来对tar包进行压缩。tar可以为文件和目录创建备份。利用tar命令,用户可以为某一特定文件创建备份,也可以在备份中改变文件,或者向备份中加入新的文件。
    利用tar命令可以把一大堆的文件和目录打包成一个文件,这对于备份文件或是将几个文件组合成为一个文件进行网络传输是非常有用的。
    Linux系统中的很多压缩程序只能针对一个文件进行压缩,这样当需要压缩一大堆文件时,就得先借助其它的工具(比如tar)将这一大堆文件先打成一个包,然后再使用压缩程序进行压缩。

    9.3.2 tar包使用和管理
    使用tar命令可以将许多文件一起保存到一个单独的磁带或磁盘归档,并能从归档中单独还原所需文件。

    命令语法:
    tar [选项][文件|目录]

    9.3.3 tar包的特殊使用
    1.tar调用gzip
    使用tar命令可以在归档或者是解包的同时调用gzip压缩程序。以“.gz”结尾的文件就是gzip压缩的结果。与gzip相对应的解压缩程序是gunzip,tar命令中使用-z选项来调用gzip。

    2.tar调用bzip2
    使用tar命令可以在归档或者是解包的同时调用bzip2压缩程序。以“.bz2”结尾的文件就是bzip2压缩的结果。与bzip2相对应的解压缩程序是bunzip2。tar命令中使用-j选项来调用bzip2。

    3.tar调用xz
    使用tar命令可以在归档或者是解包的同时调用xz压缩程序。以“.xz”结尾的文件就是xz压缩的结果。tar命令中使用-J选项来调用。

    第10章 权限和所有者

    本章内容
    10.1 权限设置
    10.2 更改文件和目录所有者

    10.1 权限设置

    10.1.1 文件和目录权限简介
    10.1.2 设置文件和目录基本权限
    10.1.3 设置文件和目录特殊权限

    10.1.1 文件和目录权限简介
    在Linux系统中,用户对一个文件或目录具有访问权限,这些访问权限决定了谁能访问,以及如何访问这些文件和目录。通过设置权限可以限制或允许以下三种用户访问:文件的用户所有者(属主)、文件的组群所有者(用户所在组的同组用户)、系统中的其它用户。
    在Linux系统中,每一位用户都有对文件或目录的读取、写入和执行权限。第一套权限控制访问自己的文件权限,即所有者权限。第二套权限控制用户组访问其中一个用户的文件的权限。第三套权限控制其它所有用户访问一个用户的文件的权限。这三套权限赋予用户不同类型(即用户所有者、组群所有者和其它用户)的读取、写入及执行权限,这就构成了一个有九种类型的权限组。
    同时,用户能够控制一个给定的文件和目录的访问程度。一个文件和目录可能有读取、写入及执行权限。当创建一个文件时,系统会自动地赋予文件所有者读和写的权限,这样可以允许所有者能够显示文件内容和修改文件。文件所有者可以将这些权限更改为任何权限。一个文件也许只有读权限,禁止任何修改。文件也可能只有执行权限,允许它像一个程序一样执行。
    r、w、x、-字符意义
    r(读取):对文件而言,该用户具有读取文件内容的权限;对目录来说,该用户具有浏览目录的权限;
    w(写入):对文件而言,该用户具有新增、修改文件内容的权限;对目录来说,该用户具有删除、移动目录内文件的权限;
    x(执行):对文件而言,该用户具有执行文件的权限;对目录来来说,该用户具有进入目录的权限;
    -:表示不具有该项权限。

    **权限字符组合举例 **
    在这里插入图片描述**文字设定法设置权限 **
    通过文字设定法更改权限需要使用chmod命令,在一个命令行中可给出多个权限方式,其间用逗号隔开。

    chmod的命令语法如下:
    chmod [操作对象] [操作符号] [权限] [文件|目录]

    **操作对象 **
    在这里插入图片描述**操作符号 **
    在这里插入图片描述
    10.1.2 设置文件和目录基本权限
    **数字设定法设置权限 **
    文件和目录的权限表中用r、w、x这三个字符来为用户所有者、组群所有者和其它用户设置权限。有时候,字符似乎过于麻烦,因此还有另外一种方法是以数字来表示权限,而且仅需三个数字。
    使用数字设定法更改文件权限,首先必须了解数字表示的含义:0表示没有权限,1表示可执行权限,2表示写入权限,4表示读取权限,然后将其相加。

    权限字符转换为数字
    所有数字属性的格式应该是三个0~7的数,其顺序是u、g、o。
    r:对应数值4;
    w:对应数值2;
    x:对应数值1;
    -:对应数值0。

    权限字符转换为数字举例
    -rwx------:用数字表示为700;
    -rwxr–r--:用数字表示为744;
    -rw-rw-r-x:用数字表示为665;
    drwx–x--x:用数字表示为711;
    drwx------:用数字表示为700。

    数字设定法设置权限命令
    命令语法:
    chmod [n1n2n3] [文件|目录]

    n1表示用户所有者的权限 , n2表示组群所有者的权限,n3表示其它用户的权限。

    10.1.3 设置文件和目录特殊权限
    用户如果没有特殊的需求,一般是不需要启用特殊权限,避免出现安全方面的隐患。
    特殊权限有以下几种类型。
    (1)SUID
    对一个可执行文件,不是以发起者身份来获取资源,而是以可执行文件的用户所有者身份来执行。
    (2)SGID
    对一个可执行文件,不是以发起者身份来获取资源,而是以可执行文件的组群所有者身份来执行。 (3)Sticky
    对文件或目录设置Sticky之后,尽管其它用户有写权限,也必须由文件所有者执行删除和移动等操作。

    数字设定法设置特殊权限
    如果要设置特殊权限,就必须使用四位数字才能表示。
    特殊权限的对应数值如下表示。
    SUID:对应数值4;
    SGID:对应数值2;
    Sticky:对应数值1。

    10.2 更改文件和目录所有者

    文件和目录所有者简介
    文件和目录的创建者默认就是该文件和目录的所有者,他们对该文件和目录具有任何权限,可以进行任何操作。他们也可以将所有者转交给别的用户,使别的用户对该文件和目录具有任何操作权限。文件和目录的所有者及所属用户组也能修改,可以通过命令来修改。

    更改文件和目录所有者
    使用chown命令可以更改文件和目录的用户所有者和组群所有者。

    命令语法:
    chown [选项] [用户.组群] [文件|目录]
    chown [选项] [用户:组群] [文件|目录]

    第11章 Linux日常管理和维护

    本章内容
    11.1 进程管理
    11.2 任务计划
    11.3 Linux系统启动过程
    11.4 维护GRUB 2
    11.5 设置GRUB 2加密
    11.6 GRUB 2配置案例

    11.1 进程管理

    11.1.1 进程概念
    11.1.2 查看系统进程信息
    11.1.3 杀死进程

    11.1.1 进程概念
    大多数系统都只有一个CPU和一个内存,但一个系统可能有多个二级存储磁盘和多个输入/输出设备。操作系统管理这些资源并在多个用户间共享资源,当提出一个请求时,操作系统监控着一个等待执行的任务队列,这些任务包括用户作业、操作系统任务、邮件和打印作业等。操作系统根据每个任务的优先级为每个任务分配合适的时间片,每个时间片大约都有零点几秒,虽然看起来很短,但实际上已经足够计算机完成成千上万的命令集。每个任务都会被系统运行一段时间,然后挂起,系统转而处理其它任务。过一段时间以后再回来处理这个任务,直到某个任务完成,从任务队列中去除。
    Linux系统上所有运行的内容都可以称为进程。每个用户任务、每个系统管理守护进程都可以称为进程。Linux系统用分时管理方法使所有的任务共同分享系统资源。我们讨论进程的时候,不会去关心这些进程究竟是如何分配的,或者内核是如何管理、分配时间片的,我们所关心的是如何去控制这些进程,让它们能够很好地为用户服务。
    进程是在自身的虚拟地址空间运行的一个单独的程序。进程与程序之间还是有明显区别的。程序只是一个静态的命令集合,不占系统的运行资源;而进程是一个随时都可能发生变化的、动态的、使用系统运行资源的程序。一个程序可以启动多个进程。和进程相比较,作业是一系列按一定顺序执行的命令。一条简单的命令可能会涉及多个进程,尤其是当使用管道和重定向时。

    进程具有的特征
    动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生、动态消亡的。
    并发性:任何进程都可以同其它进程一起并发执行。
    独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。
    异步性:由于进程间的相互制约,使得进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。
    结构特征:进程由程序、数据和进程控制块三部分组成。
    多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。

    进程种类
    交互式进程:一个由Shell启动并控制的进程,交互式进程既可在前台运行,也可在后台运行。
    批处理进程:与终端无关,安排在指定时刻完成的一系列进程。
    守护进程:在引导系统时启动,以执行即时的操作系统任务,比如crond、rsyslogd、named等。

    11.1.2 查看系统进程信息
    ps命令
    是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行以及进程运行的状态、进程是否结束、进程有没有僵死,以及哪些进程占用了过多的资源等。

    命令语法:
    ps [选项]

    top命令
    使用top命令可以显示当前正在运行的进程以及关于它们的重要信息,包括它们的内存和CPU使用量。执行top命令可以显示目前正在系统中执行的进程,并通过它所提供的互动式界面,用热键加以管理。要退出top,按[q] 键即可。

    命令语法:
    top [选项]

    11.1.3 杀死进程
    要关闭某个应用程序可以通过杀死其进程的方式实现,如果进程一时无法杀死,可以将其强制杀死。使用kill命令可以杀死进程。在使用kill命令之前,需要得到要被杀死的进程的PID(进程号)。用户可以使用ps命令获得进程的PID,然后用进程的PID作为kill命令的参数。

    命令语法:
    kill [选项] [进程号]

    11.2 任务计划

    11.2.1 /etc/crontab文件实现任务计划
    11.2.2 使用crontab命令实现任务计划

    11.2.1 /etc/crontab文件详解
    root用户通过修改/etc/crontab文件可以实现任务计划,而普通用户却无法修改该文件。crond守护进程可以在无需人工干预的情况下,根据时间和日期的组合来调度执行重复任务。
    /etc/crontab文件前面3行是用来配置cron任务运行环境的变量。Shell变量的值告诉系统要使用哪个Shell环境(在这个例子里是/bin/bash)。PATH变量定义用来执行命令的路径。cron任务的输出被邮寄给MAILTO变量定义的用户名。如果MAILTO变量被定义为空白字符串,电子邮件就不会被寄出。

    /etc/crontab文件内容
    在这里插入图片描述
    时间格式
    在这里插入图片描述

    11.2.2 使用crontab命令实现任务计划

    • crontab命令简介
      root以外的用户可以使用crontab命令配置cron任务。所有用户定义的crontab都被保存在/var/spool/cron目录中,并使用创建它们的用户身份来执行。
      以某位用户身份创建一个crontab项目,登录为该用户,然后输入crontab -e命令,使用由VISUAL或EDITOR环境变量指定的编辑器来编辑该用户的crontab。该文件使用的格式和/etc/crontab相同。当对crontab所做的改变被保存后,该crontab文件会根据该用户名被保存在/var/spool/cron/文件中。
      crond守护进程每分钟都检查/etc/crontab文件、/etc/cron.d目录以及/var/spool/cron目录中的改变。如果发现了改变,它们就会被载入内存。
    • crontab命令语法
      使用crontab命令可以创建、修改、查看以及删除crontab条目。
      命令语法:
      crontab [选项]
      crontab [选项] [文件]
    • 创建crontab
      创建新的crontab,然后提交给crond进程,它将每隔十五分钟运行一次。同时,新创建crontab的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名。
    • 编辑创建crontab
      如果希望添加、删除或编辑/var/spool/cron/zhangsan文件,可以使用vi编辑器像编辑其它任何文件那样修改/var/spool/cron/zhangsan文件并保存退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时,crond会对其进行必要的完整性检查。如果其中的某个地方出现了超出允许范围的值,它会提示用户。
      最好在/var/spool/cron/zhangsan文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的作业。
    • 列出crontab
      【例11.13】 以root用户列出zhangsan的crontab。
      [root@rhel ~]# crontab -u zhangsan -l
      【例11.14】 以普通用户zhangsan列出自己的crontab。
      [zhangsan@rhel ~]$ crontab -l
      【例11.15】 对/var/spool/cron/zhangsan文件做备份。
      [zhangsan@rhel ~]$ crontab -l >/home/zhangsan/zhangsancron
    • 删除crontab
      删除crontab时也会删除/var/spool/cron目录中指定用户的文件。
    • 恢复丢失的crontab文件
      如果不小心误删除了crontab文件,且在主目录下还有一个备份,那么可以将其复制到/var/spool/cron/,其中是用户名。
      如果由于权限问题无法完成复制,可以使用以下命令,其中需要指定在用户主目录中复制的副本文件名。
      crontab [文件]

    11.3 Linux系统启动过程

    1.BIOS自检
    2.启动GRUB 2
    3.加载内核
    4.执行systemd进程
    5.初始化系统环境
    6.执行/bin/login程序

    11.4 维护GRUB 2

    11.4.1 GRUB 2简介
    11.4.2 GRUB 2主配置文件
    11.4.3 /etc/grub.d目录
    11.4.4 /etc/default/grub文件详解

    11.4.1 GRUB 2简介
    当计算机要引导操作系统时,BIOS会读取引导介质上最前面的主引导记录(MBR记录)。主引导记录本身要包含两类内容:引导加载程序和分区表。
    GRUB是Linux系统默认的引导加载程序。在Linux加载一个系统前,它必须由一个引导加载程序中的特定指令去引导系统。这个程序一般是位于系统的主硬盘驱动器或其他介质驱动器上。
    Linux安装程序允许用户快速、方便地配置引导加载程序,将其存放在主硬盘驱动的主引导记录中来引导操作系统。
    GNU GRUB是一个将引导加载程序安装到主引导记录的程序,主引导记录是位于一个硬盘开始的扇区。它允许位于主引导记录区中特定的指令来加载一个GRUB菜单或是GRUB的命令环境。这使得用户能够开始操作系统的选择,在内核引导时传递特定指令给内核,或是在内核引导前确定一些系统参数(如可用的RAM大小)。
    GRUB支持直接和链式加载的引导方法。GRUB能用于几乎所有操作系统、绝大多数流行的文件系统以及几乎所有的系统BIOS所能识别的硬盘。

    11.4.2 GRUB 2主配置文件

    GRUB 2的配置是通过以下三个地方的文件来完成的。
    /boot/grub2/grub.cfg文件(/etc/grub2.cfg文件是/boot/grub2/grub.cfg文件的软链接)。
    /etc/grub.d目录。
    /etc/default/grub文件(/etc/sysconfig/grub文件是/etc/default/grub文件的软链接)。
    他们的关系是/boot/grub2/grub.cfg文件里面通过“####BEGIN #####”这种格式按照顺序调用/etc/grub.d目录中的脚本实现不同的功能。/etc/grub.d目录中有很多数字开头的脚本,按照从小到大的顺序执行。以00_header为例,他又会调用/etc/default/grub 配置文件来实现最基本的开机界面配置。
    比如在/boot/grub2/grub.cfg文件里面调用/etc/grub.d/10_linux 来配置不同的内核,这里面有2个 menuentry(菜单项),所以开机的时候会看见两个默认选项,一个是普通模式,一个是救援模式。

    **GRUB 2中设备和分区命名规则 **

    GRUB 2采用模块化动态加载的思想,相比GRUB来讲不用在构建时将所有功能都加入,这使得GRUB 2的体积相比变得很小,整个GRUB 2的内核映像可以控制在31KB以内(GRUB的映像在百KB级别),因此GRUB 2完全可以移除GRUB中存在的stage 1.5阶段,而可以将整个映像放在GRUB中的stage1.5存放的位置。
    (1)图形接口。
    (2)使用模块机制,通过动态加载需要的模块来扩展功能。
    (3)支持脚本语言,比如条件判断、循环、变量和函数。
    (4)支持救援模式,可以用于系统无法引导的情况。
    (5)国际化语言。包括支持非ASCII的字符集和类似gettext的消息分类、字体、图形控制台等。
    (6)有一个灵活的命令行接口。如果不存在配置文件,GRUB 2会自动进入命令模式。
    (7)针对文件系统、文件、设备、驱动、终端、命令、分区表、系统加载的模块化、层次化、基于对象的框架。
    (8)支持多种文件系统格式。
    (9)可以访问已经安装在设备上的数据。
    (10)支持自动解压。
    GRUB 2同样以fd表示软盘,hd表示硬盘(包含IDE和SCSI硬盘)。设备是从0开始编号,分区则是从1开始,主分区从1~4,逻辑驱动器从5开始。
    下面讲解一下设备和分区的使用方法。
    (fd0):表示第一个软盘。
    (hd0):表示第一个硬盘(大多数U盘与USB接口的移动硬盘以及SD卡也都被当作硬盘看待)。
    (hd0,msdos1):表示第一个硬盘的第一个分区。
    (hd0,msdos1)/boot/vmlinuz-3.10.0-327.el7.x86_64:表示第一个硬盘的第一个分区下的boot目录下的vmlinuz-3.10.0-327.el7.x86_64文件。
    (hd1,msdos1) :表示第二硬盘的第一分区。
    (cd) :启动光盘(仅在从光盘启动GRUB时可用)。
    (cd0):第一个光盘。

    11.4.3 /etc/grub.d目录
    定义每个菜单项的所有脚本都存放在/etc/grub.d目录中,这些脚本的名称必须有两位的数字前缀,其目的是:在构建GRUB 2菜单时定义脚本的执行顺序以及相应菜单项的顺序,比如00_header文件首先被读取。
    在使用grub2-mkconfig命令生成配置文件时需要加载/etc/grub.d目录。
    在这里插入图片描述
    11.4.4 /etc/default/grub文件详解
    /etc/default/grub文件是一个文本文件,可以在该文件中设置通用配置变量和GRUB 2菜单的其它特性。在更改/etc/default/grub文件后,需要使用grub2-mkconfig命令更新GRUB 2配置文件才能使更改生效。

    11.5 设置GRUB 2加密

    11.5.1 GRUB 2加密简介
    11.5.2 设置GRUB 2 PBKDF2加密口令
    11.5.3 设置GRUB 2明文密码
    11.5.4 GRUB 2解锁

    11.5.1 GRUB 2加密简介
    由于GRUB 2负责引导Linux系统,作为系统中的第一道屏障的安全性非常重要,对GRUB 2进行加密可以实现安全性。
    在默认情况下,GRUB 2对于所有可以在物理上进入控制台的人都是可访问的。任何人都可以选择并编辑任意菜单项,并且可以直接访问GRUB命令行。要启用认证支持,必须将环境变量superusers设置为一组用户名(可以使用空格、逗号、分号作为分隔符),这样将只允许superusers(超级用户)中的用户使用GRUB命令行、编辑菜单项、以及执行任意菜单项。
    GRUB密码支持格式
    明文密码:密码数据没有经过加密,安全性差;
    PBKDF2加密密码:密码经过PBKDF2哈希算法进行加密,在文件中存储的是加密后的密码数据,安全性较高。

    11.5.2 设置GRUB 2 PBKDF2加密口令

    1. 生成PBKDF2加密口令
    2. 编辑/etc/grub.d/00_header文件
    3. 生成GRUB 2配置文件

    11.5.3 设置GRUB 2明文密码
    1.修改/etc/grub.d/00_header 文件
    2.生成GRUB 2配置文件

    11.5.4 GRUB 2解锁
    在这里插入图片描述

    11.6 GRUB 2配置案例

    11.6.1 破解root用户密码
    11.6.2 将网卡名称eno16777736更改为eth0

    11.6.2 将网卡名称eno16777736更改为eth0
    1.修改/etc/default/grub文件
    2.生成GRUB 2配置文件
    3.查看网卡名称

    第12章 Linux网络基本配置

    本章内容
    12.1 常用网络配置文件
    12.2 常用网络命令
    12.3 管理网络服务

    12.1 常用网络配置文件

    12.1.1 /etc/sysconfig/network-scripts/ifcfg-eno16777736文件
    12.1.2 /etc/resolv.conf文件
    12.1.3 /etc/hosts文件
    12.1.4 /etc/services文件

    12.1.1 /etc/sysconfig/network-scripts/ifcfg-eno16777736文件
    在Linux统中,系统网络设备的配置文件保存在/etc/sysconfig/network-scripts目录下,其中文件ifcfg-eno16777736包含一块网卡的配置信息,文件ifcfg-lo包含回路IP地址信息。

    12.1.2 /etc/resolv.conf文件
    /etc/resolv.conf文件是由域名解析器使用的配置文件。

    12.1.3 /etc/hosts文件
    当计算机启动时,在可以查询DNS以前,计算机需要查询一些主机名到IP地址的匹配。这些匹配信息存放在/etc/hosts文件中。在没有域名服务器的情况下,系统上的所有网络程序都通过查询该文件来解析对应于某个主机名的IP地址。

    12.1.4 /etc/services文件
    定义Linux系统中所有服务的名称、协议类型、服务的端口等信息。

    12.2 常用网络命令

    12.2.1 traceroute
    12.2.2 ifconfig
    12.2.3 ping
    12.2.4 netstat
    12.2.5 arp
    12.2.6 tcpdump

    12.2.1 traceroute
    显示数据包到目标主机之间的路径。traceroute命令使用户可以追踪网络数据包的路由途径,预设IPv4数据包大小是60字节,用户可以另外设置。

    命令语法:
    traceroute [选项] [主机名|IP地址] [数据包大小]

    12.2.2 ifconfig
    显示和配置网络接口,比如设置IP地址、MAC地址、激活或关闭网络接口。

    命令语法:
    ifconfig [接口] [选项| IP地址]

    12.2.3 ping
    用来测试与目标计算机之间的连通性。执行ping命令会使用ICMP传输协议发出要求回应的信息,如果远程主机的网络功能没有问题,就会回应该信息,因而得知该主机是否运作正常。

    命令语法:
    ping [选项] [目标]

    12.2.4 netstat
    用来显示网络状态的信息,得知整个Linux系统的网络情况,比如网络连接、路由表、接口统计、伪装连接和组播成员。

    命令语法:
    netstat [选项] [延迟]

    12.2.5 arp
    用来增加、删除和显示ARP缓存条目。

    命令语法:
    arp [选项] [IP地址][MAC地址]

    12.2.6 tcpdump
    是Linux系统中强大的网络数据采集分析工具之一,可以将网络中传送的数据包的头完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来筛选信息。作为互联网上经典的的系统管理员必备工具,tcpdump以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的工具之一。

    命令语法:
    tcpdump [选项] [表达式]

    12.3 管理网络服务

    systemd简介
    RHEL 7系统使用systemd,它提供更优秀的框架以表示系统服务间的依赖关系,并实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果,最终代替现在常用的System V。
    在RHEL7之前,服务管理工作是由System V通过/etc/rc.d/init.d目录下的Shell脚本来执行的,通过这些脚本允许管理员控制服务的状态。在RHEL 7中,这些脚本被服务单元文件替换。在systemd中,服务、设备、挂载等资源统一被称为单元,所以systemd中有许多单元类型,服务单元文件的扩展名是.service,同Shell脚本的功能相似。比如有查看、启动、停止、重启、启用或者禁止服务的参数。
    一个单元的配置文件可以描述系统服务(.service)、挂载点(.mount)、sockets(.sockets)、系统设备(.device)、交换分区(.swap)、文件路径(.path)、启动目标(.target)、由systemd管理的计时器(.timer)等。

    systemd单元文件放置位置
    /usr/lib/systemd/system:systemd默认单元文件安装目录;
    /etc/systemd/system:系统管理员创建和管理的单元目录,优先级最高。

    systemctl命令语法
    使用 systemctl 控制单元时,通常需要使用单元文件的全名,包括扩展名(比如sshd.service)。如果没有指定扩展名,systemctl 默认把扩展名当作.service。

    命令语法:
    systemctl [选项] [单元命令|单元文件命令]

    第13章 远程连接服务器配置

    本章内容
    13.1 SSH和OpenSSH简介
    13.2 OpenSSH服务器安装和配置
    13.3 配置OpenSSH客户端
    13.4 VNC服务器配置
    13.5 连接VNC服务器

    13.1 SSH和OpenSSH简介

    什么是SSH
    ftp和telnet在本质上是不安全的,因为它们在网络上使用明文传输口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且这些程序的安全验证方式也是有弱点的,很容易受到“中间人”这种方式的攻击。
    SSH (Secure Shell,安全Shell)是由IETF的网络工作小组所制定,为建立在应用层和传输层基础上的安全协议。SSH是目前较可靠,专为远程登录会话和其它网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。
    通过使用SSH可以把所有传输的数据进行加密,这样“中间人”这种攻击方式就不可能实现了,而且也可以防止DNS和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替telnet,又可以为ftp、pop和ppp提供一个安全的通道。

    什么是OpenSSH
    SSH因为受版权和加密算法的限制,现在很多人都转而使用OpenSSH。OpenSSH(Open Secure Shell,开放安全Shell)是SSH的替代软件,而且是免费的。默认使用RSA密钥,它采用安全、加密的网络连接工具代替telnet、ftp、rlogin、rsh和rcp工具。
    使用OpenSSH工具将增进系统安全性,在使用OpenSSH软件进行通信时,登录验证口令将会被加密。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程中的数据,并由此来代替原来的类似服务。
    telnet和ftp使用纯文本口令,并以明文发送。这些信息可能会被截取,口令可能会被检索,未经授权的人员可能会使用截取的口令登录用户的系统,而对系统产生危害,所以应该尽可能使用OpenSSH工具来避免这些安全问题。
    另一个使用OpenSSH的原因是,它自动把DISPLAY变量转发给客户主机。如果在本地主机上运行X窗口系统,并且使用ssh命令登录到远程主机上,当在远程主机上执行一个需要X的程序时,该程序会在本地主机上执行。

    13.2 OpenSSH服务器安装和配置

    13.2.1 安装OpenSSH服务器软件包
    13.2.2 /etc/ssh/sshd_config文件详解
    13.2.3 OpenSSH服务器配置实例

    13.2.1 安装OpenSSH服务器软件包
    安装openssh-server、openssh、openssh-clients和openssh-askpass软件包。
    [root@rhel ~]# cd /run/media/root/RHEL-7.2\ Server.x86_64/Packages
    [root@rhel Packages]# rpm -ivh openssh-6.6.1p1-22.el7.x86_64.rpm
    [root@rhel Packages]# rpm -ivh openssh-server-6.6.1p1-22.el7.x86_64.rpm
    [root@rhel Packages]# rpm -ivh openssh-clients-6.6.1p1-22.el7.x86_64.rpm
    [root@rhel Packages]# rpm -ivh openssh-askpass-6.6.1p1-22.el7.x86_64.rpm

    13.2.2 /etc/ssh/sshd_config文件详解
    OpenSSH服务器的主配置文件是/etc/ssh/sshd_config文件,这个文件的每一行都是“关键词 值”的格式。一般情况下不需要配置该文件即可让用户在客户端计算上进行连接。
    在/etc/ssh/sshd_config配置文件中,以“#”开头的行是注释行,它为用户配置参数起到解释作用,这样的语句默认不会被系统执行。

    Port 22
    设置OpenSSH服务器监听的端口号,默认为22。
    ListenAddress  0.0.0.0
    设置OpenSSH服务器绑定的IP地址。
    HostKey /etc/ssh/ssh_host_key
    设置包含计算机私有主机密钥的文件。
    ServerKeyBits 1024
    设置服务器密钥的位数。最小值是512,默认为1024。
    LoginGraceTime 2m
    设置如果用户不能成功登录,在切断连接之前服务器需要等待的时间。
    PermitRootLogin yes
    设置root用户是否能够使用ssh登录。

    IgnoreRhosts yes
    设置RhostsRSA验证和Hostbased验证的时候是否使用.rhosts和.shosts文件。
    IgnoreUserKnownHosts no 
    设置sshd是否在进行RhostsRSAAuthentication安全验证的时候忽略用户的~/.ssh/known_hosts。
    StrictModes yes 
    设置ssh在接收登录请求之前是否检查用户主目录和rhosts文件的权限和所有权。这通常是必要的,因为新手经常会把自己的目录和文件设成任何人都有写权限。
    PrintMotd yes
    设置sshd是否在用户登录的时候显示/etc/motd文件中的信息。
    LogLevel INFO
    设置记录sshd日志消息的级别。

    RhostsRSAAuthentication no
    设置是否允许用rhosts或/etc/hosts.equiv加上RSA进行安全验证。
    RSAAuthentication yes
    设置是否允许只有RSA安全验证。
    PasswordAuthentication yes
    设置是否允许口令验证。
    PermitEmptyPasswords no
    设置是否允许用户口令为空字符串的账号登录,默认是no。
    AllowGroups
    设置允许连接的组群。
    AllowUsers
    设置允许连接的用户。
    DenyGroups
    设置拒绝连接的组群。

    DenyUsers
    设置拒绝连接的用户。如果模式写成USER@HOST,则USER和HOST将同时被检查,限制特定用户在特定主机上连接OpenSSH服务器。比如zhangsan@192.168.0.5表示拒绝用户zhangsan在主机192.168.0.5上连接OpenSSH服务器。
    MaxSessions 10
    指定允许每个网络连接打开的最大会话数,默认为10。
    ClientAliveCountMax 3
    指定从客户端断开连接之前,在没有接收到响应时能够发送客户端活跃消息的次数。这个参数设置允许超时的次数。
    MaxStartups 10:30:100
    指定SSH守护进程未经身份验证的并发连接的最大数量,默认值是10:30:100。10:30:100表示的意思是,从第10个连接开始,以30%的概率(递增)拒绝新的连接,直到连接数达到100。

    13.2.3 OpenSSH服务器配置实例
    在公司内部配置一台OpenSSH服务器,为公司网络内的客户端计算机提供远程SSH登录服务,具体参数如下。
    OpenSSH服务器IP地址:192.168.0.2。
    OpenSSH服务器监听端口:22。
    不允许空口令用户登录。
    禁止用户lisi登录。

    13.3 配置OpenSSH客户端

    13.3.1 Linux客户端连接
    13.3.2 Windows客户端连接

    13.4 VNC服务器配置

    13.4.1 VNC简介
    13.4.2 VNC服务器配置实例
    13.4.3 创建或更改VNC登录密码
    13.4.4 管理VNC服务器

    13.4.1 VNC简介
    VNC是基于Unix/Linux 操作系统的免费开源软件,远程控制能力强大,高效实用,其性能可以和Windows系统中的任何远程控制软件媲美。
    VNC基本上是属于一种显示系统,也就是说它能将完整的窗口界面通过网络,传输到另一台计算机的屏幕上。Windows系统上的Terminal Server和PCAnywhere都是属于这种原理的软件,同时这些软件又在VNC的原理基础上做了各自相应改进,提高了易用性、连通率和可穿透内网。
    因为VNC是免费的,并且可以用于数量庞大的不同操作系统,它简单、可靠和向后兼容性,使之进化成为最为广泛使用的远程控制软件,多平台的支持对网络管理员是十分重要的,它使网络管理员可以使用一种工具管理几乎所有系统。
    VNC软件要由两个部分组成:服务端的VNC server和客户端的VNC viewer。用户需先将VNC server安装在被远程操控的计算机上后,才能在主控端执行VNC viewer进行远程操控。
    VNC的服务端目的是分享其所运行主机的屏幕, 服务端被动的允许客户端控制它。VNC客户端观察控制服务端,与服务端交互。VNC协议是一个简单的协议,传送服务端的原始图像到客户端(一个X,Y 位置上的正方形的点阵数据),客户端传送事件消息到服务端。服务器发送小方块的帧缓存给客户端,在最简单的情况,VNC协议使用大量的带宽, 因此各种各样的方法被发明出来减少通讯的开支。
    VNC并非是安全的协议,虽然VNC服务程序需设置密码才可接受外来连接,且VNC客户端与VNC服务程序之间的密码传输经过加密,但仍可被轻易的拦截到并使用暴力搜索法破解。不过VNC可设计以SSH或VPN传输,以增加安全性。

    13.4.2 VNC服务器配置实例

    1. 安装tigervnc-server软件包
    2. 启动VNC服务器
    3. 查看进程
    4. 查看端口号

    13.4.3 创建或更改VNC登录密码
    使用vncpasswd命令可以创建或更改一个VNC的登录密码,这将同时在用户的主目录下创建一个隐藏的目录“.vnc”,该目录内有一个文件passwd保存着VNC登录密码。

    命令语法:
    vncpasswd [密码文件]
    vncpasswd [选项]

    13.4.4 管理VNC服务器
    使用vncserver命令可以管理VNC服务器,比如启动和停止VNC服务器。

    命令语法:
    vncserver [:虚拟桌面号码] [选项] [Xvnc选项]

    13.5 连接VNC服务器

    13.5.1 Linux客户端连接
    13.5.2 Windows客户端连接

    13.5.1 Linux客户端连接
    安装tigervnc软件包
    [root@linux ~]# cd /run/media/root/RHEL-7.2\ Server.x86_64/Packages
    [root@linux Packages]# rpm -ivh tigervnc-1.3.1-3.el7.x86_64.rpm
    连接VNC服务器
    在这里插入图片描述使用vncviewer命令连接VNC服务器
    使用vncviewer命令可以连接到VNC服务器。

    命令语法:
    vncviewer [选项] [主机][:虚拟桌面号码]
    vncviewer [选项] [主机][:端口]
    vncviewer [选项]

    13.5.2 Windows客户端连接
    Windows系统下的VNC客户端软件有很多,这里主要讲解VNC Viewer软件,该软件是一款优秀的远程控制工具软件,远程控制能力强大,高效实用。
    在这里插入图片描述

    第14章 NFS服务器配置

    本章内容
    14.1 NFS简介
    14.2 NFS服务器安装和配置
    14.3 管理NFS共享目录
    14.4 挂载和卸载NFS共享目录

    14.1 NFS简介

    14.1.1 什么是NFS
    14.1.2 NFS协议

    14.1.1 什么是NFS
    NFS(Network File System,网络文件系统)是由SUN公司发展,并于1984年推出的技术。NFS对于在同一个网络上的多个用户间共享目录和文件很有用途。通过使用NFS,用户和程序可以像访问本地文件一样访问远程系统上的文件。
    NFS本身的服务并没有提供文件传递的协议,但是NFS却能让我们进行文件的共享,这其中的原因,就是NFS使用RPC协议。所以只要用到NFS的地方都要启动RPC服务,不论是NFS服务器还是NFS客户端。
    可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责信息的传输。这样NFS服务器端与NFS客户端才能由RPC协议来进行端口的对应。NFS主要管理分享出来的目录,而至于文件的传递,就直接将它交给RPC协议来运作。

    14.1.2 NFS协议
    客户端使用NFS可以透明地访问服务器中的文件系统,这不同于提供文件传输的FTP协议。FTP会产生文件一个完整的副本。NFS只访问一个进程引用文件部分,并且一个目的就是使得这种访问透明。这就意味着任何能够访问一个本地文件的客户端程序不需要做任何修改,就应该能够访问一个NFS文件。
    NFS是一个使用SunRPC构造的客户端/服务器应用程序,其客户端通过向一台NFS服务器发送RPC请求来访问其中的文件。尽管这一工作可以使用一般的用户进程来实现,即NFS客户端可以是一个用户进程,对服务器进行显式调用,而服务器也可以是一个用户进程。
    首先访问一个NFS文件必须对客户端透明,因此NFS的客户端调用是由客户端操作系统代表用户进程来完成的;其次,出于效率的考虑,NFS服务器在服务器操作系统中实现。如果NFS服务器是一个用户进程,每个客户端请求和服务器应答(包括读和写的数据)将不得不在内核和用户进程之间进行切换,这个代价太大。
    NFS协议从诞生到现在为止,已经有NFS V2、NFS V3和NFS V4等多个版本。

    14.2 NFS服务器安装和配置

    14.2.1 安装NFS服务器软件包
    14.2.2 /etc/exports文件详解
    14.2.3 控制nfs-server服务

    14.2.1 安装NFS服务器软件包
    安装nfs-utils软件包。
    [root@rhel ~]# cd /run/media/root/RHEL-7.2\ Server.x86_64/Packages
    [root@rhel Packages]# rpm -ivh nfs-utils-1.3.0-0.21.el7.x86_64.rpm

    14.2.2 /etc/exports文件详解
    /etc/exports文件控制着NFS服务器要导出的共享目录以及访问控制。/etc/exports文件默认是空白的,没有任何内容。也就是说NFS服务器默认是不共享任何目录,需要手工编辑添加。
    /etc/exports文件内容的格式如下所示。
    共享目录 客户端(导出选项)

    14.2.3 控制nfs-server服务
    /it 192.168.0.5(ro,sync)
    //允许来自主机192.168.0.5的用户以默认的只读权限来挂载/it目录
    /it 192.168.0.5(rw,sync)
    //允许来自主机192.168.0.5的用户以读写权限来挂载/it目录
    /it * (ro,all_squash,anonuid=65534,anongid=65534)
    //允许所有客户端的用户以只读权限来挂载/it目录,使用NFS服务器共享目录的用户都将映射为匿名用户,匿名用户将使用UID和GID为65534的系统账户(必须事先存在)
    /it .sh.com(ro)
    //允许sh.com域内的客户端的用户以只读权限来挂载/it目录
    /it linux.sh.com(ro)
    //允许来自主机linux.sh.com的用户以只读权限来挂载/it目录
    /it 192.168.0.0/24(ro) 192.168.1.0/24(ro)
    //允许来自192.168.0.0和192.168.1.0网段客户端的用户以只读权限来挂载/it目录
    /it 192.168.0.
    (ro,root_squash)
    //允许来自192.168.0.0网段客户端的用户以只读权限来挂载/it目录,并且将root用户映射成匿名用户
    /it proj*.sh.com(rw)
    //允许sh.com域内主机名以proj开头的客户端的用户以读写权限来挂载/it目录
    /it cl[0-9].sh.com(rw)
    //允许sh.com域内主机名以cl0~cl9开头的客户端的用户以读写权限来挂载/it目录

    14.3 管理NFS共享目录

    14.4 挂载和卸载NFS共享目录

    第15章 DHCP服务器配置

    本章内容
    15.1 DHCP简介
    15.2 DHCP服务器安装和配置
    15.3 配置DHCP客户端
    15.4 查看DHCP地址租约信息

    15.1 DHCP简介

    15.1.1 什么是DHCP
    15.1.2 使用DHCP服务优缺点

    15.1.1 什么是DHCP
    DHCP是一种用于简化计算机IP地址配置管理的标准。通过采用DHCP标准,可以使用DHCP服务器为网络上的计算机分配、管理动态IP地址以及其它相关配置信息。
    TCP/IP网络上的每一台计算机都必须要有唯一的IP地址,IP地址以及与之相关的子网掩码等标识计算机及其连接的子网。在将计算机移动到不同的子网时,必须更改IP地址。DHCP允许通过本地网络上的DHCP服务器IP地址数据库为客户端动态指派IP地址。
    对于基于TCP/IP的网络,DHCP降低了重新配置计算机IP地址的难度,减少了涉及的管理工作量。
    由于DHCP服务器需要固定的IP地址和DHCP客户端计算机进行通讯,所以DHCP服务器必须配置为使用静态IP地址。

    15.1.2 使用DHCP服务优缺点
    管理员可以集中为整个公司网络指定通用和特定子网的TCP/IP参数,并且可以定义使用保留地址的客户机的参数;
    提供安全可信的配置。DHCP避免了在每一台计算机上手工输入数值引起的配置错误,还能防止网络上计算机配置地址的冲突;
    使用DHCP服务器能大大减少配置网络上计算机的时间,服务器可以在指派地址租约时配置所有的附加配置值;
    客户机不需要手工配置TCP/IP;
    客户机在子网间移动时,旧的IP地址自动释放以便再次使用。在再次启动客户端计算机时,DHCP服务器会自动为客户端计算机重新配置TCP/IP;
    大部分路由器可以转发DHCP配置请求,因此,互联网的每个子网并不都需要DHCP服务器。
    DHCP不能发现网络上非DHCP客户机已经在使用的IP地址;
    当网络上存在多个DHCP服务器时,一个DHCP服务器不能查出已被其它服务器租出去的IP地址;
    DHCP服务器不能跨路由器与客户机通信,除非路由器允许BOOTP转发。

    15.2 DHCP服务器安装和配置

    15.2.1 安装DHCP服务器软件包
    15.2.2 /etc/dhcp/dhcpd.conf文件详解
    15.2.3 DHCP服务器配置实例

    15.2.1 安装DHCP服务器软件包
    安装dhcp和dhcp-common软件包。
    [root@rhel ~]# cd /run/media/root/RHEL-7.2\ Server.x86_64/Packages
    [root@rhel Packages]# rpm -ivh dhcp-4.2.5-42.el7.x86_64.rpm
    [root@rhel Packages]# rpm -ivh dhcp-common-4.2.5-42.el7.x86_64.rpm

    15.2.2 /etc/dhcp/dhcpd.conf文件详解
    DHCP服务器的主配置文件是/etc/dhcp/dhcpd.conf,默认情况下该文件中没有内容。但是DHCP服务器提供了一个配置模板文件,该文件是/usr/share/doc/dhcp-4.2.5/dhcpd.conf.example,在实际配置DHCP服务器过程中,常将该模板文件复制为/etc/dhcp/dhcpd.conf文件。
    /etc/dhcp/dhcpd.conf文件的内容由全局配置和局部配置两部分构成。全局配置部分主要是用来设置DHCP服务器整体运行环境的选项,而局部配置部分是用来设置作用域内容。在/etc/dhcp/dhcpd.conf文件中,以“#”开头的行是注释行,它为用户配置参数起到解释作用,这样的语句默认不会被系统执行。

    15.2.3 DHCP服务器配置实例
    声明部分是用来描述网络布局、提供客户端的IP地址等。
    shared-network
    用来告知是否一些子网络分享相同网络,也就是超级作用域。
    subnet
    描述一个IP地址是否属于该子网。
    range
    提供动态分配IP地址的范围。
    host
    参考特别的主机。
    group
    为一组参数提供声明。
    allow unknown-clients
    允许动态分配IP地址给未知的客户端。
    deny unknown-client
    拒绝动态分配IP地址给未知的客户端。
    allow bootp
    允许响应bootp查询。
    deny bootp
    拒绝响应bootp查询。
    all booting
    允许响应使用者查询。
    deny booting
    拒绝响应使用者查询。
    filename
    开始启动文件的名称,应用于无盘工作站。
    next-server
    设置服务器从初始引导文件中加载指定服务器的主机地址,服务器名称应该是IP地址或域名,应用于无盘工作站。

    参数部分是表明如何执行任务,是否要执行任务,或将哪些网络配置选项发送给客户。
    ddns-update-style none
    设置动态DNS更新模式,none表示不支持动态更新,interim表示DNS动态更新模式,ad-hoc表示特殊DNS更新模式。
    ignore client-updates
    忽略客户机更新DNS记录。default-lease-time 600 指定缺省客户端租约IP地址的时间长度,单位是秒。
    max-lease-time 7200
    指定最大客户端租约IP地址的时间长度,单位是秒。
    hardware ethernet 08:00:07:26:c0:a5
    指定网卡接口类型和MAC地址。
    server-name
    通知DHCP客户服务器名称。
    get-lease-hostnames flag
    检查客户端使用的IP地址。
    fixed-address
    为客户端保留一个固定的IP地址。保留地址提供了一个将动态地址和其MAC地址相关联的手段,用于保证此网卡长期使用某个IP地址。 
    `选项部分是用来配置DHCP可选参数,全部用option关键字作为开始。 
    subnet-mask
    为客户端指定子网掩码。
    domain-name
    为客户端指定DNS域名。
    domain-name-servers
    为客户端指定DNS服务器的IP地址。
    host-name
    为客户端指定主机名称。
    routers
    为客户端指定默认网关。
    broadcast-address
    为客户端指定广播地址。
    ntp-server
    为客户端指定网络时间服务器(NTP服务器)的IP地址。
    time-offset
    为客户端指定和格林威治时间的偏移时间,单位是秒。
    nis-domain
    设置客户机的NIS域名。
    netbios-name-servers
    设置客户机的WINS服务器的IP地址。
    netbios-node-type
    设置客户机的NetBIOS节点类型。
    在公司内部配置一台DHCP服务器,为公司网络内的客户端计算机自动分配IP地址等信息,具体参数如下。
    分配IP地址池:192.168.0.60~192.168.0.160。
    子网掩码:255.255.255.0。
    网关地址:192.168.0.1。
    DNS服务器:192.168.0.2。
    DNS域名:sh.com。
    默认租约有效期:1天(86400秒)。
    最大租约有效期:7天(604800秒)。
    给主机名为windows的客户机(MAC地址为00:50:56:C0:00:01)保留使用IP地址192.168.0.150。
    支持DNS动态更新模式。
    忽略客户机更新DNS记录。

    15.3 配置DHCP客户端

    15.3.1 Linux客户端配置
    15.3.2 Windows客户端配置

    15.3.1 Linux客户端配置
    1.修改网卡配置文件
    修改网卡配置文件/etc/sysconfig/network-scripts/ifcfg-eno16777736,使得该客户端的IP地址为自动从DHCP服务器处获取,而不是静态手工设置。
    2.重新启动network服务并申请IP地址
    使用systemctl命令重新启动network服务,这时该客户端在网卡重新启动时从DHCP服务器处申请并获取到IP地址。
    3.查看获取的IP地址
    使用ifconfig命令查看该客户端获取到的IP地址信息。

    15.3.2 Windows客户端配置
    1.设置自动获得IP地址
    2.申请IP地址
    如果客户端没有立即向DHCP服务器申请IP地址,也可以使用ipconfig/renew命令申请。
    3.查看IP地址
    使用ipconfig/all命令可以查看到从DHCP服务器处获取到的详细的TCP/IP信息,如IP地址、子网掩码、默认网关、DNS域名、DNS服务器IP地址、DHCP服务器IP地址、IP地址租约期限等信息。
    4.释放IP地址
    如果不再需要从DHCP服务器处获取到的IP地址,可以使用ipconfig/release命令释放该IP地址。

    15.4 查看DHCP地址租约信息

    /var/lib/dhcpd/dhcpd.leases文件中存放着DHCP地址租约数据库。每一个最近分配给客户端的IP地址租约信息都会自动储存在该数据库中,该信息包括租约的开始和终止时间、客户端的MAC地址、客户端的主机名以及分配给客户端的IP地址等。租约数据库中所用的时间是格林威治标准时间(GMT),不是本地时间。
    租约数据库不时被重建,首先所有已知的租约会被储存到一个临时的租约数据库中,/var/lib/dhcpd/dhcpd.leases文件被重命名为/var/lib/dhcpd/dhcpd.leases~,然后临时租约数据库被写入/var/lib/dhcpd/dhcpd.leases文件。
    在租约数据库被重命名为备份文件,新文件被写入之前,dhcpd守护进程有可能被杀死,系统也有可能会崩溃。如果发生了这种情况,/var/lib/dhcpd/dhcpd.leases文件不存在,但它却是启动服务所必需的。这时请不要创建新租约文件。因为这样做会丢失所有原有的旧租约文件,从而导致更多问题。正确的办法是把/var/lib/dhcpd/dhcpd.leases~备份文件重命名为/var/lib/dhcpd/dhcpd.leases,然后再启动守护进程。

    第16章 Samba服务器配置

    本章内容

    16.1 Samba简介
    16.2 Samba服务器安装和配置
    16.3 Samba服务器配置实例
    16.4 配置Samba客户端

    16.1 Samba简介

    Samba是指通过SMB协议在网络上的计算机之间远程共享Linux文件和打印服务。
    SMB是基于NetBIOS的协议,传统上用在Linux、Windows和OS/2网络中访问远程文件和打印机,统称为共享服务。SMB为网络资源和桌面应用之间提供了紧密的接口,与使用NFS、FTP和LPR等协议相比,使用SMB协议能把二者结合得更加紧密。通过Samba共享的Linux资源就像在另一台Windows服务器上一样,不需要任何其它的桌面客户软件就可以访问。
    Linux系统可以与各种操作系统轻松连接,实现多种网络服务。在一些中小型网络或企业的内部网中,利用Linux建立文件服务器是一个很好的解决方案。针对企业内部网中的绝大部分客户机都采用Windows的情况,我们可以通过使用Samba来实现文件服务器的功能。 Samba是在Linux和Unix系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。SMB协议是建立在NetBIOS协议之上的应用协议,是基于TCP协议的138和139两个端口的服务。NetBIOS出现之后,Microsoft就使用NetBIOS实现了一个网络文件/打印服务系统。
    SMB协议被用于局域网管理和Windows服务器系统管理中,实现不同计算机之间共享打印机和文件等。因此,为了让Windows和Unix/Linux计算机相集成,最好的办法就是在Unix/Linux计算机中安装支持SMB协议的软件。这样使用Windows的客户端不需要更改设置就能像使用Windows一样使用Unix/Linux系统上的共享资源了。
    Samba的核心是smbd和nmbd两个守护进程,在服务器启动时持续运行。smbd和nmbd使用的全部配置信息全都保存在/etc/samba/smb.conf文件中。
    /etc/samba/smb.conf文件向守护进程smbd和nmbd说明共享的内容、共享输出给谁以及如何进行输出。smbd进程的作用是为使用该软件包资源的客户机与Linux服务器进行协商,nmbd进程的作用是使客户机能浏览Linux服务器的共享资源。

    16.2 Samba服务器安装和配置

    16.2.1 安装Samba服务器软件包
    16.2.2 /etc/samba/smb.conf文件详解
    16.2.3 Samba共享目录配置实例

    16.2.1 安装Samba服务器软件包
    安装samba-common、samba-client、samba和samba-libs软件包。
    [root@rhel ~]# cd /run/media/root/RHEL-7.2\ Server.x86_64/Packages
    [root@rhel Packages]# rpm -ivh samba-common-4.2.3-10.el7.noarch.rpm
    [root@rhel Packages]# rpm -ivh samba-client-4.2.3-10.el7.x86_64.rpm
    [root@rhel Packages]# rpm -ivh samba-4.2.3-10.el7.x86_64.rpm
    [root@rhel Packages]# rpm -ivh samba-libs-4.2.3-10.el7.x86_64.rpm

    16.2.2 /etc/samba/smb.conf文件详解
    Samba服务器的主配置文件是/etc/samba/smb.conf文件,该配置文件的内容由Global Settings(全局设置)和Share Definitions(共享定义)两部分构成。Global Settings部分主要是用来设置Samba服务器整体运行环境的选项,而Share Definitions部分是用来设置文件共享和打印共享资源。
    在/etc/samba/smb.conf配置文件中,以“#”开头的行是注释行,它为用户配置参数起到解释作用,这样的语句默认不会被系统执行。以“;”开头的行都是Samba配置的参数范例,这样的语句默认不会被系统执行,如果将“;”去掉并对该范例进行设置,那么该语句将会被系统执行。在/etc/samba/smb.conf配置文件中所有的配置参数都是以“配置项目 = 值”这样的格式表示。

    16.2.3 Samba共享目录配置实例
    1.允许匿名用户读取/it共享目录
    2.允许匿名用户读写/it共享目录
    3.只允许用户zhangsan和组群jishu的用户访问/i t共享目录
    4.只允许用户zhangsan和组jishu的用户读写/it共享目录

    16.3 Samba服务器配置实例

    16.3.1 share级别Samba服务器配置
    16.3.2 user级别Samba服务器配置

    16.3.1 share级别Samba服务器配置
    在公司内部配置一台Samba服务器,为公司网络内的客户端计算机提供share级别Samba服务,具体参数如下。
    Samba服务器所在工作组:workgroup。
    Samba服务器描述信息:Samba Server。
    Samba服务器NetBIOS名称:rhel。
    Samba服务器网卡IP地址:192.168.0.2。
    允许访问Samba服务器的网络:192.168.0.0。
    日志文件路径:/var/log/samba/log.%m。
    日志文件大小:50000KB。
    Samba服务器安全模式:share。
    共享目录:/it。
    访问权限:读写权限。

    16.3.2 user级别Samba服务器配置
    在公司内部配置一台Samba服务器,为公司网络内的客户端计算机提供user级别Samba服务,具体参数如下。
    Samba服务器所在工作组:workgroup。
    Samba服务器描述信息:Samba Server。
    Samba服务器NetBIOS名称:rhel。
    Samba服务器网卡IP地址:192.168.0.2。
    允许访问Samba服务器的网络:192.168.0.0。
    日志文件路径:/var/log/samba/log.%m。
    日志文件大小:50000KB。
    Samba服务器安全模式:user。
    对Samba密码进行加密。
    密码数据库类型:tdbsam。
    共享目录:/it。
    /it目录的用户所有者和组群所有者为zhangsan。
    访问权限:读写权限。

    16.4 配置Samba客户端

    16.4.1 Linux客户端配置
    1.安装软件包
    使用以下命令安装samba-common和samba-client软件包。
    [root@linux ~]# cd /run/media/root/RHEL-7.2\ Server.x86_64/Packages
    [root@linux Packages]# rpm -ivh samba-common-4.2.3-10.el7.noarch.rpm
    [root@linux Packages]# rpm -ivh samba-client-4.2.3-10.el7.x86_64.rpm
    2.使用smbclient命令显示和连接共享目录
    在客户端计算机上使用smbclient命令,可以显示Samba服务器上的共享资源,也可以连接到该共享资源上。
    3.使用mount命令挂载Samba目录
    在客户端用户可以把Samba共享目录挂载到本地目录上,这样该目录内的文件就如同是本地文件系统的一部分。把Samba共享挂载到本地目录中时,如果该目录不存在,则需要先创建它,然后执行。

    16.4.2 Windows客户端配置
    在Windows系统中,可以通过多种方法访问Samba服务器上的共享资源,比如【运行】工具。

    在这里插入图片描述

    第17章 DNS服务器配置

    本章内容
    17.1 DNS简介
    17.2 DNS服务器安装和配置
    17.3 配置DNS客户端
    17.4 DNS客户端域名解析测试
    17.5 DNS服务器高级配置

    17.1 DNS简介

    17.1.1 什么是DNS
    17.1.2 DNS服务器类型
    17.1.3 DNS解析类型

    17.1.1 什么是DNS
    DNS用于命名组织到域层次结构中的计算机和网络服务。DNS命名用于TCP/IP网络中,通过用户友好的名称查找计算机和服务。当用户在应用程序中输入DNS名称时,DNS服务可以将此名称解析为与之相关的IP地址。
    比如用户喜欢使用友好的名称(如rhel.sh.com)来查找计算机,友好名称更容易了解和记住。但是计算机是使用IP地址在网络上进行通讯的,为更容易地使用网络资源,DNS命名系统将计算机或服务的用户友好名称映射为IP地址。

    17.1.2 DNS服务器类型
    1.主DNS服务器
    2.辅助DNS服务器
    3.缓存DNS服务器
    4.转发DNS服务器

    17.1.3 DNS解析类型
    1.正向查找解析
    2.反向查找解析

    17.2 DNS服务器安装和配置

    17.2.1 安装DNS服务器软件包
    17.2.2 /etc/named.conf文件详解
    17.2.3 配置DNS区域文件
    17.2.4 主DNS服务器配置实例

    17.2.1 安装DNS服务器软件包
    安装bind和bind-libs软件包。
    [root@rhel ~]# cd /run/media/root/RHEL-7.2\ Server.x86_64/Packages
    [root@rhel Packages]# rpm -ivh bind-9.9.4-29.el7.x86_64.rpm
    [root@rhel Packages]# rpm -ivh bind-libs-9.9.4-29.el7.x86_64.rpm

    17.2.2 /etc/named.conf文件详解
    DNS服务器的主配置文件是/etc/named.conf文件,该文件的内容由全局配置和局部配置两部分构成。全局配置部分主要是用来设置对DNS服务器整体生效的内容,而局部配置部分是用来设置区域名、区域类型和区域文件名等内容。
    在/etc/named.conf配置文件中,以“#”开头的行是注释行,它为用户配置参数起到解释作用,这样的语句默认不会被系统执行。

    17.2.3 配置DNS区域文件
    在这里插入图片描述
    17.2.4 主DNS服务器配置实例
    在这里插入图片描述在公司内部配置一台主DNS服务器,为公司网络内的客户端计算机提供正向域名和反向域名解析服务,具体参数如下。
    主DNS服务器IP地址:192.168.0.2。
    主DNS服务器主机名:rhel。
    正向区域名:sh.com。
    反向区域名:0.168.192.in-addr.arpa。
    正向区域文件名称:/var/named/sh.com.hosts。
    反向区域文件名称:/var/named/192.168.0.rev。
    在正向区域中指定相关的资源记录。
    在反向区域中指定相关的资源记录。
    允许进行DNS查询的网络:192.168.0.0/24。

    17.3 配置DNS客户端

    17.3.1 Linux客户端配置
    17.3.2 Windows客户端配置

    17.3.1 Linux客户端配置
    1.安装软件包
    2.编辑/etc/resolv.conf文件

    17.3.2 Windows客户端配置
    在这里插入图片描述

    17.4 DNS客户端域名解析测试

    使用host命令可以执行DNS查找,进行域名解析。

    命令语法:
    host [选项] [名称] [服务器]

    17.5 DNS服务器高级配置

    17.5.1 辅助DNS服务器
    17.5.2 虚拟子域

    17.5.1 辅助DNS服务器
    在企业中为了减轻主DNS服务器的工作负荷,以及为主DNS服务器提供容错功能,可以配置多台辅助DNS服务器。辅助DNS服务器上的区域文件是从主DNS服务器上复制而来的,所以区域文件内的资源记录只能读取,而不能修改和删除。这样一来客户端计算机也可以从辅助DNS服务器上解析资源记录。
    在公司内部配置一台辅助DNS服务器,为公司网络内的客户端计算机提供正向和反向域名解析服务,具体参数如下。
    主DNS服务器IP地址:192.168.0.2;
    辅助DNS服务器IP地址:192.168.0.4;
    辅助DNS服务器主机名:rhel2。
    正向区域名:sh.com;
    反向区域名:0.168.192.in-addr.arpa;
    正向区域文件名称:/var/named/sh.com.hosts;
    反向区域文件名称:/var/named/192.168.0.rev。

    17.5.2 虚拟子域
    使用区域委派方式能够减轻DNS服务器的负担,但是相对来说成本比较高。因为实现子域委派需要另外配置一台DNS服务器,而虚拟子域只需在同一台服务器上管理子域,配置比较简单,只需要在父域正向区域文件中加入$ORIGIN即可。
    在公司内部配置一台DNS服务器,将父域和子域的内容都配置在该服务器上,具体参数如下。
    DNS服务器IP地址:192.168.0.2。
    DNS服务器主机名:rhel。
    父域域名:sh.com。
    子域域名:product.sh.com。

    第18章 Web服务器配置

    本章内容
    18.1 Web简介
    18.2 Web服务器安装和配置
    18.3 访问Web服务器
    18.4 日志文件管理和分析
    18.5 Web服务器高级配置
    18.6 配置Apache虚拟主机

    18.1 Web简介

    WWW是英国人TimBerners-Lee在1989年欧洲共同体的一个大型科研机构工作时发明的。通过Web,互联网上的资源可以比较直观在一个网页里表示出来,而且在网页上可以互相链接。
    Web是一种超文本信息系统,其主要实现方式是超文本链接,它使得文本不再象一本书一样是固定的、线性的,而是可以从一个位置跳转到另外一个位置。想要了解某一个主题的内容,只要在这个主题上点击一下,就可以跳转到包含这一主题的文档上。
    超文本是一种用户接口范式,用以显示文本及与文本相关的内容。超文本中的文字包含有可以链接到其它字段或者文档的超文本链接,允许从当前阅读位置直接切换到超文本链接所指向的文字。超文本的格式有很多,最常使用的是超文本标记语言,我们日常浏览的网页都属于超文本。
    超文本链接是一种全局性的信息结构,它将文档中的不同部分通过关键字建立链接,使信息得以用交互方式搜索。

    18.2 Web服务器安装和配置

    18.2.1 安装Web服务器软件包
    18.2.2 /etc/httpd/conf/httpd.conf文件详解
    18.2.3 Web服务器配置实例

    18.2.1 安装Web服务器软件包
    安装httpd、httpd-tools和httpd-manual软件包。
    [root@rhel ~]# cd /run/media/root/RHEL-7.2\ Server.x86_64/Packages
    [root@rhel Packages]# rpm -ivh httpd-2.4.6-40.el7.x86_64.rpm
    [root@rhel Packages]# rpm -ivh httpd-tools-2.4.6-40.el7.x86_64.rpm
    [root@rhel Packages]# rpm -ivh httpd-manual-2.4.6-40.el7.noarch.rpm

    18.2.2 /etc/httpd/conf/httpd.conf文件详解
    Apache服务器的主配置文件是/etc/httpd/conf/httpd.conf文件,该文件的内容由全局环境、主服务器配置和虚拟主机三部分构成。在/etc/httpd/conf/httpd.conf配置文件中,以“#”开头的行是注释行,它为用户配置参数起到解释作用,这样的语句默认不会被系统执行。

    18.2.3 Web服务器配置实例
    在公司内部配置一台Apache服务器,为公司网络内的客户端计算机提供能通过域名访问的Apache Web网站,具体参数如下。
    Apache服务器IP地址:192.168.0.2。
    Web网站域名:www.sh.com。
    Apache服务器默认文档首页名称:index.html和index.htm。
    Apache服务器中存放网页内容的根目录位置:/var/www/html。
    Apache服务器监听端口:80。
    默认字符集:UTF-8。
    运行Apache服务器的用户和组:apache。
    管理员邮件地址:root@sh.com。

    18.3 访问Web服务器

    18.3.1 Linux客户端配置
    Mozilla Firefox是一款可以在Linux和Windows系统下都能安装和运行的浏览器,可以从互联网上分别下载Windows版本和Linux版本。
    如果希望在客户端使用域名www.sh.com的方式访问Web网站,在客户端需要修改/etc/resolv.conf文件,指向DNS服务器,如下所示。
    nameserver 192.168.0.2

    18.3.2 Windows客户端配置
    在Windows 10系统中,打开Microsoft Edge浏览器,输入网址:http://192.168.0.2访问Web网站。
    在这里插入图片描述

    18.4 日志文件管理和分析

    18.4.1 配置错误日志
    18.4.2 配置访问日志

    18.4.1 配置错误日志
    在Apache服务器运行过程中发生的各种错误都将记录在错误日志文件中,可以通过该文件获取错误信息并分析原因。
    在Apache服务器的配置文件/etc/httpd/conf/httpd.conf中有以下两行内容,这说明了错误日志的保存位置以及当前错误日志的记录等级。
    ErrorLog “logs/error_log”
    LogLevel warn
    在这里插入图片描述
    18.4.2 配置访问日志
    在Apache服务器中记录着服务器所处理的所有请求,比如在什么时候哪一台客户端连接到Web网站访问了什么网页,这些都将记录下来。
    在Apache服务器的配置文件/etc/httpd/conf/httpd.conf中有以下这样内容,这说明了访问日志的保存位置以及访问日志的格式分类。

    LogFormat “%h %l %u %t “%r” %>s %b “%{Referer}i” “%{User-Agent}i”” combined
    LogFormat “%h %l %u %t “%r” %>s %b” common

    LogFormat “%h %l %u %t “%r” %>s %b “%{Referer}i” “%{User-Agent}i” %I %O” combinedio

    CustomLog “logs/access_log” combined

    在这里插入图片描述

    18.5 Web服务器高级配置

    18.5.1 访问控制
    18.5.2 用户认证和授权
    18.5.3 虚拟目录

    18.5.1 访问控制
    在Apache 2.4版本中,使用mod_authz_host模块来实现访问控制,其他授权检查也以同样的方式来完成。旧的访问控制语句应当被新的授权认证机制所取代,即便Apache已经提供了mod_access_compat这一新模块来兼容旧语句。
    在Apache 2.4版本之前实现客户端访问控制,是使用Allow、Deny、Order指令做访问控制的,而在Apache 2.4版本使用Require指令来实现。
    默认在/etc/httpd/conf/httpd.conf配置文件中,有含有Require参数的内容,这些设置将控制指定目录的访问控制权限。
    在这里插入图片描述在这里插入图片描述访问控制配置实例
    (1)允许所有客户端能访问Web网站,只有IP地址为192.168.0.5的客户端不能访问Web网站。
    (2)允许所有客户端能访问Web网站,只有完全合格域名为rhel.sh.com的客户端不能访问Web网站。
    (3)拒绝所有客户端访问Web网站,只有IP地址为192.168.0.5的客户端才能访问Web网站。
    (4)拒绝所有客户端访问Web网站,只有192.168.0.0/24网络的客户端才能访问Web网站。

    18.5.2 用户认证和授权
    在Apache服务器中有基本认证和摘要认证两种认证类型。一般来说,使用摘要认证要比基本认证更加安全,但是因为有些浏览器不支持使用摘要认证,所以在大多数情况下用户只能使用基本认证。
    在这里插入图片描述在这里插入图片描述
    18.5.3 虚拟目录
    在Apache服务器中,默认网站根目录是/var/www/html,所以可以将网站的网页内容存储在该目录中。如果网站内容不是存储在/var/www/html目录内,可以通过别名方式创建虚拟目录。
    虚拟目录是为服务器硬盘上不在主目录下的一个物理目录或者其它计算机上的主目录而指定的好记的名称,或“别名”。因为别名通常比物理目录的路径短,所以它更便于用户输入。同时,使用别名还更加安全,因为用户不知道文件在服务器上的物理位置,所以无法使用该信息来修改文件。通过使用别名,还可以更轻松地移动站点中的目录。无需更改目录的URL,而只需更改别名与目录物理位置之间的映射。
    在这里插入图片描述

    18.6 配置Apache虚拟主机

    18.6.1 基于IP地址的虚拟主机
    18.6.2 基于TCP端口号的虚拟主机
    18.6.3 基于域名的虚拟主机

    18.6.1 基于IP地址的虚拟主机
    如果在同一台服务器上使用多个IP地址来区分不同的Web网站,则必须为网卡绑定多个IP地址,并且给每个网站指派唯一的IP地址。
    在公司内部一台服务器上通过基于IP地址的虚拟主机方式配置两个Web网站,为公司网络内的客户端计算机提供Web服务,具体参数如下。
    (1)第一个Web网站
    网站根目录:/var/www/html/www1.sh.com。
    网站首页:index.html。
    网站IP地址:192.168.0.3。
    (2)第二个Web网站
    网站根目录:/var/www/html/www2.sh.com。
    网站首页:index.html。
    网站IP地址:192.168.0.4。

    18.6.2 基于TCP端口号的虚拟主机
    可以使用非标准TCP端口号来创建用于站点开发和测试目的的唯一网站标识符。标准网站将默认的TCP端口80用于HTTP连接。由于TCP/IP端点是用IP地址(或相应名称)和端口号的组合来定义的,而使用非标准端口号配置网站可以给每个站点创建唯一的端点(或标识)。  如果使用非标准TCP端口号来标识网站,则用户无法通过标准名或URL来访问站点。另外,用户必须知道指派给网站的非标准TCP端口号,以及在其Web浏览器地址栏中附加网站的名称或IP地址。 在公司内部一台服务器上通过基于端口号的虚拟主机方式配置两个Web网站,为公司网络内的客户端计算机提供Web服务,具体参数如下。
    (1)第一个Web网站
    网站根目录:/var/www/html/www1.sh.com。
    网站首页:index.html。
    网站端口号:80。
    (2)第二个Web网站
    网站根目录:/var/www/html/www2.sh.com。
    网站首页:index.html。
    网站端口号:8080。

    18.6.3 基于域名的虚拟主机
    在一台服务器上创建多个Web网站的单位通常使用域名,因为这种方法不必使用每个站点的唯一IP地址。由于Web服务必须分配非页面缓冲池内存来管理每个IP地址的端点,使用域名的好处是可以避免由于使用唯一IP地址标识多个网站而引起的潜在性能降低。 在公司内部一台服务器上通过基于域名的虚拟主机方式配置两个Web网站,为公司网络内的客户端计算机提供Web服务,具体参数如下。
    (1)第一个Web网站
    网站根目录:/var/www/html/www1.sh.com。
    网站首页:index.html。
    网站域名:www1.sh.com。
    (2)第二个Web网站
    网站根目录:/var/www/html/www2.sh.com。
    网站首页:index.html。
    网站域名:www2.sh.com。

    第19章 FTP服务器配置

    本章内容
    19.1 FTP简介
    19.2 FTP服务器安装和配置
    19.3 配置FTP客户端
    19.4 FTP服务器配置实例

    19.1 FTP简介

    19.1.1 什么是FTP
    19.1.2 FTP传输模式
    19.1.3 FTP用户

    19.1.1 什么是FTP
    FTP可以在网络中传输文档、图像、音频、视频以及应用程序等多种类型的文件。如果用户需要将文件从自己的计算机发送给另一台计算机,可以使用FTP进行上传操作;而在更多的情况下,则是用户使用FTP从服务器上下载文件。
    一个完整的FTP文件传输需要建立两种类型的连接,一种为控制文件传输的命令,称为控制连接;另一种实现真正的文件传输,称为数据连接。

    19.1.2 FTP传输模式
    1.主动模式(PORT模式)
    主动模式的数据传输专有连接是在建立控制连接(用户身份验证完成)后,首先由FTP服务器使用20端口主动向客户端进行连接,建立专用于传输数据的连接,这种方式在网络管理上比较好控制。FTP服务器上的端口21用于用户验证,端口20用于数据传输,只要将这两个端口开放就可以使用FTP功能了,此时客户端只是处于接收状态。
    2.被动模式(PASV模式)
    被动模式与主动模式不同,数据传输专有连接是在建立控制连接(用户身份验证完成)后由客户端向FTP服务器发起连接的。客户端使用哪个端口,连接到FTP服务器的哪个端口都是随机产生的。服务器并不参与数据的主动传输,只是被动接受。

    19.1.3 FTP用户
    1.匿名用户
    使用这类用户可以匿名访问FTP服务器。匿名用户是指在FTP服务器中没有指定账户,但是它仍然可以匿名访问某些公开的资源。使用匿名用户访问FTP服务器时使用账户anonymous或ftp。
    2.本地用户
    这类用户是指在FTP服务器上拥有账户。当这类用户访问FTP服务器的时候,其默认的主目录就是其账户命名的目录。但是它还可以变更到其它目录中去。
    3.虚拟用户
    在FTP服务器中,使用这类用户只能够访问其主目录下的文件,而不能访问主目录以外的文件。FTP服务器通过这种方式来保障服务器上其它文件的安全性。

    19.2 FTP服务器安装和配置

    19.2.1 安装FTP服务器软件包
    19.2.2 /etc/vsftpd/vsftpd.conf文件详解
    19.2.3 控制vsftpd服务

    19.2.1 安装FTP服务器软件包
    安装vsftpd软件包。
    [root@rhel ~]# cd /run/media/root/RHEL-7.2\ Server.x86_64/Packages
    [root@rhel Packages]# rpm -ivh vsftpd-3.0.2-10.el7.x86_64.rpm

    19.2.2 /etc/vsftpd/vsftpd.conf文件详解
    vsftpd服务器的主配置文件是/etc/vsftpd/vsftpd.conf文件,一般无需修改该文件就可以启动vsftpd服务器使用。在/etc/vsftpd/vsftpd.conf配置文件中,以“#”开头的行是注释行,它为用户配置参数起到解释作用,这样的语句默认不会被系统执行。在该配置文件中所有的配置参数都是以“配置项目=值”这样的格式表示。
    /etc/vsftpd/vsftpd.conf文件参数(1)
    anonymous_enable=YES
    设置是否允许匿名用户登录,YES允许,NO不允许。
    local_enable=YES
    设置是否允许本地用户登录,YES允许,NO不允许。
    write_enable=YES
    设置是否允许用户有写入权限,YES允许,NO不允许。
    local_umask=022
    设置本地用户新建文件时的umask值。
    local_root=/home
    设置本地用户的根目录。
    anon_upload_enable=YES
    设置是否允许匿名用户上传文件,YES允许,NO不允许。
    anon_mkdir_write_enable=YES
    设置是否允许匿名用户有创建目录的权限,YES允许,NO不允许。
    /etc/vsftpd/vsftpd.conf文件参数(2)
    anon_other_write_enable=NO
    设置是否允许匿名用户有更改的权限,比如重命名和删除文件权限,YES允许,NO不允许。
    anon_world_readable_only=YES
    设置是否允许匿名用户下载可读的文件,YES允许,NO不允许。
    dirmessage_enable=YES
    设置是否显示目录说明文件,默认是YES,但需要手工创建.message文件允许为目录配置显示信息,显示每个目录下面的message_file文件的内容。
    message_file=.message
    设置提示信息文件名,该参数只有在dirmessage_enable启用时才有效。
    download_enable=YES
    设置是否允许下载,YES允许,NO不允许。
    chown_upload=YES
    设置是否允许修改上传文件的用户所有者,YES允许,NO不允许。
    /etc/vsftpd/vsftpd.conf文件参数(3)
    chown_username=whoever
    设置想要修改的上传文件的用户所有者。
    idle_session_timeout=600
    设置用户会话空闲超过指定时间后断开连接。
    data_connection_timeout=120
    设置数据连接空闲超过指定时间后断开连接。
    accept_timeout=60
    设置客户端空闲超过指定时间自动断开连接,单位为秒。
    connect_timeout=60
    设置客户端空闲断开连接后在指定时间自动激活连接,单位为秒。
    max_clients=100
    允许连接客户端的最大数量。0表示不限制最大连接数。
    max_per_ip=5
    设置每个IP地址的最大连接数。0表示不限制最大连接数。
    anon_max_rate=51200
    设置匿名用户传输数据的最大速度,单位是字节/秒。
    local_max_rate=5120000
    设置本地用户传输数据的最大速度,单位是字节/秒。
    pasv_min_port=0
    设置在被动模式连接vsftpd服务器时,服务器响应的最小端口号,0 表示任意。默认值为0。
    pasv_max_port=0
    设置在被动模式连接vsftpd服务器时,服务器响应的最大端口号,0 表示任意。默认值为0。
    chroot_local_user=YES
    设置是否将本地用户锁定在自己的主目录中。
    chroot_list_enable=YES
    设置是否锁定用户在自己的主目录中。
    /etc/vsftpd/vsftpd.conf文件参数(4)
    chroot_list_file=/etc/vsftpd/chroot_list
    被列入该文件的用户,在登录后锁定用户在自己的主目录中。
    ascii_upload_enable=YES
    设置是否使用ASCII模式上传文件,YES使用,NO不使用。
    ascii_download_enable=YES
    设置是否使用ASCII模式下载文件,YES使用,NO不使用。
    ftpd_banner=Welcome to blah FTP service.
    设置定制欢迎信息,登录时显示欢迎信息,如果设置了banner_file则此设置无效。
    banner_file=/etc/vsftpd/banner
    设置登录信息文件的位置。
    xferlog_enable=YES
    设置是否使用传输日志文件记录详细的下载和上传信息。
    xferlog_file=/var/log/xferlog
    设置传输日志的路径和文件名,默认是/var/log/xferlog日志文件位置。
    xferlog_std_format=YES
    设置传输日志文件是否写入标准xferlog格式。
    guest_enable=NO
    设置是否启用虚拟用户,YES启用,NO不启用。
    guest_username=ftp
    设置虚拟用户在系统中的真实用户名。
    /etc/vsftpd/vsftpd.conf文件参数(5)
    userlist_enable=YES
    设置是否允许由userlist_file文件中指定的用户登录vsftpd服务器。YES表示允许登录vsftpd服务器。
    userlist_file=/etc/vsftpd/user_list
    当userlist_enable选项激活时加载的文件的名称。
    userlist_deny=YES
    设置是否允许由userlist_file文件中指定的用户登录vsftpd服务器。YES表示不允许登录vsftpd服务器,甚至连输入密码提示信息都没有。 deny_email_enable=YES
    如果激活,要提供一个关于匿名用户的密码电子邮件表以阻止以这些密码登录的匿名用户。默认情况下,这个列表文件是/etc/vsftpd.banner_emails,但也可以通过设置banned_email_file来改变默认值。
    banned_email_file=/etc/vsftpd/banned_emails
    当deny_email_enable=YES时,设置包含被拒绝登录vsftpd服务器的电子邮件地址的文件。
    listen=NO
    设置是否启用独立进程控制vsftpd,用在IPv4环境。YES启用独立进程,NO启用xinetd进程。
    listen_ipv6=YES
    设置是否启用独立进程控制vsftpd,用在IPv6环境。YES启用独立进程,NO启用xinetd进程。
    listen_address=192.168.0.2
    设置vsftpd服务器监听的IP地址。
    listen_port=21
    设置vsftpd服务器监听的端口号。
    pam_service_name=vsftpd
    设置使用PAM模块进行验证时候的PAM配置文件名。
    ftp_username=ftp
    设置匿名用户所使用的系统用户名。

    19.2.3 控制vsftpd服务
    1.启动vsftpd服务
    [root@rhel ~]# systemctl start vsftpd.service
    2.查看vsftpd服务状态
    [root@rhel ~]# systemctl status vsftpd.service
    3.停止vsftpd服务
    [root@rhel ~]# systemctl stop vsftpd.service
    4.重新启动vsftpd服务
    [root@rhel ~]# systemctl restart vsftpd.service
    5.开机自动启动vsftpd服务
    [root@rhel ~]# systemctl enable vsftpd.service

    19.3 配置FTP客户端

    19.3.1 Linux客户端配置
    19.3.2 Windows客户端配置

    19.3.1 Linux客户端配置
    可以在Linux系统中使用ftp命令,或者使用图形界面下的浏览器Mozilla Firefox来访问vsftpd服务器上的资源。
    ftp命令
    ftp命令不仅可以在Linux系统中使用,也可以在Windows系统下使用。

    (1)安装ftp软件包
    [root@linux Packages]# rpm -ivh ftp-0.17-66.el7.x86_64.rpm

    (2)使用ftp命令
    ftp是用户界面的ARPANET标准文件传输协议,该程序允许用户从远程网络站点转移文件。

    命令语法:
    ftp [选项] [FTP服务器]

    19.3.2 Windows客户端配置
    CuteFTP是Windows系统下最常用的图形化FTP客户端程序。它支持下载文件续传、可下载或上传整个目录、具有不会因闲置过久而被FTP服务器断线。可以上传下载队列、上传断点续传、整个目录覆盖和删除等特点。它传输速度快、性能稳定、界面友好和使用简单。
    在这里插入图片描述

    19.4 FTP服务器配置实例

    19.4.1 测试默认匿名用户登录
    19.4.2 允许匿名用户上传下载文件和创建目录
    19.4.3 只允许本地用户账户登录
    19.4.4 限制用户只能访问自己的目录
    19.4.5 配置FTP服务器使用非标准端口
    19.4.6 拒绝指定用户连接FTP服务器

    19.4.1 测试默认匿名用户登录
    vsftpd服务启动之后,默认就允许匿名用户(anonymous或ftp)连接到vsftpd服务器。默认匿名用户不能离开vsftpd服务器匿名用户目录/var/ftp,匿名用户只能下载文件,而没有权限上传文件到vsftpd服务器上。
    1.创建测试文件
    2.生成目录信息文件
    3.启动vsftpd服务
    4.测试默认匿名用户登录

    19.4.2 允许匿名用户上传下载文件和创建目录
    1.创建匿名用户上传目录
    2.编辑/etc/vsftpd/vsftpd.conf文件
    3.设置SELinux
    4.重新启动vsftpd服务
    5.FTP客户端测试

    19.4.3 只允许本地用户账户登录
    如果不允许以匿名用户访问vsftpd服务器,而只能以本地用户访问vsftpd服务器上的资源时。
    1.创建用户zhangsan
    2.编辑/etc/vsftpd/vsftpd.conf文件
    3.重新启动vsftpd服务
    4.FTP客户端测试

    19.4.4 限制用户只能访问自己的目录
    在默认情况下,用户登录到vsftpd服务器上后,可以访问服务器中除了自己目录之外的其它目录,为了增加vsftpd服务器的安全,可以限制用户只能访问自己的目录,而不能访问别的目录。
    1.编辑/etc/vsftpd/vsftpd.conf文件
    2.设置SELinux
    3.创建/etc/vsftpd/chroot_list文件
    4.重新启动vsftpd服务
    5.FTP客户端测试

    19.4.5 配置FTP服务器使用非标准端口
    在默认情况下,vsftpd使用的端口号是22,配置vsftpd服务器使用端口号3000。
    1.编辑/etc/vsftpd/vsftpd.conf文件
    2.设置SELinux
    3.重新启动vsftpd服务
    4.FTP客户端测试
    5.查看vsftpd服务器使用的端口

    19.4.6 拒绝指定用户连接FTP服务器
    配置vsftpd服务器,拒绝用户zhangsan连接vsftpd服务器。
    1.编辑/etc/vsftpd/ftpusers文件
    2.重新启动vsftpd服务
    3.FTP客户端测试

    第20章 Sendmail服务器配置

    20.1 电子邮件简介
    20.2 Sendmail服务器安装和配置
    20.3 配置Sendmail客户端
    20.4 Sendmail服务器认证

    20.1 电子邮件简介

    20.1.1 什么是电子邮件
    20.1.2 邮件系统组成

    20.1.1 什么是电子邮件
    电子邮件是一种用电子手段提供信息交换的通信方式,是互联网应用最广的服务。通过电子邮件系统,用户可以以非常低廉的价格、非常快速的方式,与世界上任何一个角落的网络用户联系。电子邮件可以是文字、图像和声音等多种形式。电子邮件的存在极大的方便了人与人之间的沟通与交流,促进了社会的发展。使用电子邮件具有传播速度快、方便便捷、成本低廉、广泛的交流对象以及信息多样化等优点。

    20.1.2 邮件系统组成
    邮件用户代理(MUA)
    邮件传输代理(MTA)
    邮件投递代理(MDA)

    20.2 Sendmail服务器安装和配置

    20.2.1 安装Sendmail服务器软件包
    20.2.2 /etc/mail/sendmail.mc文件详解
    20.2.3 /etc/mail/local-host-names文件详解
    20.2.4 /etc/mail/access文件详解
    20.2.5 /etc/aliases文件详解
    20.2.6 /etc/mail/userdb文件详解
    20.2.7 Sendmail服务器配置实例
    20.2.8 配置dovecot服务器
    20.2.9 测试发送Sendmail邮件

    20.2.1 安装Sendmail服务器软件包
    [root@rhel ~]# cd /run/media/root/RHEL-7.2\ Server.x86_64/Packages
    [root@rhel Packages]# rpm -ivh procmail-3.22-35.el7.x86_64.rpm
    [root@rhel Packages]# rpm -ivh m4-1.4.16-10.el7.x86_64.rpm
    [root@rhel Packages]# rpm -ivh sendmail-8.14.7-4.el7.x86_64.rpm
    [root@rhel Packages]# rpm -ivh sendmail-cf-8.14.7-4.el7.noarch.rpm

    20.2.2 /etc/mail/sendmail.mc文件详解
    Sendmail服务器的守护进程在运行时会读取/etc/mail/sendmail.cf和/etc/mail/submit.cf这两个文件,但是这两个文件配置起来太复杂,一般不会直接去修改,而是去修改/etc/mail/sendmail.mc和/etc/mail/submit.mc文件。
    Sendmail服务器的第一个配置文件是/etc/mail/sendmail.cf,该文件决定Sendmail的属性,定义Sendmail服务器在哪一个域上工作以及开启某些验证机制。文件内容是特定宏语言编写,都是计算机生成的,该文件实在是过于复杂,我们只需要通过修改/etc/mail/sendmail.mc文件,并且使用m4命令将/etc/mail/sendmail.mc文件编译成/etc/mail/sendmail.cf文件即可。

    20.2.3 /etc/mail/local-host-names文件详解
    必须在/etc/mail/local-host-names文件中定义收发邮件的主机名称和主机别名,否则无法正常收发邮件。

    修改/etc/mail/local-host-names文件,在该文件内可以添加以下内容。
    sh.com
    mail.sh.com

    20.2.4 /etc/mail/access文件详解
    在默认情况下,SMTP协议是不需要经过身份验证的,任何用户通过使用telnet方式都可以连接到本地邮件服务器的25端口上,并发送邮件。为了避免不必要的麻烦,Sendmail中的缺省配置直接禁止其它主机利用本地Sendmail服务器投递邮件。
    使用/etc/mail/access文件可以用于控制邮件中继和邮件的进出管理,可以使用/etc/mail/access文件允许某些客户端可以使用此Sendmail服务器转发邮件。
    在这里插入图片描述在这里插入图片描述

    20.2.5 /etc/aliases文件详解
    在Sendmail决定邮件的接收者的目的地之前,它会先试图在别名中查找。Sendmail的主要的别名配置文件是/etc/aliases。为了优化查找,Sendmail为其别名记录建立了一个哈希表数据库/etc/aliases.db。该文件通过newalias命令产生。

    /etc/aliases文件的格式如下所示。
    [真实用户账户]:[别名1],[别名2]

    20.2.6 /etc/mail/userdb文件详解
    /etc/mail/userdb.db是一个散列表数据库,它是通过/etc/mail/userdb文件产生的。/etc/mail/userdb文件默认不存在,需要手工创建。

    /etc/mail/userdb文件的格式如下所示。
    入站地址:maildrop 被改写的入站地址
    出站地址:mailname 被改写的出站地址

    20.2.7 Sendmail服务器配置实例
    在公司内部配置一台Sendmail服务器,为公司网络内的客户端计算机提供邮件收发服务,具体参数如下。
    DNS域名:sh.com。
    DNS服务器IP地址:192.168.0.2。
    Sendmail服务器IP地址:192.168.0.2。
    Sendmail服务器MX记录:mail.sh.com。
    公司网络:192.168.0.0。
    设置能够给公司全体员工群发邮件。

    20.2.8 配置dovecot服务器
    Sendmail是一个MTA(邮件传输代理),它只提供SMTP服务,这就是说它只通过电子邮件的转发和本地分发功能,但是如果要实现异地接收邮件,就必须要POP3和IMAP服务的支持。一般情况下,SMTP服务和POP3、IMAP服务都安装在同一台服务器上。在Linux系统中,dovecot软件包可以同时提供POP3和IMAP服务。

    1.安装dovecot软件包
    2.编辑/etc/dovecot/dovecot.conf文件
    3.启动dovecot服务
    4.查看端口号

    20.2.9 测试发送Sendmail邮件
    SMTP协议监听端口号25,才能同其它邮件服务器传递邮件,通过使用telnet命令登录Sendmail服务器的25端口,模拟邮件服务器,发送邮件给所在服务器的用户。

    [root@linux~]# telnet 192.168.0.2 25

    20.3 配置Sendmail客户端

    20.3.1 Linux客户端配置
    20.3.2 Windows客户端配置

    20.3.1 Linux客户端配置
    1.编辑/etc/resolv.conf文件
    2.使用mail命令发送邮件
    3.使用mail命令接收邮件

    20.3.2 Windows客户端配置
    在Windows 10客户端上,可以使用Microsoft Outlook 2016。
    在这里插入图片描述

    20.4 Sendmail服务器认证

    在互联网上运行的Sendmail服务器,必须启用中继功能才能转发外部邮件,但是如果不加以限制,那么会使非法用户有机会执行各种操作,比如发送垃圾邮件,甚至被其它邮件服务器屏蔽,无法向外部转发邮件。
    通过Sendmail服务器认证功能,基于SASL验证邮件使用者的账户和密码,能够有效的拒绝非法用户使用Sendmail服务器中继邮件。

    1.安装SASL库
    2.编辑/etc/mail/sendmail.mc文件
    3.重新启动sendmail服务
    4.验证SASL
    5.设置发送服务器要求验证

    展开全文
  • 基于物品的协同过滤算法实现图书推荐系统

    万次阅读 多人点赞 2019-09-14 21:20:24
    本文首先介绍了推荐系统的发展历史,及目前常用的几种推荐算法的介绍与比较,然后基于物品的协同过滤算法基础,详细介绍图书推荐系统的构建。在该系统中,主要功能分为用户功能和图书推荐功能...

    点击可免费下载原文噢

    摘 要

    在当下这个信息爆炸的时代,各种各样的书籍条目繁多,浩如烟海;相应地,为满足用户需求,电商平台需要推荐系统来帮助用户找到自己可能需要的书籍。本文旨在利用基于物品的协同过滤算法,来实现一个图书推荐系统。
    本文首先介绍了推荐系统的发展历史,及目前常用的几种推荐算法的介绍与比较,然后以基于物品的协同过滤算法为基础,详细介绍图书推荐系统的构建。在该系统中,主要功能分为用户功能和图书推荐功能。用户功能包括用户账号的登录与注册,书籍查询,书籍评分。图书推荐功能利用基于物品的协同过滤算法,先计算各个书籍之间的相似度,再根据物品相似度和用户的行为数据计算用户对各个书籍的兴趣度,从而得出推荐结果。
    该系统数据库采用MySQL,采用python编程工具Pycharm编写。

    关键词:电子商务;推荐系统;个性化图书推荐;协同过滤;基于物品。

    ABSTRACT

    In this era with information explosion,there are so many kinds of books. In accordance, to meet user needs, e-commerce platforms need a recommendation system to help users find books they might need. This paper aims to implement a book recommendation system, using an item-based collaborative filtering algorithm.
    This paper first introduces the development history of the recommendation system, and make introduction and comparison among several recommended algorithms which is often used. Then based on the item-based collaborative filtering algorithm, the construction of the book recommendation system is introduced in detail. In this system, the main functions include user functions and book recommendation functions. User functions include login and registration of user accounts, book query and book rating. The book recommendation function uses the item-based collaborative filtering algorithm to first calculate the similarity between the books, and then calculates the user’s interest in each book according to the similarity of the items and the behavior data of the user, thereby obtaining the recommendation result.
    Development tools include MySQL and Pycharm.

    Key words:E-commerce; recommendation system; personalized book recommendation; collaborative filtering; item-based.

    第一章 概述

    1.1课题背景及意义

    随着计算机信息技术和互联网技术的发展,从之前的信息短缺时代,跨越到了信息过剩时代。在这种背景下,人们越来越难以从许多信息中找到感兴趣的信息。相对来说,对于信息来说,想要找到对自身感兴趣的用户也越来越难。而本文研究的推荐系统任务,就是将信息与用户连接。
    想象一下,用户想要购买一本书,例如《C Prime Plus》。用户只需走进书店并按照书名直接购买即可。也可以通过淘宝、京东、当当直接搜索,进行购买。不过,这种方式的前提是用户需要明确自己的需求,确切地知道自己想买的哪本书。
    但是,如果用户没有明确的目标,比如寻找自己喜欢的音乐,用户可以使用预先定义的类型或标签搜索有趣的音乐,但面对大量的音乐,实际上用户可以找到自己感兴趣的音乐。在这个时候,需要分析用户已收听音乐自动工具,用户有兴趣向用户推荐音乐。这是个性化推荐系统的工作[1]。
    信息过滤系统具有以下两个特点:
    1)主动性。从用户的角度来看,门户站点和搜索引擎是解决信息过载的有效手段,但它们需要提供明确需求的用户。如果用户不能正确地说明自己的需要,则这两种方法不能为用户提供正确的服务。用户不需要提供特定的需求,但信息可以由用户推荐。
    2)个性化。推荐系统的核心内容是找到长尾信息[2]。销路好的商品一般表示大多数用户的兴趣,而冷门商品一般表示少数用户的个性需求。在电子商务平台的时代,冷门商品的交付甚至超过了爆品。长尾信息的发现是推荐系统的重要研究方向。
    现在,推荐系统的思想和算法已经趋于成熟,在很多领域被广泛应用,最普遍的是电子商务。同时,随着机器学习和深入学习的发展,工业界和学术界热衷于研究这一挑战性的学科体系。

    1.2推荐系统的发展历史

    推荐系统是一个先进的思想,所以具有其独特性,因为它是一种仅属于网络时代的个性化信息检索工具。随着互联网和大数据时代的到来,人们逐渐意识到,所有信息的不定向推广是耗时费力且收效甚微的,这就体现出来推荐系统的价值。经过20多年的积累和沉淀,它逐渐成为一个独立的问题。
    1994年,明尼苏达集团透镜研究小组推出了第一个自动推荐系统, GroupLens。提出协同过滤是推荐系统中的一项重要技术。
    推荐系统(recommendersystem,RS)于1997年提出。由于推荐系统一词的广泛应用,推荐系统成为一个重要的研究领域。
    1998年,Amazon.com推出了一种基于项目的协作过滤算法。
    2003年,Amazon Linden等人本文提出了一种基于物品的协同过滤算法。据统计,推荐系统的贡献率在20%到30%之间。
    2005年,Admavicius等人论文分为三大类:基于内容的推荐、基于协同过滤的推荐和混合推荐,并提出了今后的研究方向。
    2006年10月,北美在线视频服务提供商Netflix,举办了一个比赛,在学术界和工业界引起了相当大的关注。奖项丰厚,与会者提出了几种推荐算法,以提高推荐的准确性,极大地促进了推荐系统的发展[3]。
    2007年在美国举行的第一次ACM推荐系统会议是2017年第11次。这是推荐系统领域的顶级会议。它提供了一个重要的国际论坛,展示不同领域推荐系统的最新研究成果、方法和方法。
    在2016年,YouTube的宣布使用推荐系统深层神经网络来获得大规模的建议最有可能的建议。
    近年来,推荐系统已广泛应用于电子商务推荐、广告定向投放、时事新闻推荐、抖音、知乎等平台。

    1.3推荐系统的研究内容

    经过20多年的贮存和沉淀,推荐系统在许多领域的应用取得了成功。最常见的应用场景是电商、广告、视频、社交和音乐。这些应用及需要通过推荐系统进行进一步的发展,所以这也是推荐系统研究和应用的重要实验场景。
    随着推荐系统的发展,用户逐渐接受了这种模式,经过调研,用户目前不仅对模型用户历史行为的分析感到满意,而且认可了混合推荐模型。各行业的应用都在致力于通过不同的推荐方法解决冷启动和非常稀疏的数据问题。当前,中国著名新闻客户的头条新闻使用内容分析、用户标签、评级分析等方法创造了数百万美元。用户推荐引擎发展迅猛。
    移动互联网的普及为移动电子商务数据、移动社会数据和地理数据等推荐系统提供了更多的数据。它成为社会推荐的新的尝试。
    通过对推荐系统的应用,推荐系统的有效性评估,稳健性和安全性的算法进行了研究。在2015年,艾伦说和其他人在雷克斯会议上发言。同年,Frank Hopfgartner等人讨论了基于流数据和比较实验的离线评估方法,并进行宣布。
    近年来,机器学习和深度学习的发展为推荐系统提供了方法论指导。2016年以后,RECSYS会议召开了关于推荐体系的深入学习研讨会,推动了研究,鼓励在深入学习的基础上应用推荐体系[4]。
    2017年,Alexandros Karatzoglou等人他的论文介绍了推荐系统的深度学习应用。

    第二章 开发平台及技术

    2.1开发平台

    2.1.1系统开发环境介绍

    Python是一种目前广泛使用的语言,非常受使用者们的欢迎,因其自身的优越性很快就得到了迅速的发展。这对C++,java等今年来流行的语言造成了很强的影响。拥有良好的通用性,作业迅速,良好的跨平台和稳性是Python技术的优点,目前,像个人电脑、数据操作、电脑和手机游戏后台、手机移动端和计算机应用的很多方面都在使用Python作为开发语言,技术稳定成熟,缩短开发时间,重复性好,在线扩展方便。Python因风格简洁、可读性较好深受编程人员的喜爱,并得到了广泛运用[1]。对于推荐系统来说,开发过程中会遇到各种各样的问题,所以在编写程序和运行代码的过程中,关于设计的逻辑和设计过程,都是一个不断发现问题、解决问题的过程,不断完善以达到预期的功能才是我们希望看到的。Python语言具有其他语言所没有的特性,可以使用它进行开发本图书推荐系统平台。
    Python的多样性,意味着可以横跨多个领域,绝不仅限于Web开发、桌面程序、移动应用,甚至包含硬件开发等。所以并没有被束缚在单一的平台之上,Python具有良好的可移植性,在图书推荐系统开发上使用Python可以大大方便项目的开发和维护。
    由上面论述可知,通过Pygame工具的应用,可以简化项目的开发,Pygame使开发者不必过多的在意一些琐碎的问题,因为这些问题Pygame工具会帮我们解决,这让开发者拥有更多的时间和精力放在系统开发的关键部分,给开发者带来了相当大的便利。最关键的是,Pygame拥有跨平台的特性,这使得基于它开发的项目可以自由的在各个操作系统上运行,这省去了很多繁琐的修改。随着Pygame开发工具的流行,该工具以其独特的优越性,越来越多的被应用于各种系统平台的开发。
    当前程序是以python为编程语言,主要功能实现依赖于pygame模块,主要用到surface对象之间的位置变化,再利用事件监听让程序运行起来。运行中Surface对象的位置发生变化后,界面刷新,用户对鼠标与键盘进行操作时,监听操作完成相应事件。
    软件开发方式:①系统总体设计②系统详细设计③编码④测试。
    系统运行环境:Windows7及更高版本。

    2.1.2 数据库系统介绍

    MySQL是一个开源的关系数据库管理系统(RDBMS),它使用广泛使用的结构化语言(SQL)进行数据库管理。
    MySQL是一个开源的,因此任何人都可以在通用公共许可证下下载并更改设置以满足个人需求。
    MySQL速度快、可靠性高、适应性强,一直受到人们的广泛关注。大多数人认为MySQL是在不进行事务处理的情况下管理内容的最佳选择。
    因此,对于简单的数据库使用需求,我选择MySQL作为数据库管理工具。

    2.1.3 开发工具介绍

    PyCharm是一种Python 集成开发环境,它有一套工具可以帮助用户提高开发python语言的效率,例如调试、语法突出显示、智能提示、自动作业、单元测试、project管理、代码跳跃、版本控制。
    编码支持:其支持智能化的 、可配置的编辑器提供代码完成、代码片段、代码折叠和窗口拆分支持,使用户快速便捷的完成任务,节省了用户的时间。
    项目代码导航器:这个IDE快速的帮助引领用户在文件之间切换,从一种方式浏览语句、用法和类的层次结构。如果用户记得使用系统默认提供的快捷键或者是他们自己设置的快捷键,使用效率会更高。
    代码分析:用户可以使用编码规则、错误突出显示、智能检测和一键代码快速完成建议来优化编码[5]。
    Python重构:在程序编写过程中,导入域/变量/常量,重命名,提取方法/超类,移动和前推/后退重构这些操作可以使用这个功能来实现,极大的减少了用户的任务量。
    集成版本控制:如果用户想使用这些功能,如登录、输入、视图拆分和合并, -用户可以在VCS用户界面中找到,这是其通用的功能。
    具有自带的调试器,调试器的功能多样化,可以提供多种功能,用户通过对基于python和 Django的项目进行调试,同样,系统的单元测试,也可以通过它来解决,该调试器包括blake点、分步、多屏幕视图、窗口和计算表达式等。
    集成单元测试:用户可以运行测试文件,单个测试类。一个方法或者所有测试项目。
    另一方面,Pycharco还为Django的开发提供了一些很好的功能,以及对Google应用引擎的支持,以及对Pycharm的支持。

    2.2 开发技术

    python用作该软件的开发语言,其关键技术在于布局、事件监控和数据存储。布局主要是美化界面以及界面的排版。用户交互界面用布局来实现,给用户带来美观、舒适、直接的用户体验。所以,界面布局的设计会影响到使用者的客观感受,获取用户操作使用事件监视技术,而数据监视技术记录所有操作,创建用户需要提取的数据。
    Python是一种优雅、简单、健壮的开源解释语言。产生于1989年,由Givavo RSM开发和设计,设计Pyhlo的最初目的是为了高效的完成某一项任务而创造的。它从一种为提高研究项目的工作效率而创建的通用编程语言开始。经过多年的发展,python已经逐渐得到改进。由于其强大的可扩展性和广泛的库支持,它已经出现在许多领域,如豆瓣等就是成功的应用python技术的例子。
    Python的主要特点有:
    l)低入门标准的python语法相当简短,编写的程序通常简短,非常像日常使用的自然语言,有利于开发者的使用和理解。
    2)Python是一门面向对象的语言,在面向对象中,与面向过程语言的差距就是类和对象的使用,体现了python的特征,面向对象的语言特点是在该语言被创造的时候就体现的。Python之所以能成为一门被大众喜爱的编程语言在于它的精心设计的数据和内存管理。
    3)对于内存的管理,python也有其特定的部分负责,对于开发者来说,程序就显得有必要了,因为开发者只有理解这些程序的前后逻辑才能更好的写出项目,使他们不像C/C++程序员那样专注于处理内存事务。Python的程序设计和编写时间更短、出错更少也是基于此特性。
    4)主机语言与其通信可以方便的被嵌入,可以用C语言编写对于一些对性能特别强调的地方,这些扩展在python中被调用以实现性能改进的目的。相反,Python解释器可以嵌入到C/C++中,它取代接口可以通过动态链接库的形式进行,通过这种方式,程序开发由此变得灵活方便[7]。
    5)在python的标准库中,含有多个模块来实现具体的功能,这些几乎包含了所有与操作系统解释器的交互的功能,也就是Python使用者不用手动人工造轮子,因为这些模块可以直接用于已经完全测试过的功能开发。这些已经被充分测试的模版在实际的编程开发中得到了充分的应用。

    2.3 关键算法

    2.3.1 常见的推荐算法

    现如今网上信息泛滥,想要在里面找一条适合自己的信息的成本真的有点高,如果可以较为完善的推荐系统出现的话,于用户而言,可以大大的节省自己的时间;从商家的角度来看,通过推荐系统可以更为精准地投放自己的商品对象,从而可以更好的卖出自己的商品。
    根据使用数据源的不同可将其大致分为三类:
    1)协同过滤的推荐方法
    2)基于内容的推荐方法
    3)基于知识的推荐方法
    这三类算法通过不同程度融合,可以出现混合推荐算法。
    一、协同过滤算法,其中包括基于用户的协同过滤及基于物品的协同过滤。
    1)基于用户的实现原理:
    1.计算用户之间的距离
    2.将用户之间相近的,推荐给他们喜欢的物料
    3.通过收集用户反馈数据,进一步优化用户之间的距离
    2)基于物品的实现原理:
    1.计算物品之间的相似度矩阵
    2.收集用户评分高的物物品
    3.将与用户评分高的相似度较高的物品,推荐给用户
    4.通过收集用户反馈数据,进一步优化数据
    二、基于内容推荐算法
    实现原理:建立用户画像-行为偏好,建立物品画像,特征,通过相似度计算,然后推荐。
    弊端:建立用户画像,需要基于大量用户行为数据。
    三、基于知识推荐算法
    实现原理:基于知识的推荐算法主要将重点放在知识源,没有冷启动的问题,因为推荐的需求都是被直接引出的。其主动的询问用户的需求,然后返回推荐结果。
    弊端:“知识”的获取比较难。

    2.3.2基于物品的协同过滤算法

    协同过滤推荐算法是推荐系统中最基本的算法。它分为基于用户的协同过滤算法(usercf)和基于物品的协同过滤算法(itemcf)。
    基于物品的协同过滤算法主要分为两个步骤。
    1)计算物品之间的相似性。
    2)根据物品相似度与用户历史行为的,向用户提供推荐列表。
    第一步骤中的关键点是计算项之间的相似度。除了使用基于内容的相似性,它是计算有多少类似的物品,而是看喜欢i的用户中,有多少人喜欢j的,因此计算是基于用户。该兴趣一般都比较确定和不容易改变。当一个用户都喜欢的物品,我们通常可以认为,这两个物品可能属于同一类别。令N(i)表示购买物品i的用户数,则物品i和物品j的相似度可以用公式1来计算。
    ,(1)
    第一步的时间复杂度的改进方法:以UserCF类似,我们可以创建一个用户,项目查找表,通过计算,认为用户有beenhave这些项目之间的相似性时,它可以保证计算的相似性。这样能够保证相似度是有用的,而不用对那些零(可靠地稀疏矩阵)花费大量的计算量。
    第一步相似的改进方法1:如果按上述公式计算的相似性,可以发现,这个物品我和受欢迎的物品j之间的相似性是非常高的,因为流行的读数偏高,所以基本上每个人都会买它。具有较高的知名度的商品不太区分的,所以我们需要惩罚流行物品j的权重[10]。
    ,(2)
    第一步相似性改进方法2:需要惩罚用户的活动。如果用户不活跃,只有购买的图书数量有限,那么这些书很可能在计算项目中感兴趣的一个或两个区域的相似性是有益的,但如果一个书店卖家提供折扣,如果你买90%Amazon的书籍,然后赚取差价,那么用户的行为对计算物品的相似性不会有任何作用,因为90%的书肯定会涵盖了很多的范围,所以你应该惩罚用户的活动,可以采取第一个方法。
    第一步相似性改进方法3:物品的相似性的归属。规范化不仅提高了建议的准确性,还增加了建议的覆盖范围和多样性。例如,在京东上,用户的爱好种类繁多,有相机爱好者、耳机爱好者、电脑爱好者等。很少有人说爱好集中在一个类别中。假设有两种类型的A和B.A类之间的相似性是0.5,B类之间的相似性是0.8,A和B之间的相似性是0.2。当用户购买A类的5本书和B类的5本书后,我们必须向用户提供推荐。如果我们按照前面的方法并按相似性排序,那么推荐的方法应该是B类项目。即使B类别较低,它仍然优于A类。为了高相似性,所以相似性的相似性应该基于类别,因此A的相似性为1,B的相似性也为1 ,以便排序后推荐的A和B产品具有更高的准确性,覆盖范围和多样性。
    第二步则比较简单,计算物品与用户已买物品的相似度(权重和),然后根据相似度排序选出topN。
    ItemCF在实际系统中运用的比较多,主要有两个优点:
    1)item-item表相比如user-user表要小的多,处理起来比较容易
    2)itemcf很容易为推荐提供理由,比如提前进行数据挖掘,可提高可靠性,改善用户与推荐系统的相互作用,并进一步加强定制推荐前推荐数据挖掘等。
    基于物品的协同过滤算法与用户的协同过滤算法相比,基于用户的协同过滤算法有两大缺点。
    1)随着网站用户数量的增加,计算用户数量的相似性就更加困难了。计算的时间复杂度和空间复杂度与用户的增长基本成平方关系。
    2)基于用户的合作过滤算法很难对推荐的结果作出解释和建议。
    基于物品的协作过滤算法是“目标用户”,用于查找与其喜欢的项目类似的项目。从实际情况角度出发,在对于本课题中的需求——图书推荐来说,每个用户对于个性化推荐书籍的需求都比较强烈,此时采用基于物品的协同过滤算法就可以更为充分地挖掘用户的兴趣领域,并且很容易根据用户的历史数据来对推荐结果做出解释,从而使用户更加信任系统做出的推荐结果。

    第三章 系统设计

    3.1 需求分析与建模

    需求分析是软件工程中的一个重要步骤。这个阶段的主要任务就是调查用户需求。并和开发人员进行确认,将客户的非技术性需求转化为技术上可实现的技术性需求[12][13]。明确要实现哪些功能、完成哪些工作,产出规范性文档《需求规格说明书》。在通过评审后,《需求规格说明书》起到了桥梁的作用,成为用户、开发人员进行理解与交流、反映用户的问题结构以用作软件开发的工作依据、作为软件测试和验收的依据[14]。
    总体设计原则的提出是为了确保系统建设成功,并为系统的可持续发展做出规划。因此在系统设计时,我们遵守以下原则:
    简单性:实现系统需求的前提下,尽可能的保证系统简单易操作。一方面,简单的操作会使增进用户体验,另一方面操作过于复杂时,更易引入问题及漏洞。
    针对性:本项目是选用基于物品的协同过滤算法实现图书推荐系统,用明确项目需求为目标,具体需求具体实现,有很强的针对性。
    实用性和一致性:具有较高的视觉一致性。主界面采用tkinter模块进行编写,主界面上的元素统一使用标签插入,具有较高的功能一致性。如图1所示。
    在这里插入图片描述

    图1 总体设计原则

    3.1.1 功能模块图

    在这里插入图片描述
    图2 功能模块图

    3.1.2 类图

    在这里插入图片描述
    图3 类图

    3.1.3 用例图


    图4 用例图

    3.2 可行性分析

    可行性分析包括技术性、经济可行性、社会可行性及其它考虑。
    为避免浪费投资,提高软件生产的成功率。这是解决问题的实际目的,问题可以短时间以小成本解决[16]。
    下面对基于基于物品的协同过滤算法实现图书推荐系统开发进行判断和考察,主要从技术、经济、社会几个方面来分析。
    技术可行性:
    主要分析技术要求的技术可能性可以完成开发任务,硬件和软件可以满足开发人员的需求。功能强大的JetBrains是该软件中使用的开发工具[14]。
    PyCharm 2018.2.3 x64,强大的扩展能力是该软件的特性,该软件对于系统编写及完善有良好的支持效果,也是众多Pythoner喜爱的编译器。随着互联网行业的迅猛发展,软件开发平台及硬件技术同时不断更新进步。大容量、可靠性的提高、低价格也使得软件开发是可行的。本系统的编译需求完全可以由Pycharm编译器承担。
    综合以上情况及考虑,本系统的开发在技术上是完全可行的。
    经济可行性:
    由于本系统较为小型轻便,开发成本较低。此外,该软件稳定、后期维护简单、实用,一旦开发完成即可长期使用。当用户有了新的需求时,只需要根据需求,在原有代码基础上进行更改,维护成本较低。
    综合以上情况及靠背,本系统在经济上是完全可接受的。
    社会可行性:
    法律因素:本系统是本人处于兴趣爱好,独立完成开发的。基于Python完成,同时借鉴市场上同类软件的功能,收集并归纳用户需求,制订设计思路,结合实际中存在的实体,进行创新及开发的。
    用户使用可行性:本系统对用户的要求,没有复杂繁琐的操作,简单易用。使用软件的用户, 在了解了简单的流程后就可以对后台进行管理,没有额外的学习使用环节,节约成本。
    由以上分析可知,本系统在社会可行性方面是完全可行的。

    3.3 系统数据库设计

    根据系统业务和DBMS的需求,建立了最佳的数据存储模型。另外,通过建立数据库内的表结构与表与表之间的关系的处理,能够有效地将数据存储到应用系统中,高效访问存储的数据[15]。好的数据库设计需要以下部分。
    减少数据冗余;
    避免数据维护异常;
    节约存储空间;
    高效的访问;
    需求分析。
    同时需要分析数据和属性各自的特点,以便了解系统中所要存储的数据、了解数据的存储特点、了解数据的存储周期。需求分析中需要了解的问题是实体之间的关系、包含的属性。
    该系统采用MySQL数据库,保存用户的用户名、密码等数据。
    数据库的主要表如下:
    用户(账号,密码)如表1所示。
    图书(标题、评分、简介)如表2所示。
    在这里插入图片描述

    第四章 详细设计

    4.1 页面设计

    4.1.1 登录与注册

    登录与注册设计采用BootStrap的Navbar导航条,插入Button和Entry对象来创建按钮及输入框,并设置了绑定变量来获取输入框输入[16]。
    具体实现步骤为:
    a.设置导航条,其中包括图书推荐系统、图书列表、用户评价后的图书、管理。
    b.登录部分设置两个标签,分别命名为“用户名”、“密码”,放置两个输入框,两个按钮“登录”和“注册”。注册部分设置三个标签分别为“用户名”、“密码”,“确认密码”放置三个输入框,一个“注册按钮”。
    c.密码的文本设置输入密码后显示*号。
    在这里插入图片描述
    图5 登录界面
    在这里插入图片描述
    图6 注册界面

    4.1.2 图书列表部分

    在该部分,选择Web API类型的MVT,使用Django是一款python的web开发框架:与MVC有所不同,属于MVT框架。
    m表示model,负责与数据库交互。
    v表示view,是核心,负责接收请求、获取数据、返回结果。
    t表示template,作用就是将内容反馈并呈现在浏览器上。
    通过与数据库的交互,获取数据并返回结果到图书列表的界面上。
    界面如图7所示。
    在这里插入图片描述
    图7 图书列表部分

    4.1.3 图书详情部分

    首先获取到图书的图片,通过book.title获取标题并将其显示在界面上,通过book.stars获取评分情况将其显示。通过book.desc得到图书简介。
    这部分最关键的部分是显示与此书相似的图书,对训练的结果中的相似图书按照一定的格式显示在页面上。如图8、图9所示。
    判断是否曾经对其进行评分,如果评分过,显示之前的评分。反之,提示用户“您还没有评分过,给个评分吧”。如图10、图11所示。
    在这里插入图片描述
    图8 图书详情界面
    在这里插入图片描述
    图9 图书推荐界面
    在这里插入图片描述
    图10 评分界面
    在这里插入图片描述
    图11 历史评分列表与推荐界面

    4.2 Python实现核心功能

    4.2.1 跳转方式

    当用户在aw和bw未登录时,在SSO上设置登录态,那么在aw和bw上应该设置登录态。如上所述,还是应该在aw和bw上设置各自的登录态,这样在访问aw时首先会在aw域上检测授权,如果没有授权,则跳转到SSO进行登录授权[17]。但是aw和bw应该为登录态一般设为浏览器进程存活期,即aw和bw的登录态的存活期直到浏览器关闭。SSO域上登录态的存活期取决于具体的业务,本系统中设为7天。代码如下:
    app = Flask(name)
    app.config[‘SECRET_KEY’] = os.urandom(24) # 服务器启动一次上次的session就清除,因为设置为随机产生的24位的字符,也就是说每次运行服务器都是不同的。
    app.config[‘PERMANENT_SESSION_LIFETIME’] = timedelta(days=7) # 设置session的保存时间。

    4.2.2 数据库连接

    首先创建数据库连接,打开数据库连接。代码如下:
    import pymysql
    def create_connection():
    db = pymysql.connect(“localhost”, “root”, “12345678”, “bookrecommend”)
    return db

    4.2.3 ItemCF算法的实现

    1.ItemCF算法的实现是本图书推荐系统的核心内容,首先要计算出物品之间的相似度,相似度是推荐的关键评判指标,然后根据物品的相似度,并结合用户的历史行为,即那里评分矩阵,从而给用户生成可靠的推荐列表。
    具体步骤:
    首先建立物品的同现矩阵。
    其次建立用户对物品的评分矩阵。
    最后矩阵计算推荐结果。
    def ItemSimilarity(train):
    # 物品-物品的共同矩阵
    C = dict()
    # 物品被多少个不同用户购买
    N = dict()
    for u, items in train.items():
    for i in items.keys():
    N.setdefault(i, 0)
    N[i] += 1
    C.setdefault(i, {})
    for j in items.keys():
    if i == j:
    continue
    C[i].setdefault(j, 0)
    C[i][j] += 1

    2.计算问题之间的相似度
    W = dict()
    for i, related_items in C.items():
    W.setdefault(i, {})
    for j, cij in related_items.items():
    W[i][j] = cij / math.sqrt(N[i] * N[j])
    return W
    问题i与问题j之间的相似度这么定义:同时关注问题i与问题j的人数/关注问题i人数关注问题j的人数的平方根[18]。
    由此我们就需要计算n个问题之间两两相似度,就是一个对角线为1的对称邻接矩阵,也就是说,想要成功求出n个问题之间的相似度,至少需要计算n
    (n-1)/2次,这样才可以计算n个问题之间的两两相似度。
    推荐前K个用户
    def Recommend(train, user_id, W, K):
    rank = dict()
    if user_id not in train: return []
    action_item = train[user_id]
    for item, score in action_item.items():
    for j, wj in sorted(W[item].items(), key=lambda x:x[1], reverse=True)[0:K]:
    if j in action_item.keys():
    continue
    rank.setdefault(j, 0)
    rank[j] += score * wj
    return sorted(rank.items(), key=lambda x:x[1], reverse=True)

    第五章 系统测试

    测试就是为了寻找程序中的错误,一个成功的测试就是发现至今尚未发现的错误的测试。在这样一个找错误的过程中,每发现一个错误都是值得高兴的,因为这可以又为以后排除了一个潜在的隐患,同时系统如果要是经过测试投入使用后再发现系统的错误,那么将会花费更多的物力和财力才能解决问题,这样无疑会造成投入成本增加,更严重的甚至导致该系统不能使用白白浪费了之前的投入。因此在系统正式投入使用之前,尽可能全面的去测试系统无疑是必不可少的,也是非常重要的[19]。
    在实际的生产生活中在真实的系统工作环境下通过与之前的需求分析进行作比较,检查实现的功能是否符合需求分析的要求,是否满足客户要求。系统测试主要有两种常用的方法,黑盒测试和白盒测试,它主要是根据是否关心程序的内部结构来划分的。所谓的黑盒测试是指不关心程序如何编写的,内部结构如何,只关心输入和输出的结果是否的正确。白盒测试是将程序看成一个透明的盒子,进而分析程序内部的运行情况是否正确。
    测试就是通过静态审查或者运行程序从而找出软件实现过程中是否与需求存在偏差。除此之外,测试还需要软件质量进行度量,这样可以全面掌控软件情况,从而及时采取措施推进问题修复。测试的原则之一是测试应当尽早介入,这样的话,在研发阶段,越早发现问题,造成的损失越小,所以该问题的修复成本就越低。在寻找错误的过程中,不断完善系统,尽量的避免问题出现与系统投入使用过后,修复成本大幅度增加的情况。因此,进行全面的系统测试是不可或缺的[20]。
    在实际的测试流程中,将在设计阶段根据需求撰写测试用例,并根据实现情况对用例进行补充及修改,验证需求实现情况,提出问题并推进修复,最后给出软件质量度量。
    执行程序给定输入,并校验程序输出是否符合预期结果是黑盒测试的标准流程。它不必关心程序的内部实现逻辑,不需要涉及代码层面[2]。与之对应的是白盒测试,大多是通过静态代码审查的方式,不运行程序,凭借程序实现的逻辑结构,来检查程序是否满足需求,符合预期。

    5.1 测试的定义及其重要性

    5.1.1 测试的定义

    软件测试是直接影响软件质量评价的重要部分,这是用来衡量实际开发的系统与预期结果之间的审核比对过程,查缺补漏。软件测试需要采用有效的方法,及时发现问题,防止后续出现难以掌控的状态。测试的作用就是在衡量成本的条件下,尽可能的找出问题并推动问题修复,为软件质量作出度量,避免问题出现在系统投入使用后,减少修复成本。

    5.1.2 测试的重要性

    随着软件行业的蓬勃发展,人们更加关注的是软件质量的实现,因此软件测试就愈发重要。在软件工程中,这是必不可缺的一环。在操作和维护阶段之前,应确保软件的质量,然后在操作和维护阶段向用户提供软件产品。随着系统测试越来越重要,测试理论、测试方法越来越科学,普遍认为:软件测试应该在项目之初就进行介入。虽然软件测试的原则之一就是测试不可能发现所有BUG,软件必定是存在BUG的。但是为了减少错误的引入,我们可以使用完备的开发过程、有效的开发方法和新的语言,但这些方法只是最大程度的降低了错误。通过测试来检测这些误差是很有必要的[18]。BUG具有集群性,符合“二八原则”。测试过程中,通过统计问题分布,可以推算哪些模块需要继续进行测试。

    5.2 测试方法及过程

    白盒测试是基于代码的一种测试设计方法。测试人员通过审查代码、明晰代码实现逻辑后,以验证程序逻辑为目标,构造测试用例及数据。与之对应的黑盒测试,不关心程序内部的实现逻辑,只着眼于外部结构,将程序视作一个“黑盒子”,输入测试数据,查看输出结果与预期结果是否一致[13]。运行程序、进行输入,然后得到实际结果从而验证软件是否满足需求。
    探索性测试是一种测试思维与理念,在对系统有一定了解的情况下,不严格拘泥于先设计后执行的测试思路。探索性测试是设计与执行同时进行的,实践表明,探索性测试往往能暴露出更多的问题。
    在本系统中,综合采用了两种方法,还结合了探索性测试的思路,使测试过程可以暴露更多问题。
    本次测试主要达到以下测试目的:
    (1)功能检查:根据需求与实现产品,验证功能需求实现情况,检查功能实现是否有遗漏偏差。
    (2)数据检查:主要对用户、登录注册信息进行检查,检查数据库与程序之间的交互部分。
    (3)性能检查:针对于本次的系统,该项主要是检查推荐的图书,是否存在错误现象
    (4)稳定性检查:由于事件读取是从鼠标键盘上获取的,而导致后台响应频率较高,所以要检查程序是否出现运行终止、重启等现象。

    5.3 各模块具体测试

    5.3.1登录测试

    对用户输入的用户名,密码进行验证匹配。与pymysql结合简化了SQL查询,并与pymysql.connect协同工作将使编码量大为减少。
    测试编号:1
    描述:本测试用例用于验证系统用户登录
    前提:用户已进入系统且进入用户登录页面
    备注:使用正确的用户名和密码登录系统,与数据库信息进行验证,验证成功后,必须进行登录操作的二次检查操作,即使用错误的密码登录,也需要验证系统登录验证是否准确,以及相关的错误反馈信息是否正确。
    具体步骤:
    1.进入图书推荐系统
    2.进入主页面之后,在“用户登录”部分、在对应的文本框中分别输入用户名和密码信息。
    3.单击“登录”按钮,启动系统登录确认
    4.在页面“用户登录”区域,用户名文本框和密码文本框中分别输入错误或者不存在的用户名和密码。
    输入值:用户名,密码
    期望结果:步骤2验证通过,登录成功。步骤4准确反馈错误信息(密码错误、账号不存在)。
    实际结果:步骤2验证通过,登录成功。步骤4准确反馈错误信息(密码错误、账号不存在)。
    是否通过:通过

    5.3.2 注册测试

    在注册的过程中,加入校验。经测试无误。
    function onregistclick() {
    var username = $("#name").val();
    var password = $("#password").val();
    var repassword = $("#repassword").val();
    if(!username) {
    alert(‘用户名不能为空’);
    return;
    }
    if(!password) {
    alert(‘密码不能为空’);
    return;
    }
    if(password!==repassword) {
    alert(‘两次密码不一致’);
    return;
    }
    $.post("/regist", {“username”:username, “password”:password}, function (resp) {
    if(resp&&resp.result){
    window.location = ‘/login’
    }else{
    alert(‘注册失败,请更换个用户名!’)
    }
    })
    }
    测试编号:2
    描述:本测试用例用于测试用户“注册账号”功能是否正确
    前提:用户进入系统,在“注册账号”功能页。在“注册账号”页面编辑后提交。
    备注:需要再次进入页面以确保数据已完全更新。
    步骤:
    1.进入图示推荐系统登陆页面,点击注册账号,进入注册账号页面。
    2.在页面输入账号信息(用户名、密码、确认密码)
    3.点击注册按钮,将新用户的账号数据添加到数据库中。
    输入值:用户名,密码,确认密码
    期望结果:用户添加账号成功。
    实际结果:用户添加账号成功。

    5.3.3 数据库连接测试

    在这里,数据库管理工具用的是Navicat,选择它的原因是,全面的图形化方式进行数据库的管理,所以非常易用而且可靠,Navicat与数据库进行连接的原理是通过SSH通道和HTTP通道,既可以最大程度上避免漏洞保护数据信息,又可以在使用时,对远端服务器的访问不受安全性影响[9]。可利用图形化界面,直接对数据库对象进行创建、编辑和删除等。
    在这里,数据库管理工具用的是Navicat,选择它的原因是,全面的图形化方式进行数据库的管理,所以非常易用而且可靠,Navicat与数据库进行连接的原理是通过SSH通道和HTTP通道,可以最大程度上避免漏洞保护数据信息,同时又具备安全性。可利用图形化界面,直接对数据库对象进行管理。
    测试编号:3
    描述:本测试用例用于测试数据库连接是否成功
    前提:注册后的用户进入系统,通过登录确认进入推荐系统页面。在后台检查用户信息进行校验。
    备注:需要再次进入页面以确保数据已完全更新。
    步骤:
    1.注册
    2、进入图书推荐系统后,通过验证进入普通用户权限界面,首页即是图书推荐系统首页。
    3.查询数据库文件看是否有新用户加入、或者是重新登录,查看是否可以成功登录。
    4.输入用户名和密码,点击“登录”按钮,更新数据库中的信息
    期望结果:用户成功登录。
    实际结果:用户成功登录。
    是否通过:通过
    5.3.4 图书详情显示测试
    测试编号:4
    描述:本测试用例测试图书列表查看是否实现。
    前提:用户已经进入系统,通过登录验证进入推荐系统功能页面。
    步骤:
    1.进入图书推荐系统的功能页面。
    2.点击“图书列表”。
    期望结果:用户可以查看图书列表。
    实际结果:用户可以查看图书列表。
    是否通过:通过

    测试编号:5
    描述:本测试用例用于测试图书图片显示是否成功是否正确
    前提:用户已经进入系统,通过登录验证进入推荐系统功能页面。
    步骤:
    1.进入图书推荐系统的功能页面。
    2.点击“图书列表”
    期望结果:用户能够查看图书具体信息(图片)。
    实际结果:用户能够查看图书具体信息(图片)。
    是否通过:通过

    测试编号:6
    描述:本测试用例用于测试查看图书详情是否能成功显示。
    前提:用户已经进入系统,通过登录验证进入推荐系统功能页面。
    备注:需要再次进入页面以确保数据已完全更新。
    步骤:
    1.进入图书推荐系统主页面
    2.点击“图书列表”
    3.进入图书详情界面。
    期望结果:图书详情显示无误。
    实际结果:图书详情显示无误。
    是否通过:通过

    测试编号:7
    描述:本测试用例用于测试“评分”功能是否正确,并针对不同的评论状态,查看之前的评论或者提交评论。
    前提:用户已经进入系统,通过登录验证进入推荐系统功能页面。
    步骤:
    1.进入图书推荐系统主页面
    2.点击“图书列表”
    3.进入图书详情界面。
    4.查看评分
    期望结果:用户如果评过,提示已经评分,若未评分,则可以进行评分。
    实际结果:用户如果评过,提示已经评分,若未评分,则可以进行评分。
    是否通过:通过

    测试编号:8
    描述:本测试用例用于测试用于测试 “显示标题、简介”等功能是否正确
    前提:用户已经进入系统,通过登录验证进入推荐系统功能页面。
    步骤:
    1.进入图书推荐系统主页面
    2.点击“图书列表”
    3.进入图书详情界面。
    期望结果:可以正确显示标题、简介等信息。
    实际结果:可以正确显示标题、简介等信息。
    是否通过:通过
    5.3.5 图书推荐测试
    循环输出得到的相似图书,经测试,输出无误。
    {% for book in simbooks %}










    {{ book.desc }}



    {% endfor %}
    测试编号:9
    描述:本测试用例用于测试“推荐图书”功能是否能实现。
    前提:用户已经进入系统,通过登录验证进入推荐系统功能页面。
    步骤:
    1.进入图书推荐系统主页面
    2.点击“图书列表”
    3.进入图书详情界面。
    期望结果:用户可以查看“推荐图书”列表及详情信息。
    实际结果:用户可以查看“推荐图书”列表及详情信息。
    是否通过:通过

    5.4测试报告

    测试报告是测试阶段的最终文档输出。一个好的测试管理员应该具有良好的文档编撰能力。详细的测试报告包括足够的信息,包括产品质量和测试过程的评估,测试报告基于最终测试结果的测试和分析数据。以下是本系统设计的测试报告表。

    表3 测试报告表
    在这里插入图片描述

    5.5 软件评价

    软件评价是指软件正式运行后,根据需求对软件的功能、性能、结构、界面友好性等内容做出客观表述[20]。
    功能评价:
    本系统可流畅运行、界面风格简单友好,实现功能可以满足用户需求。
    数据评价:
    数据库设计合理完全可以满足使用需求,且程序与数据库交互良好,维护成本低。
    性能评价:
    主内容性能良好,系统对用户的可交互性良好,但程序打开与开始系统时,停顿时间较长。
    稳定性评价:
    程序运行过程中未发生程序终止、重启等异常现象。
    第六章 总结与展望
    本文首先阐述了推荐系统开发的经过,分析了推荐系统目前的研究状况。其次,阐述了推荐结果的主要推荐方法和评估指标。最后分析了主流的推荐算法以及它们各自的优缺点,尤其是基于物品的协同过滤算法。
    推荐系统的开发,一方面使用户和信息精确一致,另一方面降低信息过载时的信息获得成本。但是,通过新闻推荐等推荐系统进行的内容分发也会给用户带来不良影响。2017年9月19日,“人民日报”指定了在中国有名的内容出版平台的标题,强调了推荐系统的开发不仅需要满足用户的多样化和个性化的需要,还需要严密监视和过滤提高推荐系统的稳健性的信息。近年来,关于用户隐私、劝告引擎稳健性、信息过滤的论文被包含在今后劝告系统的重要研究方向的recsys会议中。
    目前,深层神经网络发展迅速,为推荐系统提供了新的思路,例如特征提取和排序法。现在越来越多的推荐引擎将传统的推荐算法与深层神经网络结合,以解决数据分区和推荐排名问题。深层神经网络与推荐系统的组合是今后推荐系统的研究课题。
    总而言之,推荐系统是一个巨大的信息系统。它依赖于引擎工作以及业务系统、日志系统和许多其他方面。同时,它结合了网络安全和数据挖掘等诸多研究领域。这可以为企业和用户带来值得详细研究的价值,因此,对此领域需要更深入的研究。
    而随着当代社会突飞猛进的发展,在可预见的将来,数据与信息的量级只会越来越大。彼时,对信息筛选的需求也会日益增长,推荐系统将会在未来造成越来越大的影响,对推荐系统的研究也将达到新的高度。
    本次课题研究是基于兴趣爱好的一次实践,兴趣爱好给予了我很大的动力,这也使我在遇到各种问题时,总能通过多种渠道找到解决方案。在一边进行学习,一边进行系统开发和设计过程中,遇到了很多靠自己无法解决的问题,走了很多弯路,但是,这次课题研究锻炼了我自我解决问题的能力,不仅让我对Python有了进一步的了解,而且还大大提高了编程能力,锻炼了自己的逻辑思维和整体设计的能力,收获颇多。通过这次课题研究设计,我意识到完整的软件开发思路是非常重要的,它关系到我们开发过程能否顺利实现。在项目开始之前,必须有软件工程的系统化的知识体系,不仅如此,还应包括软件结构位置、代码编写和模块划分和整体布局,只有做完这些步骤,才能逐步开发出想要实现的功能。这样定能达到事半功倍的效果。

    结束语

    本研究课题主要工作成果是设计并实现了一个基于物品的协同过滤算法实现图书推荐系统,主要任务有以下几个方面:
    文章的主体部分进行了主要模块的详细分析设计与实现。
    然后对主要功能点做出测试及文字说明,使内容详实。
    虽然系统已经做出来并且已经通过测试 ,但是系统的开发以及课题的书写由于能力和时间的原因,还存在着一些不足和不完善的地方。
    1.在页面展示方面,多数依赖列表形式,页面比较单调,有待改进。
    2.程序的性能需要不断优化,如何让图书更精准地推荐、后台可以更快捷的完成自己的工作,有待加强。
    3.还需要实现一些人性化的功能,如图书检索、对高质量期刊的推送等。
    在功能分门别类的编写时,遇到的问题较为基础 ,通过简单的设置断点等方式,可以成功解决,但是在将各个模块的功能进行整体的测试时 ,遇到了很多问题,甚至在开发周期中,因为一个抛出的异常,导致一周进度都没有更新 。查阅多种文档都未曾发现解决方案,最后,终于在外网某网站的一条帖子下的评论下,找到了解决问题的思路。
    之前对数据库的使用较为生疏,比如说连接数据库 、建立新表、增删改查对应的sql语句等,在课题研究的过程中,经过练习,对这类操作越发熟练 ,前端的设计在去网上参考了许多优秀的前端界面后设计的。
    通过今后对一些优秀的前端框架以及Python不断地学习与探索,在实践不断研究与摸索,做出更美观的前端界面,以及对接口进行研究,希望以后可以继续完善这个系统。
    经过一个学期的学习与工作,我终于完成了《基于物品的协同过滤算法实现图书推荐系统》这一课题。从接到题目到查找资料,学习知识,再到构思系统,动手实践,编写代码,我在了解了程序编写不易的同时,也增长了知识,积累了宝贵的实战经验。一开始对机器学习、推荐系统、推荐算法的几乎零基础,这使我在学习中遇到了一些困难,在指导老师的指导下,结合查阅相关资料,慢慢克服了困难,最终完成了这个项目。在实践的过程中,我也认识到推荐系统在我们的生活中扮演了重要的角色,为广大用户提供了便利;一个高效的推荐系统可以较为准确地预测用户的喜好偏向,从而为用户提供便捷地购买或使用体验。
    我知道我的课题研究还很不成熟,其中有许多的不足之处,我会在今后的学习与工作中深入学习推荐系统与推荐算法相关知识,努力完善自身的知识系统和编程能力,丰富自身的知识储备。本次宝贵的实践经验也让我受益匪浅,此次过程让我积累了程序开发与调试的经验,对以后从事相关工作有很大的帮助。
    参考文献
    [1]章宗杰,陈玮.基于标签扩展的协同过滤算法在音乐推荐中的应用.软件导刊,2018,17(1):99-101.
    [2]张智强,伍传敏.基于协同过滤算法的电子商务推荐系统.佳木斯大学学报:自然科学版,2018,36(4):603-606.
    [3]杨丽丽,袁浩浩.基于组合优化理论的协同过滤推荐算法.现代电子技术,2018,41(1):139-142.
    [4]肖文强,姚世军,吴善明.一种改进的top-N协同过滤推荐算法.计算机应用研究,2018,35(1):105-108.
    [5]张双庆.一种基于用户的协同过滤推荐算法.电脑知识与技术:学术版,2019(1):19-21.
    [6]苏庆,章静芳,林正鑫,李小妹,蔡昭权,曾永安.改进模糊划分聚类的协同过滤推荐算法.计算机工程与应 用,2019,55(5):118-123.
    [7]王宁,何震,黄泽,周毅鹏,武鑫良.改进协同过滤算法在服装个性化推荐的研究.湖南工程学院学报:自然科学版,2019(1):33-36.
    [8]陆俊尧,李玲娟.基于Spark的协同过滤算法并行化研究.计算机技术与发展,2019,29(1):85-89.
    [9]吴宾,娄铮铮,叶阳东.一种面向多源异构数据的协同过滤推荐算法.计算机研究与发展,2019,56(5):1034-1047.
    [10]沈鹏,李涛.混合协同过滤算法在推荐系统中的应用.计算机技术与发展,2019,29(3):69-71.
    [11]张玉叶,宿超.基于Python的协同过滤算法的设计与实现.山东广播电视大学学报,2019(2):82-85.
    [12]王嘉菲,朱志锋.基于协同过滤算法的视频智能推荐系统.湖北大学学报:自然科学版,2019,41(2):202-207.
    [13]邓亚文,罗可.一种基于用户和物品相似度的融合协同过滤推荐算法.电脑与信息技术,2019,27(1):6-10.
    [14]李淑敏,夏茂辉,赵志伟.基于spark的协同过滤推荐算法的改进.软件,2019,40(2):173-178.
    [15]张志鹏,张尧,任永功.基于时间相关度和覆盖权重的协同过滤推荐算法.模式识别与人工智 能,2019,32(4):289-297.
    [16]石京京,肖迎元,郑文广.改进的基于物品的协同过滤推荐算法.天津理工大学学报,2019(1):32-36.
    [17]谭立云,刘琳,苏鹏.图书借阅推荐系统算法的python实现.科学技术创新,2018(22):84-85.
    [18]邓园园,吴美香,潘家辉.基于物品的改进协同过滤算法及应用.计算机系统应用,2019(1):182-187.
    [19]周强,李曦.基于推荐技术的中国音乐数据库系统的设计.计算机技术与发展,2015,25(7):162-165.
    [20]曹景振,贾新磊,李松丹.基于物品的协同过滤算法在ACM在线评测推荐系统中的改进及应用.无线互联科技,2018,15(5):135-13

    源码下载链接

    原文下载链接

    原文

    源码下载链接

    https://download.csdn.net/download/ancientear/15036935
    源码下载链接

    展开全文
  • 园博会是园林艺术展览的一种主要形式,近年来随着社会经济的发展,人民生活水平和城市建设水准的提高,国内...本文西安2011世界园艺博览会地区园设计切入点,探讨园博会地区园在传播生态文明的理念、方法、手段和成果。
  • 带着“适度前瞻”的理念,无锡市人民医院将服务器虚拟化、存储整合、SOA中间件、管理自动化等一系列新技术应用到数据中心建设当中,收获了人力、能源、耗材等多方面的成本节省。 虽然由原无锡市一院、无锡市儿童...
     
    

      带着“适度前瞻”的理念,无锡市人民医院将服务器虚拟化、存储整合、SOA中间件、管理自动化等一系列新技术应用到数据中心建设当中,收获了人力、能源、耗材等多方面的成本节省。

      虽然由原无锡市一院、无锡市儿童医院和无锡市五院全建制,以及无锡市三院部分重点专科整合组建而成的无锡市人民医院刚交付使用半年时间,却已经接待了7000人次来参观学习信息化建设。这个耗资1亿元人民币打造的一期信息化建设项目,究竟有何特别之处呢?

    节省成本 提高效率

      作为一所现代化的三级甲等医院,无锡市人民医院在一批尖端医疗项目上达到了国内先进水平,以“医院信息系统”(HIS)、“医疗影像存储与传输 系统”(PACS)、“电子病历系统”、“社会保险系统”为代表的医疗业务系统也应用到了数字化医疗设备和先进的网络技术。比如为全院42个病区配置的心 电系统(包括心电采集盒和笔记本电脑),可以方便临床医生在心电采集后,通过无线发送到心电图室进行分析与诊断,大大降低了人员与耗材成本。心电图室只需 要7个人就能应对所有的门诊病人。而独具特色的大生化生产线则可以实现自动帮助分管、自动离心、自动揭盖,尽可能减少病人血液的采集,并且可以提高至少 30%的工作量。检验科可以节省生化、免疫、血液设备操作约8个人的工作量。此外,世界上第一台可以在包装上打印二位打印条码的药品自动分包机也诞生在这 里。还有EDA终端设备、条形码腕带、一卡通就诊卡等……

      另外,和其他单位的医疗信息化建设一样,无线医疗技术在无锡市人民医院也具有重要的作用,开展的无线应用包括无线床边护理、无线输液管理、无线 移动心电、无线上网等。不过,医院巨大的占地面积、复杂的内部结构给无线网络的覆盖和优化提出了挑战,无锡市人民医院最终选择了昂科信息技术(上海)有限 公司的室内信号分布系统覆盖解决方案,通过由功分器、耦合器和多个天线组成的信号源矩阵,实现了无线信号更全面、更均匀的覆盖,同时避免了同频干扰问题, 提高了无线系统的整体稳定性。而整套系统的信号发射源实际上只有放置在楼层弱电间的无线基站,此外可以通过无线控制器和管理系统对设备进行集中管理、统一 配置,以及各种数据的采集分析。

    用整合带动医疗系统的运转

      “提到适度前瞻,我们的胆子确实是大了一点,这也是市政府对我们的要求和希望,要把无锡市人民医院的信息化建设达到国际化水平。而在医疗流程上实现无纸、无胶片的电子化诊疗服务后,数据中心就像是一辆行使中的列车,不能再停下来了……”

      那么,如何确保这么多先进的医疗业务系统能够顺利运行?“这离不开医院对服务器虚拟化、存储整合、SOA中间件等技术的充分应用。”无锡市人民 医院信息中心主任刘喻表示,“提到适度前瞻,我们的胆子确实是大了一点,这也是市政府对我们的要求和希望,要把无锡市人民医院的信息化建设达到国际化水 平。而在医疗流程上实现无纸、无胶片的电子化诊疗服务后,数据中心就像是一辆行使中的列车,不能再停下来了……”

      刘喻介绍说,在应用了存储整合虚拟化、自动归档等技术后,所有跨平台和容灾的问题都可以实现,起到了节省人力和绿色环保的效果。为了支撑无锡市 人民医院全方位(部门、科室)、全对象(病人、医护、药品、耗材)和全过程(治疗、住院)的发展目标,必须要求数据中心对前面提到的各个医疗业务系统有着 很好的支撑。

      无锡市人民医院首先建立了冗余的SAN存储架构,对数据资源进行分类集中存储。刘喻介绍说,医院每天要产生50G的数据量,一年就是18个 TB。由于HIS、PACS和电子病历等系统是在不同时期分批建成的,各系统的数据处于分散存储状态,每个系统所采取的存储方式与存储介质也各不相同。在 PACS系统上线后,数据规模呈几何级数增长。按照原来的存储方式,这些数据被存放在系统外挂的盘阵之中,一旦医生需查询这些历史文件,就只能到光盘库中 去检索,非常不方便。通过分别位于主机房和容灾机房的两台HDS设备,以及昆腾的磁带库等构建的SAN存储架构,不仅是整个存储系统性能、可靠性的保证, 还实现了性能优化,可以动态管理各个系统的Cache缓存。而赛门铁克针对存储和容灾的系列软件还可实现不停机扩容,只要所需设备在软件列表当中,就可以 使系统不再依赖某个物理地址、物理介质和硬件设备。

      “HIS是一个数据库性的业务系统,要求业务应用不间断,需要在安全方面往容灾方向发展;而PACS则属于文件型系统,以大容量为特点,需要整 合存储架构以实现海量存储。”刘喻介绍说,为了实现集中管理,信息中心首先对各个医疗业务系统及其后台数据进行了整体规划,按其自身特征可划分为 “PACS数据”和“非PACS数据”等两大类,并制定了“分类存储、一体备份、重点容灾”的数据资源集中管理方案。在该方案架构下,信息中心选用HP Integrity rx8640动能服务器运行Oracle 10g数据库系统;选用IBM System x3950服务器运行HIS、PACS、LIS应用系统,并在灾备机房配置同样的设备,对以上系统实施灾备;另外选用Dell PowerEdge 2900服务器运行电子病历、社会保险等业务系统。

      在存储系统方面,无锡市人民医院采用一台HDS公司的AMS-1000存储阵列作为PACS存储设备,同时采用两台HDS公司的AMS-500 存储阵列作为HIS存储设备。中心机房和灾备机房的多台服务器(经统计为8台)通过SAN方式连入一台AMS-1000和两台AMS-500存储阵列。借 助SAN架构出色的I/O性能,医疗病案、影像系统的I/O性能也会得到大幅的提升,同时也为日后的LAN-Free备份等基于SAN架构的应用打下良好 的基础。目前医院可达到在线存储12个TB的水平,轻松完成和几年前的图像做对比的工作,保持“一直在线”的存储状态。

      另外,信息中心还对所有业务系统和数据资源进行统一备份、归档,并对重要且读写频繁的数据和关键应用系统实施异地容灾。按照系统规划要求,对原 有Symantec Backup NBU备份软件、Symantec Enterprise Vault迁移归档软件和Dell PV160T(即Quantum Scalar i2000 )磁带库进行升级扩容,并在备份软件中添加操作系统快速恢复模块,在灾备机房新添加一台Quantum Scalar i500磁带库。

      其中新添加的Symantec NBU操作系统快速恢复模块,可对中心机房和灾备机房的8台主业务系统服务器和16台应用PC服务器进行保护,将以上服务器的操作系统、应用程序、系统设 定与数据等所有内容储存在易于管理的单一档案中,在短短数分钟内重建整个系统或执行裸机还原,并且将系统迅速还原至不同品牌、不同机型的硬件平台,使重要 IT 服务的停机时间降到最低。

      此外,SOA中间件也是数据中心里非常有特色的一项技术应用,通过适配器,更好地实现新进医疗设备的连接,并且极大地提升连接速度,以前HIS 系统的一个接口可能要一年时间才能做好,现在十几天就可以接好了,大大提高了工作效率,而且一步到位。同时,根据现在的SOA标准,可以为未来发展的数据 进行设备预留。目前,包括条形码腕带、药品自动分包机、大生化生产线、检验设备等连接和应用都是通过SOA中间件来实现的。

    管理人员不进机房

      众多医疗业务系统需要数据中心的保障,而关键设备又需要很好的维护和管理。对于无锡市人民医院来说,偌大的数据中心有1000多平方米,16个机柜的规模相当于一个省级电信中心,但是专门负责数据中心机房维护的就只有2~3个人。

      对此,刘喻表示,“借助数据中心在可靠性和安全性上的提高,以及相关设备的智能化和自动化技术,极大地解放了网络管理人员,没有意外事件的话我们甚至都不用进机房。”

      刘喻首先提到了APC的英飞(InfraStruXure)整体机房解决方案。“这套系统集机柜、UPS、制冷、数据布线以及管理服务于一体, 其上走线方式、热空气遏制系统等独特技术都很好地保障了核心设备,在数据中心机房甚至找不到一个开关,其自动化程度非常震撼。”

      此外,创新的InRow架构有效缩短了冷热空气的传输距离,这种有针对性的精确制冷方式,也让数据中心的制冷效率大大提高。而其标准化的模块化 架构,也可以根据实际需要和机房负载情况提供供电和制冷,更加方便未来的扩容。由于采用了集中式管理,每年更可以节省70%的机房配套设施,使得整个机房 最少能节约50%的电费。同时英飞的集中监控功能也让刘喻印象深刻,分布在各个机构上的传感器可以测量每个机柜的温度和湿度等信息。出现问题可以自动报 警,及时给管理人员发短信。

      除了整体机房解决方案外,为了便于管理人员集中管理维护整个信息化系统,信息中心还在机房配置了Avocent AMX 5020 KVM交换机,连接数据中心所有主要服务器平台和串行设备。该款交换机配备了使用方便的OSCAR图形用户界面,能提供完全畅通无阻的服务器访问,并可在 离服务器最远三百多米的情况下提供实时高带宽视频。“目前数据中心不允许通过互联网进行远程登录,管理人员通过KVM就可以很方便地确保数据中心的设备安 全。”刘喻表示。

      而在存储设备的自动化方面,信息中心购买的存储设备在具有5个9的可靠性保障基础上,还支持RAID 6标准,确保了在高性能要求环境下的使用。同时,利用赛门铁克Veritas Storage Foundation的虚拟化存储功能,还帮助管理人员实现了存储系统的高可用性和灾难恢复功能。

      “如果对我们的数据中心做一个总结,就是给系统强有力的安全保证,另外提高了生产效率,减少了每年的宕机时间。”刘喻表示,“还有就是应用级的 容灾,全部实现了自动化,原来我们的A区因为调试的原因经常停电,整个系统就会自动切换到灾备机房,这个过程对于医院业务系统的应用来说没有任何影响。”

      无锡市人民医院数据中心机房采用了服务器虚拟化、存储整合、SOA中间件、自动化等很多前瞻性技术,在国内医疗行业信息化建设中处于领先水平。

    认同新一代数据中心

      无锡市人民医院对信息化建设的大力投入也获得了很多成效:包括医务人员工作效率明显提高,医护人员陪护病人的时间增加,患者平均住院治疗时间减 少,纸张和耗材消耗成本大幅降低等。从整个流程上看,护士可以多拿出20%的时间给病人。与同规格医院相比,医院每个病区单元可以减少2~3名护士的人员 配备。

      对于“新一代数据中心”的概念,刘喻表示非常认同。他认为,未来的数据中心应该满足的条件首先是安全和可靠,其次就是智能化和自动化:“原来我 们的自动化程度就不高,我们信息中心的几个人甚至都不敢离开无锡市太远,周末的活动半径也不能超过半小时的路程。后来医疗服务全部电子化以后,对数据中心 可靠性的要求就更高了,医院对容灾指标的忍受程度是‘不超过一分钟’。”

      对于数据中心未来的发展趋势,刘喻也有自己的看法,他认为首先是园区级的容灾将会扩展到城域级容灾;其次是在硬件设备五年一换的时候,要确保进 行设备升级的同时不能停机,目前这方面虽然也可以实现,但感觉不是太好;再次,未来的数据中心会应用更多的新技术,对管理人员的要求更高,应该加强日常的 技术培训,这方面现在做得还不够。

    展开全文
  • 牢固树立和贯彻落实创新、协调、绿色、开放、共享的发展理念,推动经济社会持续健康发展,是我国社会进入新的发展阶段的重要任务。建设新型智慧城市必须认真贯彻新发展理念,搞好谋篇布局,抓好具体落实,开辟城市可...
  • ——H市卷烟厂烟草物流配送中心 摘 要 自我国正式加入世界贸易组织(WTO)以来,我国卷烟与外国卷烟之间对零售终端市场的竞争日益激烈,中国烟草目前正面临前所未有的挑战。因此提高我国烟草业的整体竞争力是当前...
  • 零信任大风已起,网络安全理念重塑,百亿市场空间有望开启 产业研究智库2020-09-24 08:56:36 1、 零信任是安全建设思路的转变 1.1、 零信任诞生的背景:IT 无边界化 在传统的安全体系下,内网用户默认享有较...
  • 草原文化的核心理念是“崇尚自然,践行开放,恪守信义”,它作为草原人民生生不息、发展壮大、开拓进取的精神力量,已经深深地融入到中华民族优秀传统文化之中,成为中华民族核心价值体系的重要组成部分.深刻理解草原文化...
  • 园博会是园林艺术展览的一种主要形式,近年来随着社会经济的发展,人民生活水平和城市建设水准的提高,...本文西安2011世界园艺博览会地区园设计切入点,探讨园博会地区园在传播生态文明的理念、方法、手段和成果。
  • 2020 年度“ DeFi 大狂欢”总结 比特币2020年终总结报告 『声明:本文作者独立观点,不代表白话区块链立场,本内容仅供广大加密爱好者科普学习和交流,不构成投资意见或建议,请理性看待,树立正确的理念,提高...
  • 我的软件开发理念和流程

    千次阅读 2017-03-14 15:48:24
     软件开发的指导理念总结三个方面:沟通、简单、灵活,三者相互作用不可分割。道可道非常道,阐释总是一种限定。“沟通、简单、灵活”三个概念需要在实际工作中不断体会和领悟。 1.1.沟通 (1)有效沟通是...
  • 节约资源、保护环境是我国的基本国策,关系经济社会可持续发展,关系广大人民群众切身利益。主校是我国节约能源法所规定的重点用能单位,高校在运营管理中,应遵行科学发展观,充分体现节能、节地、节水、节材、保护...
  • 本文摘自:mind report|观念报告|Vol:001  中文题目:《长尾:无处不在》 ...关键字:管理理念,网络规则   ² 第三次浪潮与产销合一(Prosumer),1980年  ² 赢家通吃的社会,1995年  ² 数字化生存,1
  • 全球销量逾百万册的系列图书 连续十余年打造的经典 直观、循序渐进的学习教程 掌握关键知识的**佳起点 Read Less, Do More (精读多练)的教学理念 示例引导读者完成常见的任务,基于UML2.0编写 本书将教会你: 读...
  • 全心全意为人民服务体现在我们软件设计上

    千次阅读 热门讨论 2014-06-10 09:02:23
    能给你带来财富的不是技术,而是设计理念
  • 考评系统学到的UI设计理念

    千次阅读 热门讨论 2015-08-30 11:38:44
    “胡同里赶猪”,转变设计思路,才能真正改变传统的设计理念
  • 作为.NET上连接编程语言和数据库、内存对象、XML等各种类型数据之间的桥梁,LINQ引入了一种处理数据的全新理念,将查询无缝集成至开发语言之上。本书部分介绍了LINQ技术及C#和VB为此提供的新语言特性,第二、三、四...
  • 畅谈游戏设计理念

    万次阅读 2009-12-16 12:37:00
    星际2首席设计师畅谈游戏设计理念星际争霸2首席设计师Dustin Browder DustinBrowder的游戏设计生涯始于15年前,那时他Activision公司设计制作《MechWarrior 2:Mercenaries》这一款游戏,然后他跳槽去了Westwood...
  • 新视野大学英语(第三版)第二册课后翻译

    万次阅读 多人点赞 2019-04-20 23:50:58
    翻译:人们普遍认为英语是一种世界语言,经常被许多不英语第一语言的国家使用。与其他语言一样,英语也发生了很大的变化。英语的历史可以分为三个主要阶段:古英语,中古英语和现代英语。英语起源于公元5世纪,...
  • 共识,权威以及去中心化的区块链

    万次阅读 2017-11-25 09:22:23
    1. 这张印有“中国人民银行”的百元钞票可以用来换一冰箱吃的,问题来了,商家凭什么会凭我一张纸就给我那么多东西? 2. 在陌生的地方需要帮助,到处都是陌生的人,此时来了一个穿制服的警察,什么人们会信任这位...
  • (一)人民日报:教育好自己的孩子,是你最重要的事业 1、老师不能保证你孩子良好的品行 一个人无论成绩好坏与否,品行是关键!道德可以弥补能力的缺陷,而能力却难以掩盖道德的缺陷。但是孩子的品行很大程度上...
  • 而且随着二胎政策放开,人民经济收入增多开始注重健康注重保养,越来越多年轻的宝妈将月子会所作为坐科学月子的首要选择。随着激烈的市场竞争环境,月子会所也越来越重视内部管理的规范化,以便更好的应对市场的挑战...
  • 以下全文内容: 中华人民共和国数据安全法 (2021年6月10日第十三届全国人民代表大会常务委员会第二十九次会议通过) 目录 第一章 总则 第二章 数据安全与发展 第三章 数据安全制度 第四章 数据安全保护义务 ...
  • 二、互联网思维的特点和理念  (一)何谓“互联网思维”  互联网思维是一个多元概念。一般认为,互联网思维指在(移动)互联网、大数据、云计算等科技不断发展的背景下,对市场、对用户、对产品、对企业...
  • 法律总是相对落后于现实发展,针对当前民间借贷案件数量保持高位运行、疑难复杂案件不断增加的态势,人民法院要及时创新金融司法理念,合理配置审判资源,既要保护正当的民间借贷,又要抑制其中的非法行为,要通过...
  • 中科大在50年代的教学理念

    千次阅读 2010-11-17 10:31:00
     得了解这个学校的教学理念,我从网上找到了一篇:     中国科学技术大学里的基础课 <br />中国科学技术大学力学和力学工程系系主任 钱学森 <br />中国科学技术大学是我国培养尖端...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,159
精华内容 7,263
关键字:

以人民为中心的理念