大数据入门教程

第1章Linux概述
1.1 Linux简介
1.1.1 Linux是什么
Linux是一套免费使用操作系统,是一个基于多用户、多任务、支持多线程和多CPU的操作系统。它支持32位和64位硬件,是一个性能稳定的多用户网络操作系统。Linux操作系统诞生于1991 年10 月5 日(这是第一次正式向外公布时间),是由芬兰人Linus Benedict Torvalds(李纳斯.托沃兹,如图1-1所示)创造的。Linux存在着许多不同的Linux发行版本,经典的发行版本有CentOS、Red Hat红帽子、Debian、Ubuntu等,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核。

1.1.2 Linux的特色

  1. 基本思想
    Linux的基本思想有两点:第一,一切都是文件。第二,每个软件都有确定的用途。其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。

  2. 完全免费
    Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变,这让Linux吸收了无数程序员的精华,不断壮大。

  3. 完全兼容
    这使得可以在Linux下通过相应的模拟器运行常见的DOS、Windows的程序。这为用户从Windows转到Linux奠定了基础。许多用户在考虑使用Linux时,就想到以前在Windows下常见的程序是否能正常运行,这一点就消除了他们的疑虑。

  4. 多用户、多任务
    Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。多任务则是现在电脑最主要的一个特点,Linux可以使多个程序同时并独立地运行。

  5. 良好的界面
    Linux同时具有字符界面和图形界面。在字符界面用户可以通过键盘输入相应的指令来进行操作。它同时也提供了类似Windows图形界面的X-Window系统,用户可以使用鼠标对其进行操作。在X-Window环境中就和在Windows中相似,可以说是一个Linux版的Windows。

  6. 支持多种平台
    Linux可以运行在多种硬件平台上,如具有x86、SPARC、Alpha等处理器的平台。此外Linux还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上。2001年1月份发布的Linux 2.4版内核已经能够完全支持Intel 64位芯片架构。同时Linux也支持多处理器技术。多个处理器同时工作,使系统性能大大提高。

1.1.3 linux发行版本介绍
Linux操作系统,也即是由Linux内核与各种常用软件的集合产品,全球大约有数百款的Linux系统版本,每个系统版本都有自己的特性和目标人群,所以绝不能一概而论谁是第一,谁是第二。

1.RHEL红帽
Red hat,应该称为Redhat系列,Redhat是国内使用人群最多的Linux版本,以至于有的人将Redhat等同于Linux,而有些老手更是只用这一个版本的Linux。所以有什么不明白的地方,很容易找到人来问,而且网上的Linux教程基本都是以Redhat为例来讲解。

2.CentOS
社区企业操作系统(Community Enterprise Operating System,Centos),来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用。两者的不同,在于CentOS并不包含封闭源代码软件。
CentOS 是RHEL源代码再编译的产物,而且在RHEL的基础上修正了不少已知的 Bug ,相对于其他 Linux 发行版,其稳定性值得信认。
Centos根据RHEL的源代码进行二次编译,并去掉RHEL相关的图标等具有商业版权的信息后形成与RHEL版本相对应的 CentOS发行版。虽然 CentOS是根据RHEL源代码编译而成的,但 CentoS与RHEL仍有许多不同之处:
RHEL中包含了红帽子自行开发的闭源软件(如红帽集群套件等),这些软件并未开放源代码,因此也就未包含在 CentoS发行版中。
CentoS发行版通常会修改RHEL中存在的一些bug,并提供了一个yum源以便用户
与RHEL提供商业技术支持不同, Centos并不提供任何形式的技术支持,用户遇到的问题需要自行解决,因此 CentOS对技术人员的要求更高。
RHEL与 CentOS还有许多不同之处,此处不一一列举,感兴趣的读者可以参考相关资料了解。值得注意的是2014年初, CentOS与 Red Hat同时宣布, CentoS将加入 Red Hat,共同打造 CentOS,业界普遍希望此举能让 CentOS操作系统更加强大。
虽然 CentOS的技术门槛更高,但其稳定、安全、高效等特点吸引了一大批经验丰富的IT管理人员加入,从近些年来的使用情况来看,其发展非常迅猛。许多IT企业都在使用CentOS,其中不乏像淘宝、网易等IT巨头。

3.Debian
应该称为Debian 系列,包括Debian和Ubuntu等。Debian是社区类Linux的典范,是迄今为止最遵循GNU规范的Linux系统。提供了接近十万种不同的开源软件支持,在国外用于很高的认可度和使用率。对于各类内核架构支持性良好,稳定性、安全性强更有免费的技术支持。

4.Ubuntu
Ubuntu是一款基于Debian派生的操作系统(严格来说不能算一个独立的发行版本),对新款硬件具有极强的兼容能力。 特点是界面非常友好,容易上手,对硬件支持非常全面,是最适合做桌面系统的Linux发行版本,同时Ubuntu也可用于服务器领域。
Ubuntu的目标在于为一般用户提供一个最新的,同时又相对稳定的主要自由软件构建而成的操作系统。Ubuntu具有强大的社区力量,用户可以方便地从社区获取帮助。

1.1.4 Linux的体系架构
Linux系统一般由以下几个主要部分组成:硬件(Computer Resources)、内核(Kernel)、Shell、文件系统(File System)和应用程序。内核,Shell和文件系统一起构成基本的操作系统结构,用户可以运行程序,管理文件和使用系统。层次结构如下图:

  1. Linux内核
    下面我们先大概介绍一下Linux内核(Kernel)。Linux内核是操作系统的核心,具有很多基本功能,它负责管理系统的进程,内存,设备驱动程序,文件和网络系统,决定系统的性能和稳定性。Linux内核由以下及部门组成:内存管理器,进程管理器,设备驱动程序,虚拟文件系统和网络管理等。
    内存管理器:内存管理器主要提供对内存资源的访问控制。Linux系统会在硬件物理内存和进程使用的内存之间建立一种映射关系。这种映射是以进程为单位,因而不同的进程可以使用相同的虚拟内存,而这些相同的虚拟内存,可以映射到不同的物理内存上。
    进程管理器:进程实际上是某特定应用程序的一个运行实体。在linux系统中,能够同时运行多个进程,linux通过在短时间间隔内轮流运行这些进程而实现"多任务"。其中短时间间隔成为"时间片",让进程轮流运行的方法称为"进程调度",完成调度的程序称为"调度程序"。进程调度主要提供对CPU的访问控制,在计算机中,CPU资源是有限的,而众多的应用程序都要使用CPU资源,因此需要"进程调度子系统"对CPU进行调度管理。进程管理的重点是创建和停止进程,并控制它们之间的通信。
    设备驱动程序:设备驱动程序是Linux内核的主要部门。设备驱动程序实际控制操作系统和硬件设备之间的交互,并且提供一组操作系统可以理解的抽象接口,完成和操作系统之间的交互,与硬件相关的具体操作细节也由设备驱动程序完成。
    虚拟文件系统:隐藏各种文件系统的具体细节,为文件操作提供统一的接口。
    网络管理:网络管理在Linux内核中主要负责管理各种网络设备,并实现各种网络协议栈,最终实现通过网络连接其他系统的功能。
  2. Linux Shell
    Shell的英文含义是“壳”。它是相对于Linux内核来说的,因为它是建立在内核的基础上,面向于用户的一种表现形式,比如我们看到一个球,见到的是它的壳,而非核。Linux中的Shell,是指一个面向用户的命令接口,表现形式就是一个可以由用户录入的界面,这个界面也可以反馈运行信息。
    这样,在Linux系统中,就出现了两种Shell表现形式,一种是在无图形界面下的终端运行环境下的Shell(ctrl+alt+f2,ctrl+alt+f1),另一种是桌面上运行的类似Windows 的MS-DOS运行窗口,前者我们一般习惯性地简称为终端,后者一般直接称为Shell。
    Shell有两种执行指令的方式,第一种方法是用户事先编写一个sh脚本文件,内含Shell脚本,而后使用Shell程序执行该脚本,这种方式,我们习惯称为Shell编程。第二种形式,则是用户直接在Shell界面上执行Shell命令,由于Shell界面的关系,大家都习惯一行行的书写,很少写出成套的程序来一起执行,所以也称命令行。
    总结一下,Shell可以说只是为用户与机器之间搭建成的一个桥梁,让我们能够通过Shell来对计算机进行操作和交互,从而达到让计算机为我们服务的目的。
  3. 文件系统
    在LINUX系统中有一个重要的概念:一切都是文件。 其实这是UNIX哲学的一个体现,而Linux是重写UNIX而来,所以这个概念也就传承了下来。在UNIX系统中,把一切资源都看作是文件,包括硬件设备。UNIX系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。反映在Linux的文件类型上就是:普通文件、目录文件(也就是文件夹)、设备文件、链接文件、管道文件、套接字文件(数据通信的接口)等等。而这些种类繁多的文件被Linux使用目录树进行管理,所谓的目录树就是以根目录(/)为主,向下呈现分支状的一种文件结构。

1.1.5 Linux的主要应用领域
由于Linux开放源代码,降低了对封闭源代码软件潜在安全性的忧虑,这使得Linux操作系统拥有广泛的应用领域。目前,Linux的应用领域主要包括以下几个方面。
1. 桌面应用领域
目前,Windows操作系统在桌面应用中一直占据绝对的优势,但是随着Linux操作系统在图形用户界面和桌面应用软件方面的发展,Linux在桌面应用方面也得到了显著的提高,越来越多的桌面用户转而使用Linux。事实也证明,Linux已经能够满足用户办公,娱乐和信息交流的基本需求。不过,Linux在桌面应用市场上的占有率不高。如今新版本的Linux系统特别在桌面应用方面进行了改进,达到了更高的水平,完全可以作为一种集办公应用,多媒体应用,网络应用等多方面功能于一体的图形界面操作系统。
2. 高端服务器领域
Linux在服务器领域扮演者领军者角色,这在很大程度上得益于它具有稳定性,安全性,开放源代码,总体拥有成本较低等优点。根据调查,Linux操作系统在服务器市场上占有率已经超过50%。由于Linux可以提供企业网络环境所需的各种网络服务,加上Linux服务器可以提供虚拟专用网络(VPN)或充当路由器与网关,因此在不同操作系统互相竞争的情况下,企业只需要掌握Linux技术并配合系统整合与网络等技术,便能够享有低成本,高可靠性的网络环境。
3. 嵌入式应用领域
在通常情况下,嵌入式及信息家电的操作系统支持所有的运算功能,但是需要根据实际应用对其内核进行定制和裁剪,以便为专用的硬件提供驱动程序,并在此基础上开发应用。目前,能够支持嵌入式的常见操作系统有Palm OS,嵌入式Linux,Android和Windows CE等。虽然Linux在嵌入式领域刚刚起步,但是Linux的特性正好符合产品的操作系统,稳定,实时和多任务等需求,而且Linux开放源代码,不必支付许可证费用。
4. 文件服务器系统
网络文件系统是由SUN公司制定的一种文件服务标准,它能实现基于Linux/UNIX的网络文件共享服务。应用Linux的NFS服务,可以很好地解决企业的Linux/unix环境文件共享问题。
Linux提供了安全高效的Windows文件服务器系统-Samba,可以将Windows和Linux有效的整合到一起。Samba基于SMB协议,可提供不同计算机之间的打印共享,文件共享,域管理等服务。
5. 企业门户网站
所谓企业门户网站,就是为企业提供全面信息咨询和服务的行业性网站。在Linux下组建企业的门户网站,可以选择的方案很多,如著名的LAMP方案(Linux+Apache+MySQL+PHP/Python/Perl),LAMP网站架构是目前国际流行的WEB框架,其组成产品均是开源软件,是国际上成熟的架构框架,很多流行的商业应用都是采用此架构,与JAVA架构相比,LAMP具有web资源丰富,轻量,快速开发等特点。
6. 数据备份
对于企业来说,数据就是它的财产,因此数据备份的重要性不言而喻。
Linux是非常安全的操作系统。在Linux最新版本中,广泛采用日志文件系统, 如EXT3。它可以有效降低服务器在突然断电,死机等情况下,对数据可能造成的损失。
在Linux下,还有许多高效率的数据备份工作。如tar,cpio还原备份和dump转储。同时,Linux还有大量的第三方软件包(包括自有软件和商业软件)可以提供数据备份的功能。
1.2 虚拟机的安装
学习Linux,最先需要学习如何安装Linux。我们可以先在Windows上安装虚拟机软件,虚拟机可以看做一台虚拟的电脑,然后再在虚拟机上安装Linux。VMware是最常见的虚拟机软件。
1.2.1 VMware介绍
VMware Workstation 是一个虚拟PC的软件,利用VMware工作站,可以在现有的操作系统上虚拟出一个或多个新的硬件环境,相当于模拟出多台新的PC,以此来实现在一台机器上同时运行多个独立的操作系统。
VMware Workstation 是一种虚拟机管理软件,安装该软件后,可以创建多个虚拟机(即虚拟PC),然后在虚拟机上安装操作系统即可,每台虚拟机本身就像一台真正地电脑一样。

1.2.2 VMware 的主要特点:
(1)可以在同一台机器上同时运行多个操作系统。
(2)本机系统可以与虚拟机系统进行网络通信。
(3)可以随时修改虚拟机系统的硬件环境。

1.2.3 VM安装的详细步骤

  1. 双击虚拟机安装软件VMware-workstation-full-12.0.0-2985596.exe。

显示Vmware Workstation PRO程序安装界面。

点击下一步

勾选“我接受许可协议中的条款”,点击下一步

更改安装路径,并点击下一步。比如:安装在F盘下的VMware workstation目录下。

点击下一步

点击下一步,选择您要放入系统的快捷方式。

点击安装按钮,显示VMware Workstation Pro安装向导。

最后点击完成按钮。

如果有许可证密钥,单击许可证按钮就可以打开许可证密钥输入窗体,用于输入密钥。
1.3 Centos 6.5安装
本书将在Windows环境下使用VMware Workstation12虚拟机下安装Centos6.5。

  1. 双击VMware Workstation Pro,打开VMware

2点击“文件”菜单中的“新建虚拟机”子菜单

点击下一步,初学者使用“典型配置”。

  1. 点击浏览,选择CentOS6.5的ISO镜像文件

  2. 选择镜像文件

  3. 打开虚拟机向导

  4. 填写用户信息

注意:写上全名,用户名,密码 (用户名是用来登录Linux系统的,配合密码可以完成登录。全名只是对用户名的一个备注说明。创建的用户账户和根账户root均使用此密码)。

  1. 设置虚拟机名称和安装位置

8 设置虚拟机磁盘容量
磁盘容量默认即可 20G已够用

9安装完成

10 启动虚拟机
虚拟机已开始启动

等待几分钟

启动完成

1.4 习题

  1. Linux常见的发型版本有哪些(至少回答5个)?
    2.简述Linux的系统特点。
  2. Linux系统一般由哪4个部分组成?
    4.简述Linux内核的组成。
    5.自行安装VMware和Centos。

第2章Linux基本操作
2.1 系统登录
Linux是一个多用户的操作系统,用户要使用该系统,首先必须登录系统。用户登录系统时,为了使系统能够识别自己,必须输入用户名和密码,经系统验证无误后方能进入系统。在系统安装过程中可以创建两种帐号:
root–超级用户帐号,使用这个帐号可以在系统中做任何事情。
普通用户–这个帐号供普通用户使用,可以进行有限的操作。
一般的Linux使用者均为普通用户,而系统管理员一般使用超级用户帐号完成一些系统管理的工作。如果只需要完成一些由普通帐号就能完成的任务,建议不要使用超级用户帐号,以免无意中破坏系统。
用户登录分两步进行:
第一步,输入用户的登录名,系统根据该登录名来识别用户;
第二步,输入用户的口令,该口令是用户自己选择的一个字符串,对其他用户是保密的,是在登录时系统用来辨别真假用户的关键字。
在Linux系统中,系统管理员在为用户建立新帐号时赋给用户一个用户名和一个初始的口令。另外,Linux系统给计算机赋予一个主机名。主机名用于在网络上识别独立的计算机(即使用户的计算机没有联网,也应该有一个主 机名)。Linux系统给出的缺省主机名为localhost。在下面的例子中,我们假设用户名为"wah",系统的主机名为"localhost"。
1 超级用户登录
超级用户的用户名为root,密码在安装系统时已设定。系统启动成功后,点击Other…(Other…的意思就是换别的用户登录),屏幕显示下面的提示:

这时输入超级用户名"root",然后键入回车键。此时,用户会在屏幕上看到输入口令的提示:

这时,需要输入口令。输入口令时,口令不会在屏幕上显示出来。如果用户输入了错误的口令,就会在屏幕上看到下列信息:

这时需要重新输入。当用户正确地输入用户名和口令后,就能合法地进入系统。屏幕显示:

此时说明该用户已经登录到系统中,可以进行操作了,右上角是用户名全名。
2 普通用户登录
普通用户登录建立了普通用户帐号以后,就可以进行登录了。
在登录时,用户会在屏幕上看到类似下面的提示:

这时依旧点击Other…,并在username中输入用户名"jiangtao",然后键入回车键。此时,需要输入口令。如果用户输入了错误的口令,就会在屏幕上看到下列信息:

这时需要重新输入。当用户正确地输入用户名和口令后,就能合法地进入系统。

此时说明该用户已经登录到系统中,可以进行操作了。

2.1.1虚拟机终端
虚拟机终端又称为控制台。Linux是一个真正的多用户操作系统,这表示它可以同时接受多个用户登录。Linux还允许一个用户进行多次登录,这是因为Linux提供了虚拟机控制台的访问方式,允许用户在同一时间从控制台(系统的控制台是与系统直接相连的监视器和键盘)进行多次登录。
虚拟机控制台可使用户同时在多个控制台上工作,例如,开发软件时,可以在一个控制台上进行编辑,在另一个控制台上进行编译,在第三个控制台上查阅信息。
打开虚拟机控制台可以在屏幕空白处,鼠标右击,会显示下图。

点击open in Terminal,会显示如下图,表示已经进入控制台。

另外一种在图形模式下进入终端模式可以使用ctrl+alt+F2,显示如下界面。

按ctrl+alt+F7退出终端模式,显示图形界面。
2.1.2 Linux系统目录结构
双击Conmputer,如下图显示

此时双击Filesystem(文件系统),打开系统目录结构图,如下图显示。

2.1.3 系统目录结构说明
目录名称 目录说明
/ 根目录,位于Linux文件系统目录结构的顶层,一般根目录下只存放目录,不要存放文件,/bin,/boot,/etc、/dev、/lib、/sbin等等都是放置在根目录下。
/bin 该目录为命令文件目录,也称为二进制目录。包含了供系统管理员及普通用户使用的重要的linux命令和二进制(可执行)文件,包含命令解释器。
/boot 引导目录,主要放置开机时会使用到的文件。该目录中存放系统的内核文件和引导装载程序文件。
/dev dev是设备(device)的英文缩写。/dev这个目录对所有的用户都十分重要。因为在这个目录中包含了所有Linux系统中使用的外部设备。但是这里并不是放的外部设备的驱动程序,这一点和windows,dos操作系统不一样。它实际上是一个访问这些外部设备的端口。我们可以非常方便地去访问这些外部设备,和访问一个文件,一个目录没有任何区别。
/etc 系统配置文件存放的目录,该目录存放系统的大部分配置文件和子目录,不建议在此目录下存放可执行文件,修改配置文件之前记得备份。该目录下的文件由系统管理员来使用,普通用户对大部分文件有只读权限。
/home 系统默认的用户主目录,除了root外的用户主目录都存放在此目录下,方便用户存放私有数据。在Linux下,可以使用#cd ~切换至自己的主目录。
/lib lib是library的缩写。系统使用的函数库的目录。程序在执行过程中,需要调用一些额外的功能时需要函数库的协助,该目录下存放了各种编程语言库。典型的linux系统包含了C、C++和FORTRAN语言的库文件。其他的库文件则大部分存放在/usr/lib,/usr/local/lib目录下。
/lost+found 在linux文件系统中,当系统意外崩溃或机器意外关机,产生的一些文件碎片放在这里。在系统启动的过程中,系统工具会检查这里,并修复已经损坏的文件系统。有时系统发生问题,有很多的文件被移到这个目录中,可能会用手工的方法来修复,或者移动文件到运来的位置上。
/mnt mnt目录一般用于存放挂载存储设备的挂载目录,它是安装软盘、光盘、U盘的挂载点(挂载点实际上就是Linux中磁盘文件系统的入口目录,类似于Windows中不同分区的C、D、E盘符)。
/opt 主要存放那些可选的程序。你想尝试最新的firefox测试版吗?那就装到/opt目录下吧,这样当你尝试完想删掉firefox的时候,你就可以直接删除它,而不影响系统其他任何设置。安装到/opt目录下的程序,它所有的数据、库文件等等都是放在这个目录下面。
/usr 该目录是系统存放程序的目录,其空间比较大。例如/usr/src中存放Linux内核的源码,/usr/bin中存放几乎所有的可执行文件.有些程序在/bin 或/usr/local/bin 中。/usr/sbin中存放系统管理程序。
/proc 它是存放在内存中的一个虚拟的文件夹,是启动Linux系统时创建的,里面的文件都是当前系统的实时状态信息,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间。
/root 系统管理员root的主目录。
/sbin 放置系统管理员使用的可执行命令,如shutdown(关机命令)等。与/bin不同的是,这个目录是给系统管理员root使用的命令,一般用户只能"查看"而不能设置和使用。
/tmp 一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。/var/tmp目录和这个目录类似。
/srv 服务启动之后需要访问的数据目录,如www服务需要访问的网页数据存放在/srv/www内。
/var 放置系统执行过程中产生的文件,这个目录的内容经常变动。如随时更改的日志文件 /var/log。

2.2 Linux系统配置
1.配置文件
Linux系统中存在一些配置文件,这些配置文件在系统引导时被调用,用来构建系统工作的基础环境。下面的表格是系统引导时需要读取的部分配置文件。
配置文件 描述
/boot/grub/menu.lst 存储计算机上可用的操作系统信息,由Bootloader读取并引导操作系统
/etc/inittab 设定Linux的运行级别
/etc/profile 适用于所有用户的全局配置文件。当第一次登录系统时,该文件被读取
/etc/bashrc 适用于所有用户的全局配置文件。当bash被打开时,该文件被读取(Linux上的Shell种类很多。Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。)
~/.bash_profile 用户用于自定义信息的配置文件,可扩展或重写/etc/profile中的配置
[slave1@localhost ~]$ ls -al | grep .bash
~/.bashrc 用户用于自定义信息的配置文件,可扩展或重写/etc/bashrc中的配置

以上配置文件可能会因为 Linux发行版本的不同。其实Linux引导时需要读取的配置文件远不止上表中列出这些,这里仅选取其中数要的几个来解释配置文件的作用。我们按下电源到 Linux准备好为用户工作这一段时间,系统发生了以下一系列事情。

  1. 当按下电源时,启动BlOS(Basic Input Output System),BIOS检测计算机各硬件
  2. 检测完成后,执行一个叫作Bootloader的程序,该程序读取了包括/boot/grubmenu.lst在内的各种配置文件,用来加载 Linux内核。
  3. Linux内核加载完成后,第一个运行的进程是/sbin/init,我们将它称为1号进程。1号进程读取了etc/inittab中的内容,确定系统运行级别。下表为大多数 Linux的运行级别。通常 Linux的运行级别为3或5,其他运行级别是管理员有特定维护需要时使用的。
  4. 为了完成系统的启动,1号进程创建了许多子进程。最后执行/bin/login程序等待用户登录。用户登录后,首先读取/etc/profile和/etc/bashrc文件,建立一个所有用户共享的初始环境;然后读取用户目录下/.bash_profile和/.bashrc文件,用于建立用户自定义的个人环境。
    Linux的运行级别
    运行级别 说明
    0 关机
    1 单用户的命令行模式
    2 无网络的多用户命令行模式
    3 有网络的多用户命令行模式
    4 未使用的级别
    5 有网络的多用户GUI模式
    6 重新启动
    2.Linux网络配置(Hadoop里再讲)
    网络连接是操作系统配置中十分重要的一环。如何设置网络呢?使用“系统(System)”菜单下“首选项(Preferences)”下“网络连接(Network Connections)”菜单。打开网络连接窗口,如下图。选中System eth0,单击“编辑”按钮。

配置好IP信息后,使用service network restart命令重启网络服务。然后使用ifconfig命令查看网络配置情况。
[root@localhost 桌面]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:4F:E4:76
inet addr:192.168.86.141 Bcast:192.168.86.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe4f:e476/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:158 errors:0 dropped:0 overruns:0 frame:0
TX packets:140 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:19191 (18.7 KiB) TX bytes:12895 (12.5 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:16 errors:0 dropped:0 overruns:0 frame:0
TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1152 (1.1 KiB) TX bytes:1152 (1.1 KiB)
eth0和lo是以太网卡和本地网卡。然后测试网络是否正常,使用ping命令。
[root@localhost 桌面]# ping www.baidu.com
PING www.a.shifen.com (61.135.169.125) 56(84) bytes of data.
64 bytes from 61.135.169.125: icmp_seq=1 ttl=128 time=26.3 ms
64 bytes from 61.135.169.125: icmp_seq=2 ttl=128 time=23.8 ms
64 bytes from 61.135.169.125: icmp_seq=3 ttl=128 time=24.3 ms
3. 防火墙
防火墙(Firewall),也称防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网(US5606668(A)1993-12-15)。防火墙是位于内部网和外部网之间的屏障,它按照系统管理员预先定义好的规则来控制数据包的进出。防火墙是系统的第一道防线,其作用是防止非法用户的进入。
查看防火墙关闭状态
[root@hadoop Desktop]# service iptables status
关闭Linux的防火墙,执行命令:
[root@hadoop Desktop]# service iptables stop
如果需要永久关闭防火墙,执行命令:
[root@hadoop Desktop]# chkconfig iptables off
注意:
从CentOS7开始,默认不安装iptables,使用一个新组件firewalld。
上面的命令必须使用root用户,否则无法显示。
4.系统日志
Linux系统运行和运行在Linux上的应用程序都会产生日志。日志在排查文件的时候至关重要,在Linux上一般跟系统相关的日志默认都会放到/var/log下面。
1、/var/log/boot.log
一般包含系统启动时的日志,包括自启动的服务。
2、/var/log/btmp
记录所有失败登录信息。非文本文件,可以使用last -f /var/log/btmp进行查看。
3、/var/log/cron
cron计划任务的日志,每当cron任务(cron是一个Linux下的定时执行工具,无需人工干预)被执行的时候都会在这个文件里面记录。
4、/var/log/dmesg
包含内核缓冲信息(kernel ring buffer)。在系统启动时,会在屏幕上显示许多与硬件有关的信息。可以直接查看这个文件或者使用dmesg这个命令查看。
5、/var/log/lastlog
记录所有用户的最近信息。非文本文件,可以使用lastlog进行查看。
6、/var/log/maillog
包含来着系统运行电子邮件服务器的日志信息。
7、/var/log/message
包括整体系统信息,其中也包含系统启动期间的日志。此外,mail,cron,daemon,kern和auth等内容也记录在var/log/messages日志中。
8、/var/log/secure
包含验证和授权方面信息。例如,sshd会将所有信息记录(其中包括失败登录)在这里。
下面我们使用grep命令。grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
语法:
grep [选项] ”模式“ [文件]
[root@localhost log]# grep “java” /var/log/yum.log
Apr 21 22:56:57 localhost java: gkr-pam: couldn’t update the ‘login’ keyring password: no old password was entered
Apr 21 23:45:39 localhost java: gkr-pam: couldn’t update the ‘login’ keyring password: no old password was entered
Apr 22 02:20:37 localhost java: pam_unix(login:session): session opened for user root by LOGIN(uid=0)
Apr 22 02:20:38 localhost java: ROOT LOGIN ON tty2
Apr 22 02:20:40 localhost java: pam_unix(login:session): session closed for user root
2.3 常用命令
打开虚拟机控制台,如图所示。

在虚拟机控制台可以看到如下字符。
[slave1@bogon Desktop]$
slave1代表当前用户名,bogon代表主机名,Desktop代表当前工作目录,KaTeX parse error: Expected 'EOF', got '#' at position 25: …注意:root用户命令提示符为#̲,普通用户命令提示符为)。
我们可以尝试date命令,可以显示当前日期时间。

cd命令可以切换工作目录,~目录是当前用户目录,cd ~命令表示切换工作目录到当前用户目录。

在#符后面去输入命令,有的时候命令后面还会跟着“选项”(英文options)或“参数”(英文arguments)。即Linux中命令格式为:
command [选项] [参数]
中括号代表是可选的,即有些命令不需要选项也不需要参数,但有的命令在运行时需要多个选项或参数。
1.选项
选项是调整命令执行行为的开关,即,选项不同决定了命令的显示结果不同,选项可以分为短选项和长选项。 
短选项(-):只能修饰一个字符的选项。
比如: ls -a,当然多个短选项可以合并,比如tar -cvf
短选项使用一个字母表示,但如果能更清楚的表达含义,可以使用一个单词来表达选项。如ls命令都有size选项,表示显示文件的大小。如果写成-size的话,会被误解为-s、-i、-z、-e4个选项。所以这时使用长选项。另外,许多命令的选项都提供长短两种选项,如
长选项(–):可以修饰单个字符,也可以修饰一个单词。
[root@localhost home]# ls -s;ls --size
总用量 12
4 master 4 myuser1 4 zhangjie
总用量 12
4 master 4 myuser1 4 zhangjie
比如:chkconfig --list
2.参数
参数是指定命令的作用对象或者为命令提供数据。
输出结果是/home目录下的所有目录和文件。
[root@localhost home]# ls -al /home
总用量 20
drwxr-xr-x. 5 root root 4096 4月 21 23:45 .
dr-xr-xr-x. 22 root root 4096 4月 22 17:20 …
drwx------. 25 master master 4096 4月 22 00:36 master
drwx------. 4 myuser1 user 4096 4月 21 22:41 myuser1
drwx------. 4 zhangjie zhangjie 4096 4月 21 23:45 zhangjie
和选项一样,命令的参数可以有多个。例如cat命令同时输出多个文件。
[root@localhost usr]# cat /usr/a.txt /usr/b.txt
hello a
hello b
3.获取帮助
Linux命令的选项和参数的使用很灵活,可以使用0个或多个选项和参数。另外,某些命令没有任何参数,如clear命令(清除屏幕)。有些命令必须有固定个数的参数,如mv命令(为文件或目录改名、或将文件或目录移入其它位置)必须有两个参数。Linux命令有数千个命令,我们在学习Linux时没有必要记住每个命令的使用,可以查找Baidu或相关帮助手册。man命令可以查询某个命令的帮助信息。
语法 man [选项] 命令名
[root@localhost usr]# man ls
LS(1) User Commands LS(1)
NAME
ls - list directory contents
SYNOPSIS
ls [OPTION]… [FILE]…
DESCRIPTION
List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuvSUX nor --sort.
Mandatory arguments to long options are mandatory for short options too.
-a, --all
do not ignore entries starting with .
-A, --almost-all
do not list implied . and …
–author
with -l, print the author of each file
其中NAME介绍命令的基本功能,SYNOPSIS介绍命令的格式。ls [OPTION]… [FILE]…,介绍了选项和参数的使用方法。[]里的内容表示可选的,…表示前面的内容可以使用多次。DESCRIPTION是各选项的介绍。
下面我们使用man mv命令
SYNOPSIS
mv [OPTION]… [-T] SOURCE DEST
mv [OPTION]… SOURCE… DIRECTORY
mv [OPTION]… -t DIRECTORY SOURCE…
mv的参数没有[],说明mv命令至少需要2个参数。第三个写法中-t也没有[],说明必须要有。第三个写法中,第一个参数表示目录,第二个参数是源文件。
4.常用技巧

  1. Tab键自动补全
    如/usr目录下有a.txt和b.txt两个文件,当输入下面的代码时,按Tab时会自动补全完整的文件名。
    [root@localhost usr]# cat a
    自动补全除了可以补全文件名和路径之外。也可以补全变量、命令名、主机名。如下代码,会自动补全成history。
    [root@localhost usr]# his
  2. history
    按向上箭头和向下箭头会出现上一条命令和下一条命令,这些是命令的历史。另外,输入history命令会显示最近录入的命令。
  1. 关机命令
    语法 shutdown -h now
    [user@bogon ~]$ shutdown -h now
    其中h是选项表示时间,now 表示立刻,这个命令即立刻关机的意思。

  2. 重启命令
    语法 reboot
    [user@bogon ~]$ reboot

  3. 退出命令
    语法 exit
    [user@bogon ~]$ exit

  4. 修改密码
    语法 passwd
    为了更好的保护用户帐号的安全,Linux允许用户随时修改自己的口令,修改口令的命令是passwd
    [user@bogon ~]$ passwd
    敲下回车,会提示你输入新的密码。
    此时,输入新的密码(友情提示:新密码输入后是看不到的,输入完新密码直接敲回车即可)。然后,会提示您再次输入新的密码。此时再次输入新的密码(两次输入的密码一定要相同,否则修改失败),并敲下回车,可以看到如图所示提示,密码已经修改成功。
    操作流程如图:

  5. 切换目录
    语法 cd 目录名
    cd命令用来切换工作目录, 工作目录可为绝对路径或相对路径。
    例如:切换到/usr/src目录
    [user@bogon ~]$ cd /usr/src
    当前目录是/usr/src,切换到/usr目录
    [user@bogon src]$ cd …
    切换到当前用户的home目录
    [user@bogon usr]cd ~

  6. 显示目录列表
    ls(list)命令是用户最常见的命令之一。对于目录,ls命令将输出该目录下的所有子目录和文件。对于文件,ls命令将输出其文件名以及要求的其他信息。该命令类似于dos下的dir命令。默认情况下,输出条目按字母顺序排序。
    语法: ls [选项]
    常用的选项有
    选项 说明
    -a 显示所有文件及子目录,包括隐藏文件。
    -C 多列显示输出结果。这是默认选项
    -l 以长格式显示目录下的内容列表。输出的信息从左到右依次包括文件名,文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等。

在控制台上输入命令 ls –a ,如图所示
此时敲下回车,会展示出来当前etc目录下的所有目录及文件,如图所示

ls 输出的文件,不同颜色代表不同的类型。
例如
黑色:表示普通文件,例如filesystems,fstab。
蓝色:表示目录,例如fonts,foomatic。
绿色:表示可执行文件。
浅蓝色:链接文件
黄色:设备文件
如用长格式显示/usr/lib目录下所有的文件,包括隐藏文件,如下所示:
[user@bogon ~]$ ls -al /usr/lib

7 新建目录
语法 : mkdir 目录名称
当前目录是/tmp目录,创建dzqc目录,再显示目录信息
[user@bogon tmp]$ mkdir dzqc
[user@bogon tmp]$ ls -a
在用户目录下创建p1目录和p1目录下的p2目录,也就是连续创建两个目录。
-p这个参数很实用。输入mkdir /tmp/test/hello命令并运行,系统提示错误,无法创建。
加上-p参数的命令,系统将不再报错。
[user@bogon ~]$ mkdir –p /mkdir/p1/p2
8. 删除一个文件或目录
在Linux系统中,可以使用rm命令将无用文件删除。该命令的功能是删除一个目录中的一个或者多个文件,也可以将某个目录及其下的所有文件及子目录均删除。
语法 rm [选项] 文件名/目录名
常用的选项
选项 说明
-i 删除前逐一询问确认
-f 强制删除,忽略不存在的文件,从不给出提示。
-r 递归的删除目录下面文件以及子目录下文件。
例如,在/usr/tmp目录下创建demo1目录,再删除demo1目录和hello.txt文件。最后使用ls显示。
[user@bogon Desktop]$ cd /usr/tmp
[user@bogon tmp]$ ls
hello.txt
[user@bogon tmp]$ mkdir demo1
[user@bogon tmp]$ ls -a
. … demo1 hello.txt
[user@bogon tmp]$ rm -rf demo1
[user@bogon tmp]$ rm -rf hello.txt
rm: remove regular file ‘hello.txt’?y
[user@bogon tmp]$ ls -a
. …

2.3 习题

  1. 在linux系统中,什么是超级用户,什么是普通用户以及他们他们之间的区别。
  2. 打开linux系统,详细说出各个目录结构具体含义。
  3. linux命令由哪及部门组成?使用一个具体的命令介绍各部分的含义。
  4. 登录root用户,并修改其登录密码。

第3章 Linux 用户管理
3.1 理解Linux的单用户多任务,多用户多任务概念
用户使用Linux时,需要以一个用户的身份进入,一个进程也需要以一个用户的身份运行,系统使用用户的概念来限制使用者或进程可以使用哪些资源。Linux 是一个多用户、多任务的操作系统,我们应该了解单用户多任务和多用户多任务的概念。

  1. Linux 的单用户多任务
    单用户多任务:比如我们以tom登录系统,进入系统后,我要使用gedit打开一个文档,但在写文档的过程中,我感觉少点音乐,所以又打开xmms 来点音乐,当然听点音乐还不行,MSN 还得打开,想知道几个弟兄现在正在做什么。这样一样,我在用tom 用户登录时,执行了gedit 、xmms以及msn等,当然还有输入法fcitx ,这样说来就有点简单了,一个tom用户,为了完成工作,执行了几个任务。当然tom这个用户同时可以做多项任务,这就是Linux的单用户多任务。
  2. Linux 的多用户、多任务
    有时可能是很多用户同时用同一个系统,但并不所有的用户都一定都要做同一件事,所以这就有多用户多任务之说;举个例子,比如Github.com 服务器,使用的就是Linux操作系统。我们可以通过远程访问Linux操作系统,使用这个服务器的有系统管理员、web 用户、常规普通用户等。在同一时刻,可能有的弟兄正在访问论坛;有的可能在上传软件包管理子站,比如tom 或mike 兄在管理他们的主页系统;在与此同时,可能还会有系统管理员在维护系统;浏览主页的用的是nobody 用户,大家都用同一个操作系统。管理员的对系统的维护或查看,可能用的是普通帐号或超级权限root帐号。不同用户所具有的权限也不同,要完成不同的任务得需要不同的用户,也可以说不同的用户,可能完成的工作也不一样。上面的情形就是Linux的多用户、多任务。
  3. linux 多用户操作系统安全性
    多用户操作系统的安全,多用户系统从事实来说对系统管理更为方便。从安全角度来说,多用户管理的系统更为安全,比如tom用户下的某个文件不想让其它用户看到,只是设置一下文件的权限,只有tom一个用户可读可写可编辑就行了,这样一来只有tom一个用户可以对其私有文件进行操作,Linux 在多用户下表现最佳,Linux能很好的保护每个用户的安全,但我们也得学会Linux 才是,再安全的系统,如果没有安全意识的管理员或管理技术,这样的系统也不是安全的。
    从服务器角度来说,多用户的下的系统安全性也是最为重要的,我们常用的Windows 操作系统,它的系统安全性根本没有没有办法和Linux或Unix 类系统相比。所以大量的服务器使用的操作系统就是Linux操作系统。

3.2 用户(user)和用户组(group)概念
用户使用Linux时,需要以一个用户的身份进入,一个进程也需要以一个用户的身份运行,系统使用用户的概念来限制使用者或进程可以使用哪些资源。用户组用来方便组织管理用户。实现用户账号的管理,要完成的工作主要有如下几个方面:用户账号的添加、删除与修改;用户口令的管理;用户组的管理。
3.2.1 用户(user)的概念
通过前面对Linux 多用户的理解,我们明白Linux 是真正意义上的多用户操作系统,所以我们能在Linux系统中建若干用户(user)。比如我们的同事想用我的计算机,但我不想让他用我的用户名登录,因为我的用户名下有不想让别人看到的资料和信息(也就是隐私内容)这时我就可以给他建一个新的用户名,让他用我所开的用户名去折腾,这从计算机安全角度来说是符合操作规则的。
当然用户(user)的概念理解还不仅仅于此,在Linux系统中还有一些用户是用来完成特定任务的,比如nobody和mysql 等,我们访问LinuxSir.Org 的网页程序,就是nobody用户。我们匿名访问mysql时,会用到用户mysql或nobody 。如果您想了解Linux系统的一些帐号,请查看 /etc/passwd 。
[root@localhost ~]# cat /etc/passwd
每个用户都有一个唯一的用户名和口令,同时系统会为每个用户分配一个用户ID(uid)来标识用户。用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。
根据用户ID的不同,在Linux系统中,用户可分为3种类型。
1.root用户:又称为超级用户,id为0,拥有最高权限。
2.系统用户:有称为虚拟用户、伪用户或假用户,不具备登录Linux系统的能力,但却是系统运行不可缺少的用户,一般id为1499。Centos7为1999。
3.普通用户:id在500以上,Centos7为1000以上。可以登录Linux系统,但是使用的权限有限,由管理员创建。
在终端输入id可以查看用户ID的相关信息。如当前用户是jiangtao,uid是用户ID,gid是用户所在组的标识符。
[jiangtao@bogon Desktop]$ id
uid=500(jiangtao) gid=500(jiangtao) groups=500(jiangtao) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
3.2.2 用户组(group)的概念
用户组(group)就是具有相同特征的用户(user)的集合体。比如有时我们要让多个用户具有相同的权限,比如查看、修改某一文件或执行某个命令,这时我们需要用户组,我们把用户都定义到同一用户组,我们通过修改文件或目录的权限,让用户组具有一定的操作权限,这样用户组下的用户对该文件或目录都具有相同的权限,这是我们通过定义组和修改文件的权限来实现的。
举例:我们为了让一些用户有权限查看某一文档,比如是一个时间表,而编写时间表的人要具有读写执行的权限,我们想让一些用户知道这个时间表的内容,而不让他们修改,所以我们可以把这些用户都划到一个组,然后来修改这个文件的权限,让用户组可读,这样用户组下面的每个用户都是可读的。

3.2.3 用户和用户的关系
用户和用户组的对应关系是:一对一、多对一、一对多或多对多。
一对一:某个用户可以是某个组的唯一成员。
多对一:多个用户可以是某个唯一的组的成员,不归属其它用户组;比如beinan和linuxsir两个用户只归属于beinan用户组。
一对多:某个用户可以是多个用户组的成员;比如beinan可以是root组成员,也可以是linuxsir用户组成员,还可以是adm用户组成员。
多对多:多个用户对应多个用户组,并且几个用户可以是归属相同的组,其实多对多的关系是前面三条的扩展,理解了上面的三条,这条也能理解。

3.3 linux用户管理
用户管理的常用命令包括:useradd、passwd、usermod、userdel、cat。useradd用来添加用户,passwd修改用户口令,usermod修改用户信息,userdel删除用户。Linux系统中只有root用户才有用户管理权限,所以要进行添加、删除、修改用户信息的操作,需要首先切换到root用户。
显示当前用户的命令是whoami
[root@localhost usr]# whoami
root
3.3.1 查看当前系统所有用户
语法 : cat /etc/passwd
[jiangtao@bogon Desktop]$ cat /etc/passwd
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
ftp❌14:50:FTP User:/var/ftp:/sbin/nologin
jiangtao❌500:500:姜涛:/home/jiangtao:/bin/bash
zhaoyun❌502:0:赵云:/home/zhaoyun:/bin/bash
xinkong❌503:503:星空:/home/xinkong:/bin/bash
其中cat 的命令含义是查看。cat 目录/文件,即查看文件中的内容,显示的文件内容从左至右分别表示。
用户名,密码,用户id,用户组id,备注,用户主目录,Shell命令所在目录(第七章讲) 。
3.3.2 添加新的用户
添加用户就是在系统中创建一个新账号,并为新账号分配用户ID、用户组、主目录、登录Shell等资源。
语法 useradd [选项] 用户名
其中各选项含义如下:
选项 说明
-c 指定一段注释性描述。
-d 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
-g 指定用户所属的用户组。
-G 指定用户所属的附加组。
-s 指定用户的登录Shell。
-u 指定用户的uid,如果同时有-o选项,则可以重复使用其他用户的标识号。
举例如图,在控制台敲出以下命令, 创建用户sunlei,并且分配到root用户组中。
[user@bogon Deskop]$su root // 切换到root
Password: // 输入密码
[root@bogon Desktop]# useradd sunlei –g root //指定用户组
[root@bogon Desktop]# cat /etc/passwd
xinke❌503:503::/home/xinke:/bin/bash
sunlei❌504:0::/home/sunlei:/bin/bash
在useradd命令后添加-d参数指定主目录。
[root@localhost /]# useradd -d /usr/zhangsan zhangsan
[root@localhost /]# cat /etc/passwd
sunlei❌501:0::/home/sunlei:/bin/bash
zhangsan❌502:502::/usr/zhangsan:/bin/bash
添加user用户组,-g和-G参数指定用户所在组和附加组。下面myuser1用户属于user用户组,同时也属于root组,主组为user。503是主组的组ID。
[root@localhost /]# groupadd user
[root@localhost /]# useradd -g user -G root myuser1
[root@localhost /]# cat /etc/passwd
myuser1❌503:503::/home/myuser1:/bin/bash
3.3.3 修改用户
修改用户就是更改用户的属性,如用户ID、主目录、用户所在组、登录Shell等。
语法: usermod [选项] 用户名
选项 说明
-c 指定一段注释性描述。
-d 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
-g 指定用户所属的用户组。
-G 指定用户所属的附加组。
-s 指定用户的登录Shell。
-u 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
-l 修改用户登录名称

如下修改lisi的登录名为wangwu,并查看是否修改成功。-l选项表示修改登录名称,选项后先跟的是新的用户名,再是旧的用户名。
[root@localhost /]# cat /etc/passwd | grep zhangsan // 查看用户名
zhangsan❌502:502::/usr/zhangsan:/bin/bash
[root@localhost /]# usermod -l zhangfei zhangsan // 将用户zhangsan名称修改为zhangfei
[root@localhost /]# cat /etc/passwd
zhangfei❌502:502::/usr/zhangsan:/bin/bash
3.3.4 修改用户口令
使用passwd命令修改口令。root用户可以修改自己和其他用户的口令,普通用户只能修改自己的口令。为了系统安全起见,用户应该选择比较复杂的口令,如最好使用8位长的口令,如果口令的长度小于8位,则会提示“BAD PASSWORD:The password is shorter than 8 characters”,但是对口令的设置不影响,仍可以修改成功。
语法:passwd [选项] [用户名]
[root@localhost /]# passwd sunlei
更改用户 sunlei 的密码 。
新的 密码:输入新口令
重新输入新的 密码:重复输入新口令
passwd: 所有的身份验证令牌已经成功更新。
3.3.5 删除用户
如果一个用户的账号不再使用,可以从系统中删除。删除用户就是删除与用户有关的系统配置文件中的记录(如/etc/passwd)。
语法 userdel [选项] 用户名
常用的选项是-r,它的作用是把用户的主目录一起删除。
删除sunlei用户,并查看sunlei是否已经删除 。在/etc/passwd文件中已经看不到sunlei用户的记录,说明已经删除。
[root@localhost home]# userdel -r sunlei
[root@localhost home]# cat /etc/passwd | grep sunlei

3.3.6 切换用户
su命令用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码。
语法 su [参数] 用户
切换用户为jiangtao
[root@localhost usr]# su jiangtao
[jiangtao@localhost usr]$
切换用户为 root 并在执行 date 指令后退出变回原使用者。
[root@localhost usr]# su -c date root
切换用户为jiangtao,并改变工作目录至 jiangtao 的家目录(home dir)
[root@localhost usr]# su - jiangtao
[jiangtao@localhost ~]$ pwd
/home/jiangtao
3.4 Linux系统用户组的管理
用户组是具有相同特征用户的集合。每个用户都至少属于一个用户组,系统可以对一个用户组中的所有用户进行集中管理。例如,同时赋予多个用户相同的权限,就可以把用户都定义到同一个用户组,指定用户组的权限,就可以让用户组下的所有用户具备同样的权限。当我们创建一个用户时,会自动创建一个同名的用户组。用户组的管理涉及用户组的添加、删除和修改。常用命令有:groupadd、groupmod、groupdel、cat。
3.4.1查看用户组
查看/etc/group文件,可以查看到用户组信息。显示结果从左至右依次表示用户组,用户组密码,用户组id,用户组的所有用户。
[root@localhost 桌面]# cat /etc/group
root❌0:myuser1
bin❌1:bin,daemon
daemon❌2:bin,daemon
sys❌3:bin,adm
master❌500:
zhangsan❌502:
user❌503:
3.4.2 新增用户组
语法: groupadd [选项] 用户组
选项说明:
选项 说明
-g GID 指定新用户组的组标识号(GID)。
-o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。

创建一个名为mysql的组,并使用grep命令在/etc/group中查找与mysql组有关的记录。
[root@bogon Desktop]# groupadd mysql
[root@bogon Desktop]# grep mysql /etc/group
mysql❌1005:
添加组名为myGroup1的用户组,并指定组标识号为1999,并使用grep命令在/etc/group中查找与myGroup1组有关的记录。
[root@bogon Desktop]# groupadd -g 1999 myGroup1
[root@bogon Desktop]# grep myGroup1 /etc/group

3.4.3 修改用户组
语法: groupmod [选项] 用户组
选项说明:
选项 说明
-g GID 指定新用户组的组标识号(GID)。
-o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。
-n 将用户组的名字改为新名字。
把mysql组名改为mysql3306,并查看是否修改成功。
[root@bogon Desktop]# groupmod –n mysql3306 mysql
[root@bogon Desktop]# grep mysql3306 /etc/group
例如把mysql组的标识号改为1998
[root@bogon Desktop]# groupmod -g 1998 mysql
3.4.4 删除用户组
语法 groupdel 用户组
例如删除mysql3306,并查看是否删除成功。
[root@bogon Desktop]# groupdel mysql3306
[root@bogon Desktop]# grep mysql3306 /etc/group

3.4.5 用户及用户组权限案例
在实际生产中,我们一般使用用户和用户组权限,来对服务器进行管理。例如,服务器中使用了redis缓存,为了方便管理,用redis用户组来对redis进行管理,现在公司新来了一名员工小刚,我们来创建一个用户(用户名为名字的汉语拼音),并设置密码为(123456),并把该用户分配给 redis用户组来管理,具体实现如下。
[root@localhost 桌面]# groupadd redis
[root@localhost 桌面]# useradd zhangjie
[root@localhost 桌面]# passwd zhangjie
更改用户 zhangjie 的密码 。
新的 密码:
重新输入新的 密码:
passwd: 所有的身份验证令牌已经成功更新。
下面把zhangjie用户分配给用户组redis。
[root@localhost 桌面]# usermod -g redis zhangjie
[root@localhost 桌面]# cat /etc/group
redis❌2000: // redis组的组编号为2000
[root@localhost 桌面]# cat /etc/passwd
zhangjie❌504:2000::/home/zhangjie:/bin/bash

3.5 用户配置文件
在3.3与3.4小节中,对用户和用户组管理的操作都是通过命令来完成的,而这些命令实际是修改有关的系统文件,因此直接修改用户的配置文件可以完成对用户管理的相关操作。与用户相关的系统配置文件主要有3个文件。分别是/etc/passwd、/etc/shadow、/etc/ group, /etc/passwd文件保存用户信息,/etc/shadow文件保存加密的用户密码,/etc/ group文件保存用户组信息。
3.5.1 /etc/passwd文件
系统中所有的用户信息都会记录到 /etc/passwd文件中,是系统识别用户的一个文件。当用户登录时,系统首先读取/etc/passwd文件。假设用户名为user,则会etc/ passwd文件中查看是否有该账号,然后确定user的uid,通过uid确认用户和身份。在 etc/passwd文件中,每一行都表示一个用户的信息。每行有7个字段,字段间通过“:”分隔,如果某个字段没有值可以直接使用“::”。具体内容信息如下(在此只列出/etc/passwd中的两行)
[root@localhost 桌面]# cat /etc/passwd
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
myuser1❌503:503::/home/myuser1:/bin/bash
zhangfei❌502:502::/usr/zhangsan:/bin/bash
zhangjie❌504:2000::/home/zhangjie:/bin/bash
下表是/etc/passwd每行中的字段含有。
字段 含义
第一字段 用户名(登录名)
第二字段 口令(密码),x只是占位的功能,真正的密码被映射到/etc/shadow文件中
第三字段 用户标识符(uid)
第四字段 用户所在组的组标识(gid)
第五字段 注释性描述,是可选的。可以写用户住址、姓名、电话等。上面的myuser1、zhangfei、zhangjie3个用户空缺这个字段。
第六字段 用户的主目录
第七字段 用户所属的Shell类型

3.5.2 /etc/shadow文件
/etc/shadow和/etc/passwd文件是互补的,由于/etc/passwd文件所有用户都可以访问,为保证安全,将密码和其他/etc/passwd文件不能包括的信息(如有效期限)单独保存在 etc/shadow中,此文件只有root用户有权查看。例如,用master用户查看该文件时,会出现提示“Permission denied(权限不足)”。
[master@localhost 桌面]$ cat /etc/shadow
cat: /etc/shadow: 权限不够
在/etc/shadow文件中,每个用户的信息有9个字段,字段之间通过“:”分隔,具体格式如下。
[root@localhost 桌面]# cat /etc/shadow
root: 1 1 1q5sWzLb1$JTzmxQXpqc8CdYSuWjiuZ0:18003:0:99999:7:::
zhangfei:!!:18008:0:99999:7:::
zhangjie: 1 1 1f9QFdlOW$nxdCZXPdE3p73Z2/kXsyx0:18008:0:99999:7:::
字段 含义
第一字段 用户名(登录名),与/etc/passwd文件的第一个字段相同
第二字段 密码(已被加密),若此字段为x,表示密码为空
第三字段 最后一次修改密码的时间,从1970年1月1日至最后一次修改密码的时间相隔的天数
第四字段 两次修改密码间隔的最少天数,即用户必须间隔多少天才能修改其密码。若该字段为0,则表示禁用此功能
第五字段 两次修改密码间隔的最多天数
第六字段 提前多少天警告用户密码将过期
第七字段 密码过期多少天后禁用此用户
第八字段 用户账户到期时间。若该字段为空,则该用户永久可用
第九字段 保留字段,目前为空,以备将来Linux发展之用
3.5.3 /etc/group文件
/etc/group文件是用户组的配置文件,可以直观看出用户组中包括哪些用户。每个用户组是一条记录,每个记录包含4个字段,字段之间通过“:”分隔,具体内容如下每个字段的具体含义如下表所示。
[root@localhost 桌面]# cat /etc/group
root❌0:myuser1
bin❌1:bin,daemon
redis❌2000:
zhangjie❌504:
字段 含义
第一字段 用户组名称
第二字段 用户组口令
第三字段 组标识符gid
第四字段 组内用户列表,多个用户之间用“,”分隔

3.6 文件权限管理
权限是操作系统用来限制对资源访问的机制(如能否使用某个设备,CPU资源等),权限一般分为读、写、执行。系统中每个文件都拥有特定的权限、所属用户及所属组。通过这样的机制来限制哪些用户、哪些组可以对特定文件进行什么样的操作。
有3种类型的用户可以访问文件或目录:文件所有者、同组用户、其他用户。所有者一般是文件的创建者,对该文件的访问权限拥有控制权。所有者可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。
文件有三种权限,读权限(r权限),写权限(w权限),执行权限(x权限)如下表。
权限标识符 对文件的影响 对目录的影响
-r 可读取文件内容 可列出目录内容
-w 可修改文件内容 可在目录中创建、删除文件
-x 可作为命令执行 可访问目录内容
3.5.1 文件权限查看:ls
语法: ls -l或者ll
直接查看文件或者目录的权限。
当用ls -l命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。例如显示/etc目录下的详细信息。
[root@bogon Desktop]# ls -l /etc
total 1820
drwxr-xr-x. 3 root root 4096 Aug 23 03:02 abrt
drwxr-xr-x. 4 root root 4096 Aug 23 03:05 acpi
-rw-r–r--. 1 root root 45 Sep 20 15:02 adjtime
-rw-r–r--. 1 root root 1512 Jan 12 2010 aliases
第一个字段表示文件的权限信息, 第一个字段的字一个字母代表文件的类型,-代表是普通文件,d代表是目录;权限一共分成3组,3个一组,分别是所有者的权限,所属组的权限,其他人的权限,此时abrt文件的第一个字母是d,所以是类型是目录。目录的权限具体是,所有者具有读写执行的权限,同组的人具有读,执行的权限,其他人具有读,执行的权限。
注意:ll不是命令,是ls -l的别名相当于windows里的快捷方式。所以"ll"和"ls -l"的功能是相同的。
3.5.2 改变文件的拥有者:chown
通过chown命令将文件的所有者修改为指定的用户,普通的用户不能将自己的文件改变成其他的拥有者,超级用户才拥有此权限。
语法 chown [选项] 用户组 文件名
例如,使用用户jiangtao在/usr/tmp目录下创建目录dir1,在dir1目录下创建空文件a,b。
[root@localhost Desktop]# su jiangtao
[jiangtao@bogon Desktop]$ cd /usr/tmp
[jiangtao@bogon tmp]$ mkdir dir1
[jiangtao@bogon tmp]# ls -al
total 12
drwxrwxrwt. 3 root root 4096 Sep 26 09:12 .
drwxr-xr-x. 21 root root 4096 Aug 23 03:05 …
drwxr-xr-x. 2 root root 4096 Sep 26 09:12 dir1
[jiangtao@bogon tmp]$ cd dir1
[jiangtao@bogon dir1]$ touch a b // 创建空文件
[jiangtao@bogon dir1]$ ls
a b
[jiangtao@bogon tmp]$ ls -al
total 8
drwxrwxr-x. 2 jiangtao jiangtao 4096 Sep 21 17:00 .
drwxrwxrwt. 3 root root 4096 Sep 21 17:00 …
-rw-rw-r–. 1 jiangtao jiangtao 0 Sep 21 17:00 a
-rw-rw-r–. 1 jiangtao jiangtao 0 Sep 21 17:00 b
切换到root用户,添加用户myUser1,修改dir1目录所属用户为myUser1
[jiangtao@bogon dir1]$ su root //切换到root用户
Password: //输入密码时不回显
[root@bogon dir1]# useradd myUser1
[root@bogon dir1]# cd /usr/tmp
[root@bogon tmp]# chown myUser1 dir1 //将dir1目录的所有者设置为myUser1
[root@bogon tmp]# ls -al
total 12
drwxrwxrwt. 3 root root 4096 Sep 21 17:00 .
drwxr-xr-x. 21 root root 4096 Aug 23 03:05 …
drwxrwxr-x. 2 myUser1 jiangtao 4096 Sep 21 17:00 dir1
3.5.3 改变文件所在组:chgrp
通过chgrp命令变更目录和文件的所在组,只有root用户拥有此权限。
语法:chgrp [选项] 组名或组ID 文件
[root@localhost dir1]# groupadd zhangjie
[zhangfei@localhost dir1]$ cat /etc/group //查看所有用户组
zhangjie❌504:
[zhangfei@localhost dir1]$ su root
密码:
[root@localhost dir1]# ls -ld a
-rw-r–r--. 1 root root 0 4月 23 19:30 a
[root@localhost dir1]# chgrp zhangjie a
[root@localhost dir1]# ls -ld a
-rw-r–r--. 1 root zhangjie 0 4月 23 19:30 a
3.5.4 文件权限修改:chmod
chmod命令用来变更文件或目录的权限。在UNIX系统家族里,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用。用户可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。
每一个权限都可以用某一个数字代表。读权限r代表数字为4,写权限w代表数字为2,执行权限代表数字为1。
-rwxrw-r— 表示拥有者的权限是读,写,执行;同组的权限有读,写;其他人的用户是读的权限,用数字表示起来很简单 就是764
三个一组,rwx权限分别对应421相加得7,rw-对应42相加为6,r–对应4。
权限属性对目录和文件的影响
权限属性对目录和文件的影响见下表。
权限 对文件的影响 对目录的影响
r(读) 可读取文件内容 可列出目录内容
w(写) 可修改文件内容 可在目录中创建、删除文件
x(执行) 可作为命令执行 可访问目录内容

  1. 数字法修改
    语法:
    chmod [mode=421] [文件或目录]
    示例把ceshi文件的权限改为拥有者具有读写执行的权限,同组成员具有读写执行的权限,其他人具有读写执行的权限。
    [root@bogon Desktop]# cd /usr/tmp
    [root@bogon tmp]# mkdir dir1
    [root@bogon tmp]# ls -al
    total 12
    drwxrwxrwt. 3 root root 4096 Sep 26 09:12 .
    drwxr-xr-x. 21 root root 4096 Aug 23 03:05 …
    drwxr-xr-x. 2 root root 4096 Sep 26 09:12 dir1
    [root@bogon tmp]# chmod 766 dir1
    You have new mail in /var/spool/mail/root
    [root@bogon tmp]# ls -al
    total 12
    drwxrwxrwt. 3 root root 4096 Sep 26 09:12 .
    drwxr-xr-x. 21 root root 4096 Aug 23 03:05 …
    drwxrw-rw-. 2 root root 4096 Sep 26 09:12 dir1

2.表达式法
语法:
chmod [who][operator][mode] , [ [who][operator][mode]…] [文件或目录]
who指的是什么用户,取值为u、g、o。若没有此参数,则表示对所有用户进行操作。operator表示增加或取消某个权限,取值为“+”或“-”。mode指的是读、写、执行权限,取值为r、w、x的任意组合。
下面是who的参数选项。
选项 说明
u 文件或目录的所有者
g 同组用户
o 其他用户
a 所有用户、默认值
[root@localhost tmp]# touch file1 // 新建文件file1
// 文件所有者有读写权,同组用户读权限,其他用户有读权限
[root@localhost tmp]# ls -ld file1
-rw-r–r--. 1 root root 0 4月 23 20:40 file1
// 文件所有者增加x权限,同组用户增加x权限,其他用户增加x权限
[root@localhost tmp]# chmod u+x,g+x,o+w file1
[root@localhost tmp]# ls -ld file1
-rwxr-xrw-. 1 root root 0 4月 23 20:40 file1
3.6 习题

  1. 添加用户tiger(在/etc/passwd文件中可以搜索到与tiger有关的信息行,即添加用户成功),并为tiger用户指定密码。
  2. 在/usr/temp目录下,找到一个文件,查看该文件的读、写、执行权限,并指定文件的所有者拥有读、写、执行三种权限。
  3. 创建一个用户组mysql,以自己的名字创建一个用户,并把该用户分配到mysql用户组中
  4. 在/usr/tmp目录下,创建一个mysql.sh文件,把该文件的所有者改为以自己名字命名的用户
  5. 把mysql.sh的文件的权限改为,自己名字命名的用户具有读写执行权限,同组用户具有读执行权限,其他组的用户具有读执行权限

第4章 Linux文件管理
4.1 Linux文件系统简介
Linux文件系统(File System)是Linux系统的核心模块。在Linux中,任何软件和I/O设备都被视为文件。和Windows不同的是Linux中的文件名要区分大小写。Linux中也没有盘符的概念,而只有目录,不同的硬件分区被挂载在不同的目录下。使用文件系统,用户可以很好地管理各项文件及目录资源。
4.1.1 Linux目录结构
在计算机系统中存在大量的文件,如何有效地组织与管理它们,并为用户提供一个使用方便的接口是文件系统的主要任务。Linux系统以文件目录的方式组织和管理系统中的所有文件。
所谓文件目录,就是将所有文件的说明信息采用树形结构组织起来。整个文件系统有一个根(root),然后在根上分叉(directory),每个分叉上都可以再分叉,或者可以生成叶子。根和分叉在Linux中称为“目录”或“文件夹”,叶子称为“文件”。
通常Linux安装后会默认创建一些系统目录,存放操作系统相关的文件。

4.1.2 Linux文件类型
一谈到文件类型,大家就能想到Windows的文件类型,比如file.txt、file.doc、file.sys、file.mp3、file.exe等,根据文件的后缀就能判断文件的类型。但在Linux一个文件的类型和后缀名没有太大的关系,主要看文件的属性有关。Linux中常用的文件类型有5种:普通文件、目录文件、链接文件、设备文件和管道文件。

  1. 普通文件
    普通文件是指以字节为单位的数据流类型文件,它是最常见的一类文件。用户通常接触到的文件,如图形文件、文档文件、声音文件都属于普通文件。普通文件可以分为文本文件和二进制文件。
    [root@localhost ~]# ls -l install.log
    -rw-r–r-- 1 root root 53K 03-16 08:54 install.log
    我们用 ls -l 来查看某个文件的属性,可以看到有类似 -rw-r–r-- ,值得注意的是第一个符号是-,这样的文件在Linux中就是普通文件。这些文件一般是用一些相关的应用程序创建,比如图像工具、文档工具、归档工具… … 或 cp工具等。
  2. 目录
    [root@localhost ~]# ls -l
    总计 14M
    -rw-r–r-- 1 root root 2 03-27 02:00 fonts.scale
    -rw-r–r-- 1 root root 53K 03-16 08:54 install.log
    -rw-r–r-- 1 root root 14M 03-16 07:53 kernel-2.6.15-1.2025_FC5.i686.rpm
    drwxr-xr-x 2 root root 4.0K 04-19 10:53 mydir
    drwxr-xr-x 2 root root 4.0K 03-17 04:25 Public

当我们在某个目录下执行,看到有类似 drwxr-xr-x ,这样的文件就是目录,目录在Linux是一个比较特殊的文件。注意它的第一个字符是d。
3. 链接文件
Linux 系统链接文件有软链接和硬链接(Hard Link)两种。
 软链接(Symbolic Link)
软链接又称为符号链接(Symbolic Link),可以看作是Windows中的快捷方式,可以让你快速链接到目标文件或目录。软链接实际上是指向一个真实存在的文件链接,这和Windows操作系统中的快捷方式有点相似。下面的命令就显示system-release文件的类型是symbolic link,链接目标是centos-release。
[root@localhost etc]# file /etc/system-release
system-release: symbolic link to `centos-release’
当我们查看文件属性时,会看到有类似 lrwxrwxrwx,注意第一个字符是l,这类文件是符号链接文件。
[root@localhost etc]# ls -al system-release
lrwxrwxrwx. 1 root root 14 4月 17 07:16 system-release -> centos-release
下面我们创建一个软链接。
创建软链接语法:
ln -s [源文件或目录] [目标文件或目录]
-s软链接(符号链接)
[root@localhost etc]# cd ~
[root@localhost ~]# echo “hello”>/file1
[root@localhost ~]#
// 为/file1文件创建符号链接/usr/file2,如果file1删除,则file2失效
[root@localhost ~]# ln -s /file1 /usr/file2
//查看源文件/file1和软链接文件/usr/file2,注意软链接的权限没有意义
[root@localhost ~]# ll /file1 /usr/file2
-rw-r–r--. 1 root root 6 4月 24 17:55 /file1
lrwxrwxrwx. 1 root root 6 4月 24 17:57 /usr/file2 -> /file1
 硬链接
创建硬链接语法:
ln [源文件或目录] [目标文件或目录]
要想理解硬链接,必须先了解inode。当划分磁盘分区并格式化的时候,整个分区会被划分为两个部分,即inode区和data block(实际数据放置在数据区域中)。这个inode即是(目录、档案)文件在一个文件系统中的唯一标识,需要访问这个文件的时候必须先找到并读取这个文件的 inode。 inode 里面存储了文件的很多重要参数,其中唯一标识称作 Inumber, 其他信息还有创建时间(ctime)、修改时间(mtime) 、文件大小、属主、归属的用户组、读写权限、数据所在block号等信息。

[root@localhost ~]# echo “jiang” > /etc/f1
[root@localhost ~]# cat /etc/f1
jiang
// inode编号为781837,链接次数为1
[root@localhost ~]# ll -i /etc/f1
781837 -rw-r–r--. 1 root root 6 4月 24 18:29 /etc/f1
// 创建硬链接,f1和f2文件使用同一个inode编号781837,链接次数为2。这时f1和f2两个文件互为硬链接。
[root@localhost ~]# ln /etc/f1 /usr/f2
[root@localhost ~]# ll -i /etc/f1 /usr/f2
781837 -rw-r–r--. 2 root root 6 4月 24 18:29 /etc/f1
781837 -rw-r–r--. 2 root root 6 4月 24 18:29 /usr/f2
[root@localhost ~]# ln /usr/f2 /f3 // 创建f2的硬链接f3
[root@localhost ~]# ll -i /etc/f1 /usr/f2 /f3
781837 -rw-r–r--. 3 root root 6 4月 24 18:29 /etc/f1
781837 -rw-r–r--. 3 root root 6 4月 24 18:29 /f3
781837 -rw-r–r--. 3 root root 6 4月 24 18:29 /usr/f2
[root@localhost ~]# rm -rf /usr/f2 // 删除/usr/f2
[root@localhost ~]# cat /usr/f2
cat: /usr/f2: 没有那个文件或目录
[root@localhost ~]# cat /f3
jiang
[root@localhost ~]# vim /f3 // 修改/f3内容为jiangtao
[root@localhost ~]# cat /etc/f1 // 修改/f3后,/etc/f1文件也发生了修改
jiangtao
所以,硬链接实际上将一个重要的文件做了多次备份,它们之间互为硬链接,它们之间没有源文件和目标文件的区分。删除其中的一个文件不会影响其他文件。修改其中的一个文件其他的文件也会发生变化。
硬链接需要注意以下两点
 硬链接不能跨文件系统(分区)
 硬链接不支持目录
[root@localhost ~]# ln /home /mnt
ln: “/home”: 不允许将硬链接指向目录
4. 设备文件
设备文件是Linux中最特殊的文件。正是由于它的存在,Linux系统可以十分方便地访问外部设备。Linux系统为外部设备提供一种标准接口,将外部设备视为一种特殊的文件。用户可以像访问普通文件一样访问任何外部设备,使Linux系统可以很方便地适应不断变化的外部设备。通常Linux系统会将设备文件放到/dev目录下。根据访问数据方式的不同,设备文件分为块(block)设备和字符(char)设备文件。

进入/dev目录,列一下文件,会看到类似如下的。
[root@localhost ~]# ls -la /dev/tty
crw-rw-rw- 1 root tty 5, 0 04-19 08:29 /dev/tty
[root@localhost ~]# ls -la /dev/hda1
brw-r----- 1 root disk 3, 1 2006-04-19 /dev/hda1
我们看到/dev/tty的属性是 crw-rw-rw- ,注意前面第一个字符是 c ,这表示字符设备文件。比如猫等串口设备。我们看到 /dev/hda1 的属性是 brw-r----- ,注意前面的第一个字符是b,这表示块设备,比如硬盘,光驱等设备。目前在最新的Linux发行版本中,我们一般不用自己来创建设备文件。因为这些文件是和内核相关联的。
5. 管道文件
管道文件是一种很特殊的文件,主要用于不同进程的信息传递。当两个进程间需要传递数据或信息时,可以使用管道文件。一个进程将需要传递的数据或信息写入管道的一端,另一个进程则从管道的另一端取得所需的数据或信息。

4.1.3 Linux文件系统结构
Linux文件系统是一个倒置的单根树状结构,所有的文件和目录都是存在于一个根目录root下。在Linux系统中,路径使用“/”分割,而在Windows系统中,路径使用“\”分割。Linux中没有盘符的概念,不同的硬盘分区被挂载在不同目录下。
下面我们讲述Linux文件系统的几个概念。
1.当前工作目录
在Linux文件系统中,每一个Shell或系统进程都有一个当前工作目录,使用pwd命令可以显示当前的工作目录。Linux中用pwd命令来查看“当前工作目录“的完整路径。也就是说,每当在终端进行操作时,都会有一个当前工作目录。如果想查看当前目录在文件系统内的确切位置,可以使用pwd命令。
[root@bogon Desktop]# cd /usr/tmp
[root@bogon tmp]# pwd
/usr/tmp
2.文件名称
Linux系统下的文件名长度最多可到255个字符。通常情况下,文件名的字符包括:字母、数字、"."(点)、"_"(下划线)和"-"(连字符)。Linux允许在文件名中使用除上述符号之外的其它符号,但并不建议用户这样做。文件名中不能出现正斜线“/”,因为正斜线是分割符。和Windows系统不同,Linux文件系统严格区分大小写。例如,在Linux文件系统中,linuxks文件和linuxKs是两个不同的文件,但在Windows系统中这两个文件是同一个文件。以“.“开头的文件是隐藏文件。要注意的是,在Linux文件系统中文件和文件夹是没有区别的,都统称为文件。
3.绝对路径与相对路径
如何到达一个文件或目录的方式有两种,绝对路径和相对路径。绝对路径是以根目录“/”开始,递归每级目录直到目标路径。相对路径是以当前目录为起点,到达目标的路径。注意的是绝对路径不受当前所在目录限制,而相对目录受到当前所在目录的限制。”.“代表当前目录,也可以使用“./”来表示。“…”代表父目录。“.”和“…”只会出现在相对路径中。

当前目录是/var/lib,需要定位到init.d文件。使用绝对路径时,写法为/etc/init.d。使用相对目录…/…/etc/init.d。
4.2 磁盘分区
在Linux中,每一个硬件设备都映射到一个系统的文件,包括硬盘、光驱等IDE或SCSI(Small Computer System Interface,设备小型计算机系统接口,一种用于计算机和智能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统级接口的独立处理器标准,SCSI是一种智能的通用接口标准)设备。 Linux为各种IDE设备分配了一个由hd前缀组成的文件。各种SCSI设备,则被分配了一个由sd前缀组成的文件,编号方法为拉丁字母表顺序。如第一个IDE设备(如IDE硬盘或IDE光驱),Linux定义为hda;第二个IDE设备就定义为hdb;下面以此类推。而SCSI设备就应该是sda、sdb、sdc等。USB磁盘通常会被识别为SCSI设备,因此其设备名可能是sda。
在 Linux中规定,每一个硬盘设备最多能有4个主分区(其中包含扩展分区)。任何一个扩展分区都要占用一个主分区号码。在一个硬盘中,主分区和扩展分区一共最多是4个。编号方法为阿拉伯数字顺序。需要注意的是,主分区按1234编号,扩展分区中的逻辑分区,编号直接从5开始,无论是否有2号或3号主分区。对于第一个IDE硬盘的第一主分区,则编号为hdal,而第二个IDE硬盘的第一个逻辑分区编号应为hdb5。
常见的 Linux磁盘命名规则为hdxY(或者sdxY),其中X为小写拉丁字母,Y为阿拉伯数字。个别系统可能命名略有差异。
大家可以看到有两块SATA硬盘,第一块编号为sda,第二块为sdb。sda有3个主分区,分别是sda1、sda2、sda3。剩下的是扩展分区,分为2个逻辑分区,直接从5开始,分别是sda5、sda6。

我们可以使用df命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计。
[root@localhost usr]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 ext4 18G 3.3G 14G 20% /
tmpfs tmpfs 491M 224K 491M 1% /dev/shm
/dev/sda1 ext4 291M 34M 242M 13% /boot
第一列指定文件系统的名称,第三列指定一个特定的文件系统的总量。被使用的和可用的量使用列指定使用的内存的百分比,而最后一栏"安装在"指定的文件系统的挂载点。所谓的挂载点就是将磁盘的某个分区挂载到Linux某一个目录下以便访问。如第一个分区sda1(/dev/sda1)挂载到/boot目录下,第二个分区sda2(/dev/sda2)挂载到/目录下。

  1. 磁盘分区
    下面我们可以对硬盘进行重新分区。和Windows一样,在Linux下用于磁盘分区的命令也是fdisk。注意磁盘分区操作会对数据造成损失,因此需要谨慎。
    参数l表示打印出现有分区类型。
    [root@localhost 桌面]# fdisk -l
    Disk /dev/sda: 21.5 GB, 21474836480 bytes
    255 heads, 63 sectors/track, 2610 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000de86e
    Device Boot Start End Blocks Id System
    /dev/sda1 * 1 39 307200 83 Linux
    Partition 1 does not end on cylinder boundary.
    /dev/sda2 39 2358 18631680 83 Linux
    /dev/sda3 2358 2611 2031616 82 Linux swap / Solaris
    现有一个SATA硬盘,硬盘上共有3个分区,/dev/sda3是交换分区。类似windows下的虚拟内存,当内存不够的时候部分数据放到swap分区。
    [root@localhost 桌面]# fdisk /dev/sda
    WARNING: DOS-compatible mode is deprecated. It’s strongly recommended to
    switch off the mode (command ‘c’) and change display units to
    sectors (command ‘u’).
    Command (m for help): m // m是显示帮助
    Command action
    a toggle a bootable flag
    b edit bsd disklabel
    c toggle the dos compatibility flag
    d delete a partition // 删除一个分区
    l list known partition types // 列出分区类型
    m print this menu
    n add a new partition // 增加一个新分区
    o create a new empty DOS partition table
    p print the partition table // 列出分区表
    q quit without saving changes // 不保存退出
    s create a new empty Sun disklabel
    t change a partition’s system id // 改变分区系统
    u change display/entry units
    v verify the partition table
    w write table to disk and exit // 写入分区表到磁盘并退出
    x extra functionality (experts only)
    我们可以先通过p命令显示磁盘分区表信息,然后再确定将来的分区。
    Command (m for help): p
    Disk /dev/sda: 21.5 GB, 21474836480 bytes
    255 heads, 63 sectors/track, 2610 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000de86e
    Device Boot Start End Blocks Id System
    /dev/sda1 * 1 39 307200 83 Linux
    Partition 1 does not end on cylinder boundary.
    /dev/sda2 39 2358 18631680 83 Linux
    /dev/sda3 2358 2611 2031616 82 Linux swap / Solaris
    如果想完全完全改变硬盘的分区格式,就可以通过d命令一个一个删除磁盘分区。删除完成后,再通过n命令增加新的分区。
    // 开始删除分区,使用d命令
    Command (m for help): d // 删除分区1
    Partition number (1-4): 1
    Command (m for help): d // 删除分区 2
    Partition number (1-4): 2
    Command (m for help): d // 删除分区 3
    Selected partition 3
    Command (m for help): p
    Disk /dev/sda: 21.5 GB, 21474836480 bytes
    255 heads, 63 sectors/track, 2610 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000de86e
    Device Boot Start End Blocks Id System //删除分区后没有分区
    // 开始增加分区,使用n命令
    Command (m for help): n
    Command action
    e extended // 增加扩展分区
    p primary partition (1-4) // 增加主分区
    p // 输入p表示增加主分区
    Partition number (1-4): 1 // 分区编号
    First cylinder (1-2610, default 1): 1 // 从磁柱1开始
    Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +500M //大小500M
    Command (m for help): n // 增加第二个分区
    Command action
    e extended
    p primary partition (1-4)
    p // 增加主分区
    Partition number (1-4): 2
    First cylinder (66-2610, default 66): 66
    Last cylinder, +cylinders or +size{K,M,G} (66-2610, default 2610): +18G
    Command (m for help): n // 增加第三个分区
    Command action
    e extended
    p primary partition (1-4)
    p
    Partition number (1-4): 3
    First cylinder (2417-2610, default 2417): 2417
    Last cylinder, +cylinders or +size{K,M,G} (2417-2610, default 2610):
    Using default value 2610
    Command (m for help): p
    Disk /dev/sda: 21.5 GB, 21474836480 bytes
    255 heads, 63 sectors/track, 2610 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000de86e
    Device Boot Start End Blocks Id System
    /dev/sda1 1 65 522081 83 Linux
    /dev/sda2 66 2416 18884407+ 83 Linux
    /dev/sda3 2417 2610 1558305 83 Linux
    // 在增加分区时,其类型都是默认的Linux,如果需要把其中的某些分区改为其他类型,如Linux Swap或FAT32等,可以使用t命令查看有哪些类型。
    Command (m for help): t // 修改分区类型
    Partition number (1-4): 3 // 要修改的分区编号
    Hex code (type L to list codes): L // 查看分区编号
    0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
    1 FAT12 39 Plan 9 82 Linux swap / So c1 DRDOS/sec (FAT-
    2 XENIX root 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT-
    3 XENIX usr 40 Venix 80286 84 OS/2 hidden C: c6 DRDOS/sec (FAT-
    4 FAT16 <32M 41 PPC PReP Boot 85 Linux extended c7 Syrinx
    5 Extended 42 SFS 86 NTFS volume set da Non-FS data
    6 FAT16 4d QNX4.x 87 NTFS volume set db CP/M / CTOS / .
    7 HPFS/NTFS 4e QNX4.x 2nd part 88 Linux plaintext de Dell Utility
    Hex code (type L to list codes): 82
    Changed system type of partition 3 to 82 (Linux swap / Solaris)
    Command (m for help): p
    Disk /dev/sda: 21.5 GB, 21474836480 bytes
    255 heads, 63 sectors/track, 2610 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000de86e
    Device Boot Start End Blocks Id System
    /dev/sda1 1 65 522081 83 Linux
    /dev/sda2 66 2416 18884407+ 83 Linux
    /dev/sda3 2417 2610 1558305 82 Linux swap / Solaris
    // 修改完分区后,使用w命令,保存并退出。如果不保存使用q命令
    Command (m for help):w
    // partprobe命令通知系统分区表的变化
    [root@localhost 桌面]# partprobe /dev/sda
    2.分区的格式化
    分区完成后,需要格式化文件系统才能正常使用。格式化磁盘使用mkfs命令。
    语法:
    mkfs -t type device
    -t的参数type为文件系统格式,如ext4、vfat、ntfs等,参数device为/dev/sdb1,/dev/sdb2。
    [root@localhost Desktop]# mkfs -t ext4 /dev/sda1
    [root@localhost Desktop]# mkfs -t ext4 /dev/sda2
    [root@localhost Desktop]# mkswap /dev/sda3 (有问题?)
    3.磁盘挂载
    要使用磁盘分区,就需要挂载该分区。挂载时需要指定挂载的设备和挂载目录。注意,我们平时说的挂载点就是挂载目录。挂载磁盘分区的命令为mount。

4.3目录的管理
4.3.1 文件和目录的查看
Linux ls命令用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)。
语法:
ls [选项] [文件或目录名]
选项 说明
-a 显示所有文件及目录 (ls内定将文件名或目录名称开头为"."的视为隐藏文件,不会列出)
-l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
-r 将文件以相反次序显示(原定依英文字母次序)
-t 将文件依建立时间之先后次序列出
-A 同 -a ,但不列出 “.” (目前目录) 及 “…” (父目录)
-F 在列出的文件名称后加一符号;例如可执行文件则加 "", 目录则加 “/”
-R 若目录下有文件,则以下之文件亦皆依序列出
列出根目录(/)下的所有目录。
[root@localhost /]# ls /
列出目前工作目录下所有名称是 sys 开头的文件,越新的排越后面。
[root@localhost /]# ls -ltr sys

将 /bin 目录以下所有目录及文件详细资料列出。
[root@localhost /]# ls -lR /bin
列出目前工作目录下所有文件及目录;目录于名称后加 “/”, 可执行档于名称后加 “*” 。
[root@localhost /]# ls -AF
4.3.2目录的创建
通过 mkdir 命令可以实现在指定位置创建目录,要创建目录的用户必须对所创建目录的父目录夹具有写权限。并且,所创建的目录不能与其父目录)中的其他文件名重名,即同一个目录下不能有同名的(区分大小写)。
语法: mkdir [选项] 目录
选项 说明
-m 建立目录的同时设置目录的权限。
-p 若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录。

1创建一个空目录
语法:mkdir 目录名
创建一个名字为dir1的空目录
[root@bogon tmp]# mkdir dir1
[root@bogon tmp]# ls -al
total 12
drwxrwxrwt. 3 root root 4096 Sep 26 09:12 .
drwxr-xr-x. 21 root root 4096 Aug 23 03:05 …
drwxr-xr-x. 2 root root 4096 Sep 26 09:12 dir1
所有的目录都以d开头,.目录代表当前目录,…目录代表当前目录的父目录。
2创建多级目录
命令:mkdir -p 父目录/子目录
示例创建redis目录,并在redis目录下创建zhangsan目录。
[root@bogon tmp]# mkdir -p redis/zhangsan
[root@bogon tmp]# ll
total 8
drwxrw-rw-. 2 root root 4096 Sep 26 09:12 dir1
drwxr-xr-x. 3 root root 4096 Sep 26 09:41 redis
[root@bogon tmp]# cd redis
[root@bogon redis]# ll
total 4
drwxr-xr-x. 2 root root 4096 Sep 26 09:41 zhangsan
3创建权限为777(rwxrwxrwx)的目录
文件的权限分为读、写、执行三种。r表示可读(数值4),w表示可写(数值2),对于目录来说表示可在目录中新建文件。x表示可执行(数值1),对于目录来说可进入到该目录中。777 表示当前用户对该目录具有读写执行的权限,该用户同组用户对该目录具有读写执行的权限,其他组成员对该目录具有读写执行权限。
[root@bogon tmp]# mkdir -m 777 public
[root@bogon tmp]# ll
total 5
drwxrwxrwx. 4 root root 4096 Sep 24 12:45 public
绿色表示可执行文件
4创建新目录并显示目录信息
[root@bogon tmp]# mkdir -v hadoop
mkdir: created directory ‘hadoop’
显示创建了hadoop目录的信息
5一个命令创建多级目录结构
有时我们需要使用一个mkdir命令创建目录结构。例如我们创建baklog目录,baklog目录下有bin,lib,log目录。log目录下有cep,dod,testlog目录。
[root@localhost usr]# mkdir -vp baklog/{bin,lib,log/{cep,dod,testlog}}
mkdir: created directory baklog' mkdir: created directorybaklog/bin’
mkdir: created directory baklog/lib' mkdir: created directorybaklog/log’
mkdir: created directory baklog/log/cep' mkdir: created directorybaklog/log/dod’
mkdir: created directory `baklog/log/testlog’
选项v表示显示创建目录的信息,p表示创建多级目录。
4.3.3目录的删除
rmdir命令只能用来删除空目录,若目录中存在文件,就要使用rm命令删除文件后再删除目录,后面会详细介绍rm命令。
命令: rmdir [选项] 目录名称
选项 说明
-p 删除指定目录上的所有目录,这些目录都应该是空目录
-i 在删除的过程中,以询问的方式完成删除操作

例如删除product目录,命令如下
[root@localhost doc]# rmdir -p product
例如删除service/deploy/product多级目录,命令如下
[root@localhost scf]# rmdir -p service/deploy/product
例如删除/a/b目录,命令如下
[root@localhost scf]# rmdir -p /a/b
4.3.4目录的复制
目录的复制是将给出的文件或目录复制到另一个文件或目录中,类似与DOS下的copy命令。
cp [选项] 被复制的目录 目标目录路径
选项 说明
-a 此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
-d 复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
-f 覆盖已经存在的目标文件而不给出提示。
-i 与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目标文件将被覆盖。
-p 除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
-r 若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
-l 不复制文件,只是生成链接文件。

例如把zhangsan目录下以及子目录复制到url目录下的local目录下,并查看。
[root@bogon Desktop]# cd /usr/tmp
[root@bogon tmp]# ls
zhangsan
[root@bogon tmp]# cp -r zhangsan /usr/local
例如把exam1.c复制到/usr/tmp目录下,并改名为exam2.c
[root@bogon tmp]# cp exam1.c -i /usr/tmp/exam2.c
4.3.5目录移动
用户可以使用mv命令为文件或目录改名或文件由一个目录移动到另一个目录中。该命令类似于DOS下的ren和move的组合。
命令:mv 源目录名 新目录名
例如把dir1目录的名称改为dir2目录。
[root@bogon tmp]# mv dir1 dir2
例如把/usr/jiang中的所有文件移动到当前目录中,当前目录用“.”表示。
[root@bogon tmp]# mv /usr/jiang/* .
4.4 文件的管理
文件的创建、复制、移动和删除操作在Linux系统中使用得相当频繁。
4.4.1文件的创建
touch命令有两个功能:一是用于把已存在文件的时间标签更新为系统当前时间,数据保留不变。二是用来创建新的空文件。touch命令需要root权限。
命令: touch [选项] 文件名
例如创建空文件readme
[root@bogin tmp]touch readme
4.4.2文件的删除
在Linux系统中,可以使用rm命令将无用文件删除。该命令的功能是删除一个目录中的一个文件或者多个文件,也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只是删除了链接,原有文件保持不变。
命令:rm [选项] 文件名或目录名
选项 说明
-f 强制删除文件或目录。
-i 删除已有文件或目录之前先询问用户。
-r 递归处理,将指定目录下的所有文件与子目录一并处理。
-v 显示指令的详细执行过程。

例如删除文件或目录src,如果目录下的所有文件与子目录一并处理。
[root@bogon tmp]# ls
redis.sh src
[root@bogon tmp]# rm -rf src
[root@bogon tmp]# ls
redis.sh
例如删除tmp目录下的文件f1和f2。并要求对每个文件进行确认。用户最终决定删除f1文件,保留f2文件。
[root@localhost scf]# rm -i f1 f2
rm: remove regular empty file f1'? y rm: remove regular empty filef2’? n
4.4.3 文件的查看
cat命令是用来显示文件内容,另外还能够用来连接两个或多个文件,形成新文件。
命令:cat [选项] 文件名
选项:
选项 说明
-n 由 1 开始对所有输出的行数编号。
-b 和 -n 相似,只不过对于空白行不编号。
-s 当遇到有连续两行以上的空白行,就代换为一行的空白行。
-E 在每行结束处显示 $。

例如查看文件redis.sh 内容并显示行号
[root@bogon tmp]# cat -n names.txt
1 jiangtao
2 tom
3 mike
4 jack
例如把文件f1和f2的内容连接起来,放入到文件f3中。并显示文件f3的内容。
[root@localhost tmp]# cat f1 f2 > f3
[root@localhost tmp]# cat f3
4.4.4文件类型的辨识
file命令用于辨识文件类型。
命令:file [选项] 文件名
例如显示文件setup.ini的文件类型。
[root@localhost etc]# file /etc/profile
/etc/profile: ASCII English text
[root@localhost etc]# file /etc/system-release
/etc/system-release: symbolic link to `centos-release’
4.4.5文件的查找
在使用linux时,经常需要进行文件查找,并执行指定的操作。其中查找的命令是find。该命令的功能是从指定的目录开始,递归地搜索各个子目录,查找满足寻找条件的文件并对其采取相关的操作。find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。
find命令可以使用逻辑运算符not,and,or组成的复合条件。
逻辑运算符 功能描述
and 逻辑与,在命令中使用“-and”或“-a”
or 逻辑或,在命令中使用“-or”或“-o”
not 逻辑非,在命令中使用“!”

命令: find 查找范围 [选项] 目录名或者文件名
示例1:列出当前目录及子目录下所有文件和文件夹
[root@bogon tmp]# find .
示例2:在/home目录及子目录下查找以.txt结尾的文件名
[root@bogon tmp]# find /home -name .txt

[root@bogon tmp]# find /home -name "
.txt"
示例3:同上,但忽略大小写
[root@bogon tmp]# find /home -iname “.txt"
示例4:当前目录及子目录下查找所有以.txt或者.pdf结尾的文件
[root@bogon tmp]# find /home -name "
.txt” -or -name ".pdf"
示例5:基于正则表达式匹配文件路径,查找文件名以.txt或以.pdf结尾的文件
[root@bogon tmp]# find . -regex ".
(.txt|.pdf)KaTeX parse error: Expected 'EOF', got '#' at position 44: …root@bogon tmp]#̲ find /home ! …PATH
我们可以在任何目录下执行ls命令,大家是否想过为什么在任何目录下都可以执行/bin/ls这个命令?这是因为环境变量PATH的帮助所致。当我们执行ls命令时,系统会依照PATH的设置去PATH定义的目录下查找文件名为ls的可执行文件,如果在PATH定义的目录中含有多个文件名为ls的可执行文件,那么先查找到的同名命令先被执行。
执行命令:echo $PATH
[root@localhost bin]# echo P A T H / u s r / l o c a l / s b i n : / u s r / s b i n : / s b i n : / u s r / l o c a l / b i n : / u s r / b i n : / b i n : / r o o t / b i n e c h o 有 “ 显 示 ” 的 意 思 , P A T H 前 面 加 的 PATH /usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin echo有“显示”的意思,PATH前面加的 PATH/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/root/binechoPATH表示后面接的是变量。
PATH(一定是大写)这个变量的内容由一堆目录所组成,每个目录之间用冒号(:)来隔开,每个目录有顺序之分。
注意:
 PATH变量中的路径不加“.”,这一点用Windows的习惯不同。
 PATH是可以修改的
 使用绝对路径和相对路径直接指定某个命令的文件名来执行,会比查找PATH来的正确
 命令应该放到正确的目录下,执行才会比较方便
4.6 文件的压缩与解压
文件的归档和压缩其实有不同的含义。归档其实就是我们平时说的打包,是指把多个文件组合到一个文件中。归档的好处是减少文件数目,归档的好处是将多个文件作为电子邮件的附件发送或更方便的传送给他人。压缩指的是将一个大的文件通过一些压缩算法变成一个小文件,Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得将这一大堆文件先归档,然后再用压缩程序进行压缩。
4.6.1 归档程序
linux下最常用的归档程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。所以通常Linux下,保存文件都是先用tar命令将目录或文件打包成tar归档文件,然后进行压缩。
tar [选项] 文件
tar命令选项
选项 说明
-c 建立新的压缩文件
-x 从压缩的文件中提取文件
-t 显示压缩文件的内容
-z 支持gzip压缩和解压文件
-r 向压缩文件末尾追加文件
-u 更新原压缩包中的文件
-v 显示操作过程
-f 指定压缩文件

例如把所有.jpg的文件打成images.tar的包。
[root@bogon tmp]# tar –cf images.tar *.jpg
例如把所有.gif的文件增加到images.tar包中。
[root@bogon tmp]# tar -rf images.tar *.gif
例如更新原来tar包images.tar中title.jpg文件。
[root@bogon tmp]# tar -uf images.tar title.jpg
例如列出images.tar包中所有文件。
[root@bogon tmp]# tar -tf images.tar
例如解出images.tar包中的所有文件。
[root@bogon tmp]#tar -xf images.tar
例如把所有.jpg的文件打成images.tar的包,并显示出操作过程
[root@bogon tmp]# tar –cvf images.tar *.jpg
以上的案例只是完成了归档工作,如果tar命令需要归档的同时进行压缩,需要使用参数z。
例如把目录中的所有.jpg文件打包成images.jar,并且将用gzip压缩,生成一个gzip压缩过的包,命名为images.tar.gz。
[root@bogon tmp]# tar -czvf images.tar.gz *.jpg
tar命令解压时需要使用参数x。
例如解压images.tar包
[root@bogon tmp]# tar -xvf images.tar
例如解压images.tar.gz包,当前包是经过gzip压缩过的。
[root@bogon tmp]# tar -xzvf images.tar.gz
4.6 习题
1 创建一个目录mycat,并改名字为mycat6。
2 创建文件mybat.sh。
3 在根目录下寻找目录名为ect的命令是什么?
4 在/usr/tmp目下下,找一个文件进行压缩,压缩的格式为tar.gz结尾。

第5章Linux 文本处理
Linux系统中存在众多不同类型的文件,其中相当多的文件是文本文件。我们学习Linux,就必须学习如何编辑文本文件。本章学习如何使用文字处理器软件vim进行文本操作以awk文本分析工具。学习完本章后就可以对文本文件进行简单的处理分析。
5.1文字处理器
在Linux系统中,即使在控制台命令行状态下,也需要进行大量的文本处理工作。Linux系统中几乎所有的配置文件都是以纯文本形式存在的,我们也要对这些文件进行编辑工作。Linux上常见的文本编辑器有vi、vim、ed、gedit、emacs等。本章介绍的文本编辑器就是平常使用最多的vim文本处理器。
5.1.1 vim简介
在所有的Linux发行版系统上都有vi编辑器,因此利用简单的文字编辑软件就能够轻松地修改系统的各种配置了,非常方便。vi就是一种功能强大的文本编辑器,取visual(可视化的)单词的前两个字母进行命名。在UNIX系统中就有vi应用程序,在Linux诞生时,vi与基本UNIX应用程序一样被保留下来,成为Linux基本管理程序的一员,为用户提供了一个全屏幕的窗口编辑平台。
1991年,BramMoolenaar基于vi进行了优化,发布了vim(vi improved vi改良),vim在GUI图形用户界面上做了大量优化,但是在使用方法上和vi相同。所以我们可以把vim看做是具有图形支持的高级版的vi,不但可以用不同颜色显示文字内容或特殊信息,不但能编写普通的文本文件,还能更好的进行诸如Shell脚本、C语言、JAVA语言、Python语言程序编辑等功能,成为通用性的程序编辑器。
Linux系统中可以使用多种文字处理器,为什么我们要使用vim呢?原因有以下几点。
 现在所有的Linux发行版系统上都会默认内置vim编辑器,而不一定带有其他文本编辑器,非常通用
 很多软件的编辑接口都会默认调用vi
 vi具有程序编辑的能力
 vi程序简单,编辑速度相当快速
绝大多数Linux发行版都配备了vim,我们使用vi命令时,调用的仍然是Linux系统中的vim程序,当然你使用vim命令,也可以达到相同的结果。在终端输入vi命令,会显示图5.1的结果。
[root@bogon Desktop]# vim

5.1 启动vim程序
在此环境下,输":q"可以退回终端。
5.1.2 vim 工作模式
vi 有三种工作模式,分别是:
 命令模式(或称为常规模式)
 插入模式
 末行模式(或称为ex模式)

  1. 命令模式
    进入vi编辑器时,首先进入命令模式(command mode)。在命令模式下,从键盘输入任何字符都被当作命令来解释。在命令模式下,可以完成复制、粘贴、选择、删除、撤销等命令。输入命令后vim会立即执行,不需要回车,而且输入的字符不会在屏幕上显示出来。在任何模式下,都可以按Esc键返回到命令模式,如果按一次没有效果,可以多按几次Esc键,以保证顺利返回命令模式。
    [root@localhost tmp]# vim package.json
    命令模式如图5.2所示。

图5.2 vim命令模式
命令模式下可以执行命令、保存文件、移动光标、粘贴复制等。
2 .插入模式
主要用于文本的编辑。该模式下用户输入的任何字符都被作为文件的内容保存起来,并在屏幕上显示出来。进去命令模式后,按字母i键或a键,进入插入模式。
插入模式有一个–insert–标识,在文件的下方有如图5.2的标识。

图5.2 插入模式
在插入模式下,输入Esc键会返回到命令模式。
3. 末行模式
命令模式下的命令可以完成很多功能,但要执行一些如保存当前修改并继续编辑、保存并退出vim环境、不保存修改退出vim环境、显示行号等操作还是必须要进入末行模式。在命令模式下用户可以按键盘的shift加:进入末行模式,在末行模式下我们可以进行保存修改或退出vim,也可以环境设置、列出行号、寻找字符串等对文件进行一些高级处理。
底行模式在打开vi编辑器后,文件的下面,有一个标识,如图5.3所示。

图5.3 末行模式
在末行模式下按Esc键会退回命令模式。
5.1.3 vim编辑器的使用
1命令模式
终端输入vi命令后直接进入到命令模式,可以选择编辑某个文件或直接编辑空文件。
[root@bogon Desktop]#vi
[root@bogon Desktop]#vi setup.ini
命令模式的常见命令如表5-1所示。
图5-1 命令模式下常见命令
命令 说明
yy 复制当前行
y0 复制当前字符到当前行的起始
y$ 复制当前字符到当前行的末尾
yG 复制当前行到文件末尾的内容
n+yy 复制n行
p 粘贴
x 删除当前字符
X 删除前一个字符
dd 删除当前行
d$ 删除当前字符到当前行的末尾
d0 删除当前字符到当前行的开始
dG 删除当前行到文件末尾
u 撤销上一个操作
r 替换当前字符
通过命令可以控制光标的移动(比如上下左右键),控制光标移动的。
图5-2 命令模式下光标移动命令
命令 说明
h或左方向键 左移一位
l(小写L)或右方向键 右移一位
j或下方向键 下移一位
K或上方向键 上移一位
^ 移动到光标所在行的“行首”
$ 移动到光标所在行的“行尾”
gg 移动到文件开头
G 移动到文件最后
w 移动到下个单词的开头
b 移动到上个单词的开头
e 移动到当前单词的字尾
H 移动到屏幕最上面一行
M 移动到屏幕中间一行
L 移动到屏幕最下面一行
注意:命令是区分大小写的。
2插入模式
在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面。
不过有一点要特别注意,就是您进入vi之后,是处于命令行模式,您要切换到插入模式才能够输入文字。在命令行模式下按一下字母i或a就可以进入插入模式,这时候你就可以开始输入文字了。
您目前处于插入模式,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下ESC键转到命令行模式,再删除文字。
3末行模式
在命令模式下按":“键进入末行模式。这时光标会移动到屏幕底部,在这里可以保存修改或退出vim,也可以设置编辑环境,寻找字符串、列出行号等。末行模式的常用命令操作如表5-3所示。
表5-3末行模式下命令
命令 退出方式
:w 文件名 以指定的文件名保存,并退出,类似于另存为。
:w 保存当前修改,还可以继续编辑
:wq 保存当前修改,并退出vim环境
:q 退出vim环境(如果当前文件发生修改,将无法保存)
:q! 不保存当前修改,并退出vim环境
:x 保存当前修改,并退出vim环境。相当于:wq的意思
ZZ 保存当前修改,并退出vim环境。相当于:wq的意思
:set number 显示行号,简写为:set nu。注意,vi关闭后行号将不再显示
:! 系统命令 执行一个系统命令并显示结果,如在vim下需要执行ls时,可以使用:! ls
:sh 切换到命令行
w是write的简写,表示保存的意思。q是quit的简写,是退出的意思。
表5-3中有几个命令类似,如q、q!、wq,但是它们在使用时是有区别的。q命令表示退出vim环境,但是如果执行命令前没有保存文本,就会出现错误提示,提示如下:
E37: No write since last change (add ! to override)
q!命令强制退出vim环境,即使没有保存文本,也可以成功退出。wq命令保存文本并退出vim环境。
例如我们创建一个文本文件demo。
[root@bogon Desktop]# vim demo
进入命令模式,单击i或a键切换到插入模式,输入文本。
hello world
i am jiangtao
are you ok?
按Esc键回到命令模式,再按:键进入末行模式,在冒号后输入q,系统会提出没有保存无法退出vim环境,提示信息如下:
E37: No write since last change (add ! to override)
如果事先输入:w将修改做了保存,就不会出现提示内容,下面是输入:w提示信息。
“demo” [New] 3L, 39C written
然后再输入:q,就会退出vim环境。当然,直接输入:wq可以直接保存后退出vim环境。
当文本内容很多时,我们可以显示行号,设置方式是末行模式下输入:set nu。
如果光标要跳转指定行,使用:行号。例如,跳转到第10行,使用 :10。
4查找和替换
vim具有十分强大的查找和替换功能。在vim环境下,根据搜索条件将光标移动到指定的位置,并用颜色标记出查找到的内容。需要注意,在执行文本替换时,可以控制在用户确认后才能进行替换。
例如,我们使用vim创建一个文件后查找相应内容。
[root@bogon Desktop]# vi doc1
进入命令模式下,输入i键进入插入模式输入下面文字内容。
《You Have Only One Life》
  There are moments in life when you miss someone so much that you just want to pick them from your dreams and hug them for real! Dream what you want to dream;go where you want to go;be what you want to be,because you have only one life and one chance to do all the things you want to do.
内容输入完成后按Esc键,进入命令模式,输入:w保存修改内容。下面我们要在整个文件中查找on单词。在命令模式或末行模式下,输入”/",在屏幕的底部出现一个"/“符号,在”/“后输入要查找的内容,按Enter键结束,当然我们也可以在”/"键后输入正则表达式进行查找。如果我们希望查找下一个按n键,查找上一个按N键。查找到的内容会用颜色显示。
图5.3是命令模式下输入要查找的内容on,图5.4是按n或N键在查找内容间切换。
图5.3 全文查找

图5.4 全文查找切换

替换文本内容是在末行模式下进行的,即如果需要替换则输入":“末行模式。比如我们需要对doc2文件进行替换操作,将文本中的+替换为-,命令如下。
[root@bogon Desktop]# vi doc2
f=a+b+c+d+e
命令模式下输入”:"进入末行模式,输入下面内容。
:%s/+/-/g
输入完成后,按Enter键,文本中的内容变化为:
f=a-b-c-d-e
由此可以看出替换成功,+号替换-号。上述命令中各个字母的含义如表5-4所示
命令组成 含义
%s 确定操作范围,%代表从文本的第一行到最后一行
s 执行替换操作
/+/- 搜索和替换的文本(搜索字母+,替换字母-)
g 对搜索到每一行的每一个实例进行替换;如果g缺失,则只替换每一行第一个符合条件的实例。
如果替换命令变为:
%s/+/-/gc
则在每次替换前都会请求用户确认,在屏幕最下方会出现如下内容。
replace with r (y/n/a/q/l/E/Y)?
用户可以选择括号中的任一个字符进行回答,每一个字符的含义如表5-5。
表5-5 用户确认中字符的含义
字符 含义
y 执行替换
n 跳过此次替换
a 执行此次替换以及之后的所有替换
q 停止替换
l(小写L) 执行此次替换以及之后的所有替换
^E(Ctrl+E)
^Y(Ctrl+Y) ^E表示向下滚动
^Y表示向上滚动
用于查看替换处的上下文
常用的替换命令:
命令 说明
😒/vivian/sky/ 替换当前行第一个 vivian 为 sky
😒/vivian/sky/g 替换当前行所有 vivian 为 sky
:%s/vivian/sky/ 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g 替换每一行中所有 vivian 为 sky

5.2 文本剪切和粘贴

  1. 剪切命令cut
    cut命令用于显示每行从开头算起 num1 到 num2 的文字。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
    语法:
    cut 选项 [file]
    选项 功能描述
    -b 以字节为单位进行分割。
    -c 以字符为单位进行分割。
    -f 与-d一起使用,指定显示哪个区域。
    -d 自定义分隔符,默认为制表符。
    -n 取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除
    执行date命令时只想显示前19个字符。|表示将前面的命令结果赋值后面的表达式。-c表示以字符为单位进行分割。
    [root@localhost usr]# date
    Sat Apr 27 22:42:05 PDT 2019
    [root@localhost usr]# date |cut -c 1-19
    Sat Apr 27 22:42:30
    下面我们执行who命令,我们只想显示从10到15
    [root@localhost usr]# who
    root tty7 2019-04-25 08:10 (:0)
    root pts/0 2019-04-27 22:48 (:0.0)
    [root@localhost usr]# who | cut -c 10-15
    tty7
    pts/0
    从a.txt文件中提取每行第2,7-9字符
    [root@localhost usr]# cut -c 2,7-9 a.txt
    iao
    shin
    an
    ssa
    2.粘贴命令paste
    paste命令的作用与cut命令正好相反,不是从文本中提取信息,而是向文本中添加信息。
    语法:
    paste [选项] [file1] [file2]
    选项 功能描述
    -s 将每个文件中的内容占用一行输出
    -d 指定分隔符,若没有使用该参数,则默认用Tab分隔
    [root@localhost usr]# cat a.txt doc2.txt
    jiangtao
    is a chinese man.
    jaskson
    is a usa man.
    f=a-b-c-d
    [root@localhost usr]# paste a.txt doc2.txt
    jiangtao f=a-b-c-d
    is a chinese man.
    jaskson
    is a usa man.
    [root@localhost usr]# paste -s a.txt doc2.txt
    jiangtao is a chinese man. jaskson is a usa man.
    f=a-b-c-d
    [root@localhost usr]# paste -d ‘-’ a.txt doc2.txt
    jiangtao-f=a-b-c-d
    is a chinese man.-
    jaskson-
    is a usa man.-
    5.3 文本格式化输出
    为使输出的文本更加直观清晰,Linux提供了很多格式化文本输出的命令。有printf、fmt、nl、fold命令。
    1.输出格式化命令printf
    printf [format] [文本1] [文本2] …
    格式替换符
    选项 功能描述
    %s 字符串
    %f 浮点格式
    %c ASCII字符,即显示对应参数的第一个字符
    %d,%i 十进制整数
    %o 八进制值
    %u 不带正负号的十进制值
    %x 十六进制值(a-f)
    %X 十六进制值(A-F)
    %% 表示%本身
    常用转义字符
    选项 功能描述
    \b 后退
    \f 换页
    \n 换行
    \r 回车
    \t 水平制表符
    \v 垂直制表符
    \ 表示\本身
    [keysystem@localhost ~]$ printf “%s\n” 1 2 3 4
    1
    2
    3
    4
    [keysystem@localhost ~]$ printf “%f\n” 1 2 3 4
    1.000000
    2.000000
    3.000000
    4.000000
    [keysystem@localhost ~]$ printf “%.2f\n” 1 2 3 4
    1.00
    2.00
    3.00
    4.00
    [keysystem@localhost ~]$ printf " (%s) " 1 2 3 4;echo “”
    (1) (2) (3) (4)
    [root@localhost usr]# printf " (%s) " 1 2 3 4
    (1) (2) (3) (4) [root@localhost usr]#
    [keysystem@localhost ~]$ printf “%s %s\n” 1 2 3 4
    1 2
    3 4
    [keysystem@localhost ~]$ printf “%s %s %s\n” 1 2 3 4
    1 2 3
    4
    [keysystem@localhost ~]$
    [keysystem@localhost ~]$ #"-“表示左对齐, “10 10 4 4” 表示占的字符位数, 不够不空格
    [keysystem@localhost ~]$ printf “%-10s %-10s %-4s %-4s \n” 姓名 性别 年龄 体重 苹果 男 18 60 香蕉 男 18 80
    姓名 性别 年龄 体重
    苹果 男 18 60
    香蕉 男 18 80
    [keysystem@localhost ~]$ printf “%X” 13 #10进制转16进制
    D[keysystem@localhost ~]$ printf “%X\n” 13
    D
    [keysystem@localhost ~]$ printf “%d” 0xB #16进制转10进制
    2.简单文本格式化命令fmt
    fmt命令用于编排文本文件。fmt指令会从指定的文件里读取内容,将其依照指定格式重新编排后,输出到标准输出设备。若指定的文件名为”-",则fmt指令会从标准输入设备读取数据。
    [root@localhost usr]# cat app.json
    {
    “pages”:[
    “pages/aboutme/aboutme”,
    “pages/index/index”,
    “pages/logs/logs”
    ],
    “window”:{
    “backgroundTextStyle”:“light”,
    “navigationBarBackgroundColor”: “#0ff”,
    “navigationBarTitleText”: “第一个微信小程序”
    }
    }
    // 重新编排文件内容
    [root@localhost usr]# fmt app.json
    {
    “pages”:[
    “pages/logs/logs"x”,outme",
    “window”:{
    “navigationBarBackgroundColor”:",
    “navigationBarTitleText”: “第一个微信小程序”
    }
    }
    3.行标号命令nl
    nl命令在linux系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号。
    [root@localhost usr]# nl a.txt
    1 jiangtao
    2 is a chinese man.
    3 jaskson
    4 is a usa man.
    5.4 文本分析工具
    1.awk
    awk是一种优良的文本处理工具,其名称来源于Bel实验室的三名开发者Aho、Weinberger和 Kernighan姓氏的首字母组合,主要完成字符串查找、替换、加工等操作还包含可以进行模式装入、流控制、数学运算、进程控制等语句。尽管awk具有完全属于其本身的语法,但在很多方面类似于 Shell编程语言。awk扫描文件中的每一行,查找与命令行中给定内容相匹配的模式,如果发现匹配内容,则进行下一个编程步骤;如果找不到匹配内容,则继续处理下一行。
    语法:
    awk ‘pattern {action}’ file
    awk扫描file中的每一行,对符合模式pattern的行执行操作action。也可以只有pattern或者 action,在 action操作中可能会用到一些特殊字符,常用的特殊字符及含义如表所示。
    特殊字符 含义
    $0 所有列
    $1 第一列($2表示第二列,$3表示第三列)
    NF 所有列
    NR 所有行
    -F 指定间隔符
    [root@localhost usr]# cat c.txt; echo “”
    1 Tom:JiangTao:3222
    2 Mary:SunLei:3463
    3 Sallay:ZhaoHuaWei:6333
    // 匹配有JiangTao的行
    [root@localhost usr]# awk ‘/JiangTao/’ c.txt
    awk: /JiangTao
    // 输出c.txt文件的第一列
    [root@localhost usr]# awk ‘{print $1}’ c.txt
    1
    2
    3
    // 匹配有"JiangTao"的行,并输出此行的第二列
    [root@localhost usr]# awk ’ /JiangTao/ {print $2}’ c.txt
    Tom:JiangTao:3222

2.grep
grep指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为"-",则grep指令会从标准输入设备读取数据。
grep [选项] [范本样式] [文件或目录…]
实例1:当前目录下查找以file前缀的文件中含有jiangtao的行。
[root@localhost local]# ls
android1 etc file2 include lib libexec sbin src afile
bin file1 games jdk lib64 mysql share tomcat
[root@localhost local]# grep jiangtao file*
file1:jiangtao
file2:jiangtao
实例2:递归的方式查找/usr/local/tomcat目录及子目录中的文件中包含java的文件。 [root@localhost Desktop]# grep -r java /usr/local/tomcat
实例3:反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不包含java行的内容。
[root@localhost Desktop]# grep -v -r java /usr/local/tomcat

5.5 管道
1.多命令顺序执行
多命令执行符 格式 作用
; 命令1;命令2 多个命令顺序执行,命令之间没有任何逻辑联系
&& 命令1&&命令2 逻辑与
当命令1执行正确,则命令2才会执行
当命令2执行不正确,则命令2不会执行
|| 命令1 || 命令2 逻辑或
当命令1执行不正确,则命令2才会执行
当命令2执行正确,则命令2不会执行
实例1:同时执行多条命令
[root@localhost ~]# date;ls;cd /usr;date;ls
Wed May 8 07:49:28 PDT 2019
anaconda-ks.cfg Documents install.log Music Public Videos
Desktop Downloads install.log.syslog Pictures Templates
Wed May 8 07:49:28 PDT 2019
bin etc include lib libexec sbin src
dzqc games java lib64 local share tmp
如果其中一条命名发生错误,后面的命令依旧会执行。如date1命令错误,ls命令仍旧执行。
[root@localhost usr]# date1;ls
bash: date1: command not found
bin etc include lib libexec sbin src
dzqc games java lib64 local share tmp
实例2:同时执行ls和echo命令
[root@localhost usr]# ls && echo ‘yes’
bin etc include lib libexec sbin src
dzqc games java lib64 local share tmp
yes
[root@localhost usr]# ls1 && echo yes
bash: ls1: command not found
逻辑与表示命令ls和命令echo同时成功时同时或失败
实例3:ls和echo命令只执行其中一个。
[root@localhost usr]# ls || echo yes // 执行的ls,没有执行echo
bin etc include lib libexec sbin src
dzqc games java lib64 local share tmp
[root@localhost usr]# ls1 || echo yes // 执行echo,没有执行ls1
bash: ls1: command not found
yes
实例4:判断ls命令是否正确执行,如果正确执行打印success,不正确执行打印fail
[root@localhost usr]# date && echo success || echo fail
Wed May 8 08:18:15 PDT 2019
success
[root@localhost usr]# date1 && echo success || echo fail
bash: date1: command not found
fail
实例5:判断命令的执行结果
[root@localhost usr]# date1 || echo no && echo yes
2.管道符
语法:
命令1 | 命令2
命令1的正确输出作为命令2的操作对象
实例1:命令ls显示/etc目录下的文件,并将结果重定向到abc.txt文件中。再用more显示。
[root@localhost etc]# ls -al>abc.txt
[root@localhost etc]# more abc.txt
上面的功能能使用一条命令吗?
[root@localhost etc]# ls /etc | more
将netstat命令的结果发到grep ,显示包含udp的行。
[root@localhost etc]# netstat -lntup | grep udp
udp 0 0 0.0.0.0:631 0.0.0.0:* 1803/cupsd
udp 0 0 0.0.0.0:68 0.0.0.0:* 2864/dhclient
将netstat命令的结果发到grep ,显示包含udp的行的数量。
[root@localhost etc]# netstat -lntup | grep udp | wc -l
2
5.6 习题

  1. vi编辑器有哪3种模式?
  2. 这三种模式之间如何切换?
  3. 编写一个redis.sh脚本文件,内容如下(这是生产上tomcat的一个启动脚本,这里用vi编辑器做的)
    #!/bin/sh
    export JAVA_HOME=/usr/java/jdk1.6.0_26
    pid=ps -auxww|grep tomcat|grep -v grep|awk '{print $2}'
    echo p i d i f [ − n " pid if [ -n " pidif[n"pid" ]; then
    echo “tomcat is start==”
    ‘/usr/server/tomcat-7.0.27/bin/shutdown.sh’
    fi

第6章Linux常见应用
6.1 linux远程登录
Linux大多应用于服务器,而服务器不可能像PC一样放在办公室,它们是放在IDC机房的,所以登录linux系统都是通过远程登录的。Linux系统中是通过SSH服务实现的远程登录功能。SSH服务代替Telnet进行远程管理,使用多种加密和认证方式,有效地解决了数据在传输过程中的安全问题。SSH默认SSH服务开启了22端口,而且当我们安装完系统时,这个服务已经安装,并且是开机启动的。所以不需要我们额外配置什么就能直接远程登录linux系统。
通过以下命令可以查看SSH软件的安装情况。
查看SSH客户端安装情况
[root@localhost ssh]# rpm -q openssh
openssh-5.3p1-94.el6.x86_64
查看SSH服务器安装情况
[root@localhost ssh]# rpm -q openssh-server
openssh-server-5.3p1-94.el6.x86_64
如果没有安装openssh软件,请执行下面的安装命令。
[root@localhost ssh]# yum install -y openssh
[root@localhost ssh]# yum install -y openssh-server
SSH服务的配置文件为 /etc/ssh/sshd_config,你可以修改这个配置文件来实现你想要的SSH服务。比如你可以更改启动端口为15870(端口号设置为没有被占用的端口,并且更改后要打开此端口),一般默认不改变。
查看SSH服务的安装情况(一般情况下服务名称后面加d表示服务进程)
[root@localhost ssh]# service sshd status
openssh-daemon (pid 2679) is running…
停止SSH服务
[root@localhost ssh]# service sshd stop
Stopping sshd: [ OK ]
开启SSH服务
[root@localhost ssh]# service sshd start
Starting sshd: [ OK ]
配置服务器开机后自动启动sshd服务
[root@localhost ssh]# chkconfig sshd on
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息。
6.1.1 三种网络连接模式简介
在安装完虚拟机后,默认安装了如下图的两块虚拟网卡——VMnet1和VMnet8,其中VMnet1是host网卡,用于host方式连接网络;VMnet8是NAT网卡,用于NAT方式连接网络的,并且它们的IP地址是随机生成的。如图6.1所示,如果显示下面的内容,表示已经安装成功。
图6.1 虚拟机的两块网卡

VMware提供了三种工作模式,分别是bridge(桥接模式)、NAT(网络地址转换模式)和host-only(仅主机模式)。要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式。具体操作是右击虚拟机,点击菜单中设置选项,点击网络适配器,出现图6.2,在这里更改网络设置。

图6.2 VMware三种工作模式

1 bridge(桥接模式)
在这种模式下,使用VMnet0虚拟交换机,虚拟操作系统就像是局域网中的一台独立的主机,与宿主计算机一样,它可以访问网内任何一台机器。在桥接模式下,可以手工配置它的TCP/IP配置信息(IP、子网掩码等,而且还要和宿主机器处于同一网段),以实现通过局域网的网关或路由器访问互联网,还可以将IP地址和DNS设置成“自动获取”。如果你想利用VMWare在局域网内新建一个服务器,为局域网用户提供Web或网络服务,就应该选择桥接模式。
在桥接模式中,使用VMnet0虚拟交换机,此时虚拟机相当与网络上的一台独立计算机与主机一样,拥有一个独立的IP地址。

A1、A2、A、B四个操作系统可以相互访问
A1、A2的IP为局域网IP,可以手动设置,也可以自动获取
2 NAT(网络地址转换模式)
使用NAT模式,就是让虚拟机借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。也就是说,使用NAT模式可以实现在虚拟系统里访问互联网。NAT模式下的虚拟机的TCP/IP配置信息是由VMnet8虚拟网络的DHCP服务器提供的,因此IP和DNS一般设置为“自动获取”,因此虚拟系统也就无法和本局域网中的其他真实主机进行通讯。采用NAT模式最大的优势是虚拟系统接入互联网非常简单,你不需要进行任何其他的配置,只需要宿主机器能访问互联网即可。如果你想利用VMWare安装一个新的虚拟系统,在虚拟系统中不用进行任何手工配置就能直接访问互联网,建议你采用NAT模式。
NAT模式中使用Vmnet8虚拟交换机,此时虚拟机可以通过主机“单向访问”网络上的其他主机,其他主机不能访问虚拟机。在NAT模式中:

A1、A2可以访问B
B不可以访问A1、A2
A1、A2、A相互访问
A1、A2的IP为局域网IP,可以手动配置,也可以自动获取
3 host-only(主机模式)
在host-only模式中,虚拟机只能与虚拟机、主机互访,但虚拟机和外部的网络是被隔离开的,也就是不能上Internet。在host-only模式下,虚拟系统的TCP/IP配置信息(如IP地址、网关地址、DNS服务器等),都是由VMnet1虚拟网络的DHCP服务器来动态分配的。使用host-only方式:

A、A1、A2可以互访
A1、A2不能访问B
B不能访问A1、A2
A1、A2为局域网IP,可以手动配置,也可以设置成自动获取模式
三种模式中,虚拟机的IP都可以设置成自动获取,一旦自动获取后不会改变(除非手动配置),也就是下次重启后的IP与上次相同。
4 虚拟机网络连接设置
右击虚拟机,点击“设置”菜单,出现虚拟机设置窗体。单击网络适配器,选择NAT模式。

6.1.2 远程访问
1.Xshell
Xshell是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows平台的TELNET协议。Xshell通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。Xshell可以在Windows界面下用来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的。
首先我们安装XShell软件,双击文件Xshell-6.0.0118_yy.exe,单击下一步可以完成XShell安装。
访问虚拟机需要先查看虚拟机IP。打开虚拟机,敲下命令ifconfig。
[root@localhost ssh]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:4F:E4:76
inet addr:192.168.86.143
Bcast:192.168.86.255 Mask:255.255.255.0
双击xShell 6,点击文件菜单下的新建菜单,打开新建会话属性窗体。

名称自定义,主机写ifconfig的IP地址,协议和端口号选择默认的SSH和22。

点击确定,显示SSH用户名窗体。输入用户名和密码,具体见下图。

点击确定,出现下面信息表示已经连接上。
Connecting to 192.168.86.143:22…
Connection established.
To escape to local shell, press ‘Ctrl+Alt+]’.
Last login: Tue May 7 01:57:34 2019 from 192.168.86.1
[root@localhost ~]#
2.Xftp
Xftp是一个功能强大的SFTP、FTP 文件传输软件。使用了 Xftp 以后,MS Windows 用户能安全地在 UNIX/Linux 和 Windows PC 之间传输文件。Xftp 能同时适应初级用户和高级用户的需要。它采用了标准的 Windows 风格的向导,它简单的界面能与其他 Windows 应用程序紧密地协同工作,此外它还为高级用户提供了众多强劲的功能特性。
首先我们安装Xftp软件,双击文件Xftp-6.0.0111_yy.exe,单击下一步可以完成Xftp安装。
双击Xftp6,点击文件菜单下的新建菜单,打开新建会话属性窗体。

输入完成后单击连接,打开下图。就可以实现文件的上传下载。

6.2 yum的使用
yum命令全称为Yellow dog Updater Modified,是一个交互式的基于rpm的包管理器。yum基于rpm包管理,能够从指定的服务器自动下载rpm包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。
yum的关键之处是要有可靠的repository,及软件仓库,它可以是http或ftp站点,也可以是本地软件池,但必须包含rpm的header,header包括了rpm包的各种信息。系统正是收集了这些header并加以分析,才能自动完成余下的任务。

yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。命令形式如下:yum [选项] [命令] [包 …]
其中的选项是可选的,选项包括。
-h:帮助
-y:当安装过程提示选择全部为"yes"
-q:不显示安装的过程
命令为所要进行的操作 ,包是操作的对象。
6.2.1 yum源
CentOS 默认已经安装了yum,但连接的服务器在国外,导致安装软件是速度很慢。我们可以修改配置,使其连接到国内的服务器,即我们可以修改yum命令的软件源。
1.将Centos的yum源更换成国内的阿里云源。
[root@localhost ssh]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
2.运行yum makecache生成缓存
yum makecache是把服务器的包信息下载到本地电脑缓存起来。配合yum -C search xxx使用。不用上网检索就能查找软件信息,执行yum命令时效率更高。
[root@localhost ssh]# yum makecache
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile

  • base: mirrors.aliyun.com
  • extras: mirrors.aliyun.com
  • updates: mirrors.aliyun.com
    base | 3.7 kB 00:00
    base/group_gz | 242 kB 00:00
    base/filelists_db | 6.4 MB 00:01
    extras | 3.4 kB 00:00
    extras/filelists_db | 24 kB 00:00
    extras/prestodelta | 2.2 kB 00:00
    extras/other_db | 14 kB 00:00
    updates | 3.4 kB 00:00
    updates/filelists_db | 2.8 MB 00:00
    updates/prestodelta | 144 kB 00:00
    Metadata Cache Created

6.2.2 常用命令
1.列出所有可更新的软件清单命令:yum check-update
2.更新所有软件命令:yum update
3.仅安装指定的软件命令:yum install <package_name>
4.仅更新指定的软件命令:yum update <package_name>
5.列出所有可安裝的软件清单命令:yum list
6.删除软件包命令:yum remove <package_name>
7.查找软件包 命令:yum search
8.清除缓存命令:
yum clean packages: 清除缓存目录下的软件包
yum clean headers: 清除缓存目录下的 headers
yum clean oldheaders: 清除缓存目录下旧的 headers
yum clean, yum clean all (= yum clean packages; yum clean oldheaders) :清除缓存目录下的软件包及旧的headers
实例1:安装 pam-devel
[root@localhost ssh]# yum install pam-devel
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile

  • base: mirrors.aliyun.com
  • extras: mirrors.aliyun.com
  • updates: mirrors.aliyun.com
    Setting up Install Process
    Resolving Dependencies
    –> Running transaction check
    —> Package pam-devel.x86_64 0:1.1.1-24.el6 will be installed
    –> Processing Dependency: pam = 1.1.1-24.el6 for package: pam-devel-1.1.1-24.el6.x86_64

    实例2:移除 pam-devel
    [root@localhost ssh]# yum remove pam-devel
    Loaded plugins: fastestmirror, refresh-packagekit, security
    Setting up Remove Process
    Resolving Dependencies
    –> Running transaction check
    —> Package pam-devel.x86_64 0:1.1.1-24.el6 will be erased
    –> Finished Dependency Resolution
    Dependencies Resolved
    实例3:利用 yum 的功能,找出以 pam 为开头的软件名称有哪些?
    [root@localhost ssh]# yum list pam*
    Loaded plugins: fastestmirror, refresh-packagekit, security
    Loading mirror speeds from cached hostfile
  • base: mirrors.aliyun.com
  • extras: mirrors.aliyun.com
  • updates: mirrors.aliyun.com
    Installed Packages
    pam.x86_64 1.1.1-24.el6 @base
    pam_passwdqc.x86_64 1.0.5-6.el6 @anaconda-CentOS-201311272149.x86_64/6.5
    Available Packages
    pam.i686 1.1.1-24.el6 base
    pam-devel.i686 1.1.1-24.el6 base
    pam-devel.x86_64 1.1.1-24.el6 base
    pam_krb5.i686 2.3.11-9.el6 base
    pam_krb5.x86_64 2.3.11-9.el6 base
    pam_ldap.i686 185-11.el6 base
    6.3 JDK的安装
    6.3.1 普通安装
  1. JDK的安装
    打开shell,在/usr/local下面新建文件夹 jdk
    [root@localhost local]# mkdir jdk
    [root@localhost usr]# cd jdk
    使用Xftp把JDK文件jdk-8u181-linux-x64.tar.gz上传到JDK文件夹,解压JDK。
    [root@localhost usr]# cd /usr/local/jdk
    [root@bogon jdk]tar zxvf jdk-8u181-linux-x64.tar.gz
    [root@localhost jdk]# ls
    jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz
    jdk下出现jdk1.8.0_181目录,表示已经解压成功。
  2. JDK环境变量配置
    编辑/etc/profile文件,设置配置环境变量。在该文件末尾输入如下代码,添加Java环境变量(export用于设置或显示环境变量) 。

输入:wq! 保存profile文件。
此时JDK已经安装和配置成功
3. profile文件起效
修改了/etc/profile文件,它不会立刻生效,需要重新登录。这时就需要source命令。
[root@localhost jdk]# source /etc/profile
显示JDK版本信息,输入命令
[root@localhost jdk]# java -version
java version “1.8.0_181”
Java™ SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot™ 64-Bit Server VM (build 25.181-b13, mixed mode)
6.3.2 yum安装
1.查看yum软件包信息
[root@localhost Desktop]# yum list | grep openjdk
2.安装JDK1.8.0
[root@localhost Desktop]# yum -y install java-1.8.0-openjdk*
3. 安装检查
[root@localhost Desktop]# java -version
openjdk version “1.8.0_212”
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
6.4 tomcat的安装
在/usr/local目录下新建tomcat目录。打开Xftp把tomcat安装文件apache-tomcat-7.0.91.tar.gz上传到虚拟机中。
解压apache-tomcat-7.0.91.tar.gz,在/usr/local/tomcat目录下敲下命令。
[root@localhost tomcat]# tar -zxvf apache-tomcat-7.0.91.tar.gz
6.5 MySQL数据库安装
现在我们安装mysql数据库。安装步骤如下。

  1. 新建一个虚拟机。
  2. 解压缩mysql-5.6.41-linux-glibc2.12-x86_64.tar.gz,修改名为mysql。
    [root@localhost mysql]# tar -xzvf mysql-5.6.41-linux-glibc2.12-x86_64.tar.gz
    [root@localhost mysql]# mv mysql-5.6.41-linux-glibc2.12-x86_64 mysql
  3. 在解压缩目录下,安装mysql客户端(需要root权限)
    [root@localhost mysql]# yum install mysql
    在安装过程中出现如图所示输入y即可(表示同意下载或安装)
    [root@localhost mysql]# yum install mysql
    Loaded plugins: fastestmirror, refresh-packagekit, security
    Loading mirror speeds from cached hostfile
  • base: mirrors.aliyun.com
  • extras: mirrors.aliyun.com
  • updates: mirrors.aliyun.com
    Setting up Install Process
    Resolving Dependencies
    –> Running transaction check
    —> Package mysql.x86_64 0:5.1.73-8.el6_8 will be installed
    –> Processing Dependency: mysql-libs = 5.1.73-8.el6_8 for package: mysql-5.1.73-8.el6_8.x86_64
    –> Running transaction check
    —> Package mysql-libs.x86_64 0:5.1.71-1.el6 will be updated
    —> Package mysql-libs.x86_64 0:5.1.73-8.el6_8 will be an update
    –> Finished Dependency Resolution
    Dependencies Resolved
    ========================================================================================================
    Package Arch Version Repository Size
    ========================================================================================================
    Installing:
    mysql x86_64 5.1.73-8.el6_8 base 895 k
    Updating for dependencies:
    mysql-libs x86_64 5.1.73-8.el6_8 base 1.2 M
    Transaction Summary
    ========================================================================================================
    Install 1 Package(s)
    Upgrade 1 Package(s)
    Total download size: 2.1 M
    Is this ok [y/N]: y
    Downloading Packages:
    (1/2): mysql-5.1.73-8.el6_8.x86_64.rpm | 895 kB 00:00
    (2/2): mysql-libs-5.1.73-8.el6_8.x86_64.rpm | 1.2 MB 00:00

Total 2.3 MB/s | 2.1 MB 00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Updating : mysql-libs-5.1.73-8.el6_8.x86_64 1/3
Installing : mysql-5.1.73-8.el6_8.x86_64 2/3
Cleanup : mysql-libs-5.1.71-1.el6.x86_64 3/3
Verifying : mysql-libs-5.1.73-8.el6_8.x86_64 1/3
Verifying : mysql-5.1.73-8.el6_8.x86_64 2/3
Verifying : mysql-libs-5.1.71-1.el6.x86_64 3/3
Installed:
mysql.x86_64 0:5.1.73-8.el6_8
Dependency Updated:
mysql-libs.x86_64 0:5.1.73-8.el6_8
Complete!
最后安装成功显示Complete!
4. 安装mysql 服务器端(需要root权限)
[root@localhost mysql]# yum install mysql-server
[root@localhost mysql]# yum install mysql-devel
在安装服务器的时候,同上,如果出现y/N的时候,按下字母y即可
5. 启动mysql服务
[root@localhost mysql]# service mysqld start
Starting mysqld: [ OK ]
出现下面文字,表示mysql数据库启动成功
6. 登录
[root@localhost mysql]# mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: YES)
注意这里无法登录,对数据库远程授权。
use mysql;
grant all privileges on . to root@"%" identified by “123123” with grant option;
flush privileges;
6.6 web项目的发布
6.6.1 启动tomcat
打开Xftp把school.war上传到tomcat上,上传到/usr/local/apache-tomcat-7.0.78/webapps文件夹下,如图所示。

切换到tomcat安装目录下的bin目录,启动tomcat。
[root@localhost bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat/apache-tomcat-7.0.91
Using CATALINA_HOME: /usr/local/tomcat/apache-tomcat-7.0.91
Using CATALINA_TMPDIR: /usr/local/tomcat/apache-tomcat-7.0.91/temp
Using JRE_HOME: /usr/local/jdk/jdk1.8.0_181/jre
Using CLASSPATH: /usr/local/tomcat/apache-tomcat-7.0.91/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-7.0.91/bin/tomcat-juli.jar
Tomcat started.
此时tomcat已经启动成功
6.6.2 访问项目
访问项目之前首先要关闭防火墙。
[root@hadoop Desktop]# service iptables stop
如果需要永久关闭防火墙,执行命令:
[root@hadoop Desktop]# chkconfig iptables off
运行完成后查看防火墙关闭状态 。
[root@hadoop Desktop]# service iptables status
iptables: Firewall is not running.
在浏览器中输入IP:端口号/school即可访问
如图所示

6.7 习题

  1. 有哪几种网络链接模式?以及每一种模式的特点是什么?
  2. 新建一个虚拟机,安装好JDK,tomcat
  3. 在虚拟机中安装mysql数据库,并用第三方客户端成功连接
  4. 启动一个web项目,并访问该项目

第7章Shell编程
7.1 Shell脚本
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,Shell是最重要的实用程序,深入了解和熟练掌握Shell的特性极其使用方法,是用好Linux系统的关键。
可以说,Shell使用的熟练程度反映了用户对Linux使用的熟练程度。
Shell初学者请注意,在平常应用中,建议您不要用 root 帐号运行 Shell 。作为普通用户,不管您有意还是无意,都无法破坏系统;但如果是 root,那就不同了,只要敲几个字母,就可能导致灾难性后果。
打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 HelloWorld.sh,扩展名为 sh(sh代表Shell)。
#!/bin/bash
#My first Shell script
echo Hello World!
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
第二行为注释,Shell的注释以“#”开头,#号后的内容不会执行。在命令行中也是如此。
echo 命令用于向窗口输出文本。
[root@localhost Desktop]# echo ‘jiangtao’ #comment
jiangtao
然后给文件增加可执行权限,并运行。
chmod +x是给文件增加可执行权限的意思。
./HelloWorld.sh是执行当前目录下执行HelloWorld.sh脚本的意思。
[master@localhost Desktop]$ vim HelloWorld.sh
[master@localhost Desktop]$ su root
Password:
[root@localhost Desktop]# chmod +x HelloWorld.sh
[root@localhost Desktop]# ./HelloWorld.sh
Hello World!
注意如果出现下面的问题,说明是文件格式的问题,也就是linux和windows之间的不完全兼容。
[root@localhost usr]# ./read.sh
bash: ./read.txt: /bin/bash^M: bad interpreter: 没有那个文件或目录
vim read.sh
:set ff?
如果出现fileforma=dos那么就基本可以确定是这个问题了。
:set fileformat=unix
:wq

7.2 变量及其使用方法
7.2.1 创建变量
定义变量时,变量名不加美元符号,如:
your_name=“zhangsan”
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。
[root@localhost Desktop]# age = 3
bash: age: command not found
[root@localhost Desktop]# age=3
[root@localhost Desktop]# echo $age
3
同时,变量名的命名须遵循如下规则:
 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
 中间不能有空格,可以使用下划线(_)。
 不能使用标点符号。
 不能使用bash里的关键字(可用help命令查看保留关键字)
有效的 Shell 变量名示例如下:
RUNOOB
LD_LIBRARY_PATH
_var
var2
无效的变量命名:
?var=123
user*name=runoob
对于变量的值,大多数编程语言都可以包含多种不同类型的数据,而Shell变量有字符串一种类型,即无论给Shell变量赋予什么值,在存储时都会转换为字符串。
Shell变量只能在创建它的Shell中使用,对于其他Shell是不可见的,并且Shell变量也不会从父进程传递给子进程,这一点与局部变量非常相似。因此在编写Shell序过程中,当需要临时存储时,可以使用Shell变量。

7.2.2 使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
your_name=“qinjx”
echo $your_name
echo ${your_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面执行的for循环,遍历“Ada Coffe Action Java”,变量名为skill。
for skill in Ada Coffe Action Java
do
echo “I am good at ${skill}Script”
done
如果不给skill变量加花括号,写成echo "I am good at s k i l l S c r i p t " , 解 释 器 就 会 把 skillScript",解释器就会把 skillScript"skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
推荐给所有变量加上花括号,这是个好的编程习惯。
变量的值不是必须的,如果变量在创建时没有赋值,则系统默认此变量的值为null。另外,直接使用$符号获取一个并没有被创建过的变量时,系统会自动创建变量,并且变量赋值为null。
[root@localhost Desktop]# echo n a m e s / / names // names//names的值为null
[root@localhost Desktop]#
7.2.3 修改变量
变量创建后,可以重新对该变量赋值,比如
your_name=“tom”
echo $your_name
your_name=“alibaba”
echo y o u r n a m e 这 样 写 是 合 法 的 , 但 注 意 , 第 二 次 赋 值 的 时 候 不 能 写 your_name 这样写是合法的,但注意,第二次赋值的时候不能写 yournameyour_name=“alibaba”,使用变量的时候才加美元符($)

7.2.4 只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
下面的例子尝试更改只读变量,结果报错:
#!/bin/bash
link_url=“http://www.baidu.com”
readonly link_url
link_url=“http://www.google.com”
运行脚本,结果如下:
[root@localhost Desktop]# ./HelloWorld.sh
./HelloWorld.sh: line 5: link_url: readonly variable
7.2.5 删除变量
对于Shell变量来说,通常不需要主动删除变量,因为Shell变量生存周期只在当前Shell。但是如果我们需要删除Shell变量,可以使用unset 命令删除变量。语法:
unset variable_name
变量被删除后不能再次使用。注意unset 命令不能删除只读变量。
#!/bin/bash
link_url=“http://www.baidu.com”
unset link_url
echo $link_url
以上实例执行将没有任何输出。
7.2.6 变量类型
运行Shell时,会同时存在两种变量:Shell变量和环境变量

  1. Shell变量 Shell变量又称为局部变量,在脚本或命令中定义,仅在当前Shell实例中有效,其他Shell启动的程序不能访问Shell变量。我们上面定义的变量都是Shell变量。
  2. 环境变量 所有的程序,包括Shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候Shell脚本也可以定义环境变量。
    环境变量的命名和值类型与Shell变量相同,但是需要注意系统定义的环境变量全部用大写字母命名,如PATH。下表列出了常见的环境变量。
    环境变量 说明
    PATH 指定命令的搜索路径
    PWD 当前工作目录
    HOME 当前用户的主工作目录
    SHELL 当前用户使用的Shell
    TERM 当前使用的终端类型
    USER 当前用户标识
    HOSTNAME 当前主机的名称
    LOGNAME 当前用户标识
    ENV 环境文件的名称
    [root@localhost Desktop]# $PATH
    bash: /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/master/bin: No such file or directory
    [root@localhost Desktop]# $PWD
    bash: /home/master/Desktop: is a directory
    [root@localhost Desktop]# $HOME
    bash: /root: is a directory
    [root@localhost Desktop]# $SHELL
    [root@localhost Desktop]# $TERM
    bash: xterm: command not found
    [root@localhost Desktop]# H O S T N A M E b a s h : l o c a l h o s t . l o c a l d o m a i n : c o m m a n d n o t f o u n d / / 将 s h 文 件 复 制 到 HOSTNAME bash: localhost.localdomain: command not found //将sh文件复制到 HOSTNAMEbash:localhost.localdomain:commandnotfound//shPATH目录
    [root@localhost Desktop]# cp HelloWorld.sh /usr/local/sbin
    [root@localhost Desktop]# cd /usr
    [root@localhost usr]# HelloWorld.sh
    Hello World!
    下面我们在/usr/mybin目录下创建HelloWorld.sh。
    [root@localhost /]#export PATH=KaTeX parse error: Expected 'EOF', got '#' at position 37: …@localhost usr]#̲ HelloWorld.sh …name is my name"
    jiangtao is my name
    显示结果定向至文件
    [root@localhost Desktop]# echo “it is a test file”>myfile

Shell 的另一个输出命令 printf
printf 命令模仿 C 程序库(library)里的 printf() 程序。printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。
printf 命令的语法:
printf format-string [arguments…]
参数说明:
format-string 为格式控制字符串
arguments 为参数列表
实例如下:
[root@localhost Desktop]# printf “Hello World\n”
Hello World
[root@localhost Desktop]# echo “Hello World”
Hello World
接下来,我来用一个脚本来体现printf的强大功能:
[root@localhost Desktop]# cat names.txt
#!/bin/bash
printf “%-10s %-8s %-4s\n” 姓名 性别 体重KG
printf “%-10s %-8s %-4.2f\n” 刘备 男 66.15
printf “%-10s %-8s %-4.2f\n” 关羽 男 76.32
printf “%-10s %-8s %-4.2f\n” 张飞 男 70.25
[root@localhost Desktop]# chmod +x names.txt
[root@localhost Desktop]# ./names.txt
姓名 性别 体重KG
刘备 男 66.15
关羽 男 76.32
张飞 男 70.25
%s %c %d %f都是格式替代符
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。

7.3.2 输入
read命令接收标准输入(键盘)的输入,或其他文件描述符的输入(后面在说)。得到输入后,read命令将数据放入一个标准变量中。
语法:
read [选项]
选项列表:
-p 提示语句
-n 字符个数
-t 等待时间
-s 不回显
下面是read命令的使用。
#!/bin/bash
echo -n “please input your name:”
read name
echo “hello $name,welcome to my home.”
exit 0
运行结果如下:
[root@localhost usr]# ./read.sh
please input your name:jiangtao
hello jiangtao,welcome to my home.
read 命令行中加-p参数直接指定一个提示。
#!/bin/bash
read -p “please input your name:” name
echo “hello $name,welcome to my home.”
exit 0
-t 参数指定 read 命令等待输入的秒数,当计时满时,read命令返回一个非零退出状态。一般我们使用在if语句中。
#!/bin/bash
if read -t 10 -p “输入网站名:” name
then
echo “你输入的网站名是 KaTeX parse error: Expected 'EOF', got '#' at position 114: …,并将输入的数据赋值给变量。 #̲!/bin/bash read…any”
exit 0
-s 选项能够使 read 命令中输入的数据不显示在命令终端上。
#!/bin/bash
read -s -p “请输入您的密码:” pass
echo “\n您输入的密码是 $pass”
exit 0

7.3.3 引用
引用是指字符串用某种符号括起来,以防止特殊字符被解析为其他意思。
Shell中一共有4种引用符:双引号、单引号、反引号和转义符。

  1. 弱引用
    弱引用是指双引号括起来的引用。比如,在定义一个变量后,使用echo打印出变量的时候,将它们用双引号括起来。
    [root@localhost usr]# name=“liming”
    [root@localhost usr]# echo KaTeX parse error: Expected 'EOF', got '#' at position 33: …@localhost usr]#̲ echo "name"
    liming
  2. 强引用
    强引用是指用单引号括起来的引用。单引号中的任何字符都只当作是普通字符(除了单引号本身,也就是说单引号中间无法再包含单引号,即便用转义符转义单引号也不行)。所有在单引号中间无法再包含单引号,即便用转义符转义单引号也不行)。所有在单引号中的字符都只能代表其作为字符的字面意义
    单引号和双引号在很多时候是一样的,只是要记住,在双引号中的KaTeX parse error: Expected 'EOF', got '#' at position 63: …@localhost usr]#̲ name="tom" [ro…name’
    $name

7.4 分支控制语句
7.4.1 if语句
目前编写的Shell程序都还是顺序的,即程序是从上往下一行行地执行。然而实际往往没有这么简单就能完成任务,如一些情况下需要构建分支结构以使用各种情况。与大部分编程语言一样,Shell有经典的if语句和case语句来控制分支结构,并且可以用test命令定义判断的表达式。

  1. 基本语法:
    if [ command ]; then
    符合该条件执行的语句
    fi
  2. 扩展语法:
    if [ command ]; then
    符合该条件执行的语句
    elif [ command ]; then
    符合该条件执行的语句
    else
    符合该条件执行的语句
    fi

[root@localhost usr]# cat age.sh
#!/bin/bash
read -n2 -p “How Old Are You?” age
if [ $age -ge 60 ] && [ $age -lt 99 ];then
echo “I am $age years old,I am old people”
elif [ $age -ge 40 ] && [ $age -lt 60 ];then
echo “I am $age years old,I am middle-aged people”
elif [ $age -ge 18 ] && [ $age -lt 40 ];then
echo “I am $age years old,I am young people”
else
echo “I am $age years old,I am children”
fi
exit 0

[root@localhost usr]# ./age.sh
How Old Are You?35I am 35 years old,I am young people

注意:
1、[ ]表示条件测试。注意这里的空格很重要。要注意在’[‘后面和’]'前面都必须要有空格
2、在Shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。
3、注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n “$var” ]如果var为空会出错
4、判断是不支持浮点值的
5、在默认中,运行if语句中的命令所产生的错误信息仍然出现在脚本的输出结果中
6、使用-z或者-n来检查长度的时候,没有定义的变量也为0
7、空变量和没有初始化的变量可能会对Shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试号前使用-n或者-z测试一下

常用参数:
字符串判断
-z STRING 如果STRING的长度为零则返回为真,即空是真
-n STRING 如果STRING的长度非零则返回为真,即非空是真
STRING1 如果字符串不为空则返回为真,与-n类似
STRING1 == STRING2 如果两个字符串相同则返回为真
STRING1 != STRING2 如果字符串不相同则返回为真
STRING1 < STRING2 如果 “STRING1”字典排序在“STRING2”前面则返回为真
STRING1 > STRING2 如果 “STRING1”字典排序在“STRING2”后面则返回为真

数值判断
INT1 -eq INT2 INT1和INT2两数相等返回为真 ,=
INT1 -ne INT2 INT1和INT2两数不等返回为真 ,<>
INT1 -gt INT2 INT1大于INT2返回为真 ,>
INT1 -ge INT2 INT1大于等于INT2返回为真,>=
INT1 -lt INT2 INT1小于INT2返回为真 ,<
INT1 -le INT2 INT1小于等于INT2返回为真,<=

逻辑判断
! EXPR 逻辑非,如果 EXPR 是false则返回为真
|| 用OR来合并两个条件
&& 用AND来合并两个条件

其他判断
-t FD 如果文件描述符 FD (默认值为1)打开且指向一个终端则返回为真
-o optionname 如果Shell选项optionname开启则返回为真

7.4.2 case语句
在分支控制中,if可以满足很多情况下的需求。但是当分支条件非常多时,if语句也随之变长。下面的例子在多个允许值中判断输入字符串的值。
#!/bin/bash
read -p “input your age(10,20,30):” num
if [ $num -eq 10 ];then
echo “num is 10”
elif [ $num -eq 20 ];then
echo “num is 20”
elif [ $num -eq 30 ];then
echo “num is 30”
else
echo “The Number is out of range!”
fi
在这个例子中,尽管if可以达到预期效果,但是过于繁琐。使用case语句可以很好的完成这种多分支任务。case语句多为多选择语句,可用case语句匹配一个值与一个模式,如果匹配成功,则执行相匹配的命令。
case语句语法:
case 变量 in
[ 值) 符合该条件执行的语句
;;

]
esac
使用case语句可以将上面的if案例修改如下。
#!/bin/bash
read -p “input your age(10,20,30):” num
case $num in
10) echo “num is 10”
;;
20) echo “num is 20”
;;
30) echo “num is 30”
;;
*) echo “The Age is out of range!”
;;
esac
case的语法和Java语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break。

7.4.3 循环控制语句
上一节中,介绍了分支语句以适应各种不同的需求。现在考虑另一种情况,程序并不是以执行,就能完成任务,而是需要重复执行,也就是迭代执行。这时就需要使用循环控制。Shell提供了三种循环:while循环,until循环和for循环
1 while和until循环
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为
语法:
while condition
do
command
done
下面我们计算从1加到100。
#!/bin/bash
i=1
sum=0
while [ i − l e 100 ] d o l e t s u m = s u m + i -le 100 ] do let sum=sum+ ile100]doletsum=sum+i
let i++
done
echo $sum
其中let为指定算术运算
2 until 循环
until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。一般 while 循环优于 until 循环,了解即可 。
until 语法格式:
until condition
do
command
done
condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。

以下实例我们使用 until 命令来输出 0 ~ 9 的数字:
#!/bin/bash
a=0
until [ ! $a -lt 6 ]
do
echo $a
let a=a+1
done
输出结果为:
[root@localhost usr]# ./until.sh
0
1
2
3
4
5
3 for循环
与其他编程语言类似,Shell支持for循环。
for循环一般格式为:
for var in item1 item2 … itemN
do
command1
command2

commandN
done
当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的Shell命令和语句。in列表可以包含替换、字符串和文件名。
in列表是可选的,如果不用它,for循环使用命令行的位置参数。
循环1到10顺序输出当前列表中的数字。
#!/bin/bash
for i in {1…10}
do
echo $(expr $i * 3 + 1);
done
输出结果:
[root@localhost usr]# ./for1.sh
4
7
10
13
16
4 跳出循环
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。
break命令允许跳出所有循环,这个和Java中的相同。
下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到Shell提示符下,需要使用break命令。
#!/bin/bash
while :
do
echo -n “请输入1到5之间的数字:”
read num
case n u m i n 1 ∣ 2 ∣ 3 ∣ 4 ∣ 5 ) e c h o " 你 输 入 的 数 字 是 num in 1|2|3|4|5) echo "你输入的数字是 numin12345)echo"num!"
;;
*) echo “你输入的不是1到5之间的数字!游戏结束”
break
;;
esac
done
执行以上代码,输出结果为:
[root@localhost usr]# ./break.sh
请输入1到5之间的数字:3
你输入的数字是3!
请输入1到5之间的数字:4
你输入的数字是4!
请输入1到5之间的数字:55
你输入的不是1到5之间的数字!游戏结束
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
对上面的例子进行修改:
#!/bin/bash
while :
do
echo -n “请输入1到5之间的数字:”
read num
case n u m i n 1 ∣ 2 ∣ 3 ∣ 4 ∣ 5 ) e c h o " 你 输 入 的 数 字 是 num in 1|2|3|4|5) echo "你输入的数字是 numin12345)echo"num!"
;;
*) echo “你输入的不是1到5之间的数字!”
continue
echo “游戏结束”
;;
esac
done
运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句 echo “游戏结束” 永远不会被执行。
运行结果:
[root@localhost usr]# ./continue.sh
请输入1到5之间的数字:2
你输入的数字是2!
请输入1到5之间的数字:4
你输入的数字是4!
请输入1到5之间的数字:54
你输入的不是1到5之间的数字!
请输入1到5之间的数字:23
7.5 课后习题

  1. 简述Shell变量与环境变量的区别。
  2. 以下字符串哪些可以作为合法的变量名?
    A. CentOS B. Cent OS C. Cent_OS D. Cent&OS E. 2CentOS F. CentOS2
    G. _CentOS
  3. 编写Shell脚本,打印100以内的所有质数
  4. 编写Shell脚本,使用test命令检查当前用户目录下所有文件的文件类型

实验一 磁盘分区与挂载
一、实验知识点
1.理解磁盘分区的概念
硬盘分区有三种,主磁盘分区、扩展磁盘分区、逻辑分区。
一个硬盘主分区至少有1个,最多4个,扩展分区可以没有,最多1个。且主分区+扩展分区总共不能超过4个。逻辑分区可以有若干个。
在windows下激活的主分区是硬盘的启动分区,他是独立的,也是硬盘的第一个分区,正常分的话就是C区。 在linux下主分区和逻辑分区都可以用来放系统,引导os开机,grub会兼容windows系统开机启动。
分出主分区后,其余的部分可以分成扩展分区,一般是剩下的部分全部分成扩展分区,也可以不全分,那剩的部分就浪费了。
但扩展分区是不能直接用的,他是以逻辑分区的方式来使用的,所以说扩展分区可分成若干逻辑分区。他们的关系是包含的关系,所有的逻辑分区都是扩展分区的一部分。
在linux中第一块硬盘分区为hda分区,主分区编号为hda1-4,逻辑分区从5开始。
硬盘的容量=主分区的容量+扩展分区的容量
扩展分区的容量=各个逻辑分区的容量之和
主分区也可成为“引导分区”,会被操作系统和主板认定为这个硬盘的第一个分区。所以C盘永远都是排在所有磁盘分区的第一的位置上。
MBR(主引导记录)的分区表(主分区表)只能存放4个分区,如果要分更多的分区的话就要一个扩展分区表(EBR),扩展分区表放在一个系统ID为0x05的主分区上,这个主分区就是扩展分区,扩展分区能可以分若干个分区,每个分区都是个逻辑分区
2、Linux命令
命令 说明
fdisk fdisk是一个创建和维护分区表的程序,它兼容DOS类型的分区表、BSD或者SUN类型的磁盘列表。
mkfs mkfs命令用于在特定的分区上建立 linux 文件系统。也就是在分区上格式化系统。

二、实验步骤
步骤1:在VMware虚拟机中新建一块虚拟硬盘,取名work。
(1)右击虚拟机,选择“设置”菜单,打开“虚拟机设置”窗体。双击硬盘(SCSI)

(2)单击左下角的添加按钮,打开“添加硬件向导”窗体,单击下一步按钮。

(3)选择磁盘类型和创建新虚拟磁盘。

(4) 指定磁盘容量,将磁盘大小设置为5GB,选择磁盘存储为单个文件

(5)将名称改为work.vmdk,单击完成按钮,完成磁盘的新建

创建了一个新磁盘后,当前系统有两个硬盘。需要对sdb2硬盘进行分区和格式化。

步骤2:使用fdisk命令的l选项查看硬盘分区
[root@localhost Desktop]# fdisk -l

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000b9729

Device Boot Start End Blocks Id System
/dev/sda1 * 1 39 307200 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 39 2358 18631680 83 Linux
/dev/sda3 2358 2611 2031616 82 Linux swap / Solaris

Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

当前虚拟机有两个磁盘,sda为原来的磁盘,有3个分区。sdb为刚创建的磁盘,没有分区。

步骤3:对新建的磁盘sdb进行分区
[root@localhost Desktop]# fdisk /dev/sdb

输入m,查看帮助
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition’s system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
选择n,添加一个新的分区
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
p是主分区,e是扩展分区。第一个主分区为sdb1,大小为2GB。我们现在选择创建主分区。
Partition number (1-4): 1
First cylinder (1-652, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-652, default 652): +2G
创建好了主分区sdb1,接着创建一个扩展分区sdb2。
Command (m for help): n
Command action
e extended
p primary partition (1-4)
e
Partition number (1-4): 2
First cylinder (263-652, default 263):
Using default value 263
Last cylinder, +cylinders or +size{K,M,G} (263-652, default 652):
// 不填表示默认为剩下的所有空间都分配给sdb2
Using default value 652
查看所有分区,打印分区表
Command (m for help): p
Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x06e640c1
Device Boot Start End Blocks Id System
/dev/sdb1 1 262 2104483+ 83 Linux
/dev/sdb2 263 652 3132675 5 Extended
扩展分区sdb2创建完成,因为扩展分区并不能使用,所以接着创建一个逻辑分区,逻辑分区占整个扩展分区。
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (263-652, default 263):
Using default value 263
Last cylinder, +cylinders or +size{K,M,G} (263-652, default 652):
Using default value 652
查看所有分区,打印分区表
Command (m for help): p

Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x06e640c1

Device Boot Start End Blocks Id System
/dev/sdb1 1 262 2104483+ 83 Linux
/dev/sdb2 263 652 3132675 5 Extended
/dev/sdb5 263 652 3132643+ 83 Linux
现在共有3个分区,主分区sdb1,扩展分区sdb2,逻辑分区sdb5。输入w退出。
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
You have mail in /var/spool/mail/root

步骤4:mkfs格式化分区
使用mkfs命令格式主分区sdb1,格式化文件系统为ext4。
[root@localhost Desktop]# mkfs -t ext4 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131648 inodes, 526120 blocks
26306 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=541065216
17 block groups
32768 blocks per group, 32768 fragments per group
7744 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912

Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
使用mkfs命令格式逻辑分区sdb5,格式化文件系统为ext3。
[root@localhost Desktop]# mkfs -t ext3 /dev/sdb5
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
195840 inodes, 783160 blocks
39158 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=805306368
24 block groups
32768 blocks per group, 32768 fragments per group
8160 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912

Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 28 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

步骤5:将sdb1和sdb5挂载到/mnt目录下,并查看挂载结果。
[root@localhost Desktop]# mount /dev/sdb1 /mnt/
[root@localhost Desktop]# mount /dev/sdb5 /mnt/
[root@localhost Desktop]# mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext=“system_u:object_r:tmpfs_t:s0”)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
vmware-vmblock on /var/run/vmblock-fuse type fuse.vmware-vmblock (rw,nosuid,nodev,default_permissions,allow_other)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/dev/sdb5 on /media/e9dc9b18-b765-49c6-95af-c1651f6d16a1 type ext3 (rw,nosuid,nodev,uhelper=udisks)
/dev/sdb1 on /mnt type ext4 (rw)
/dev/sdb5 on /mnt type ext3 (rw)
最后两行说明sdb1和sdb5已经挂载成功。

另外可以使用umount卸载已经挂载到mnt目录下的逻辑分区sdb5
[root@localhost Desktop]# umount /dev/sdb5

实验二 Linux用户权限管理
一、实验知识点
1.理解用户、组、权限
2.Linux命令
命令 说明
useradd 创建用户帐号
groupadd 创建一个新的用户组
chgrp 用于变更文件或目录的所属群组
chmod Linux/Unix 的文件调用权限分为三级 : 文件拥有者、群组、其他。利用 chmod 可以藉以控制文件如何被他人所调用。
chown chown将指定文件的拥有者改为指定的用户或用户组
3.实验功能
打造前程公司(dzqc Co.,Ltd.)有职教部、市场部、就业部、行政财务部三个部门,每个部门有多名员工,部门和员工具体信息见下表。
部门 部门英文缩写 员工
职教部 train ZhaoHuaWei Jiangtao Sunlei
市场部 market LiuBei CaoCao
就业部 mbie Tom Jack
行政财务部 fad Mike
具体要求如下:

  1. 为各部门创建用户组,部门各员工创建用户。
  2. 各部门和员工创建各自的工作目录,每个部门一个独立的目录,每个员工在所在的部门目录下有一个保存自己文件的目录。
  3. 所有的目录和文件保存在统一的一个目录下。
  4. 部门之间不能相互访问。
  5. 同部门不同员工之间可以查看各自目录中的内容,但是不能修改,用户仅能修改自己目录的内容。
    二、实验步骤
    以下步骤需要使用root用户。
    步骤1:创建用户组以及创建属于各自用户组的用户
    [root@localhost /]# groupadd train
    [root@localhost /]# groupadd market
    [root@localhost /]# groupadd mbie
    [root@localhost /]# groupadd fad
    [root@localhost /]# useradd -g train zhaohuawei
    [root@localhost /]# useradd -g train jiangtao
    [root@localhost /]# useradd -g train sunlei
    [root@localhost /]# useradd -g market liubei
    [root@localhost /]# useradd -g market caocao
    [root@localhost /]# useradd -g mbie tom
    [root@localhost /]# useradd -g mbie jack
    [root@localhost /]# useradd -g fad mike
    步骤2:在/usr目录下创建dzqc目录,在dzqc目录下创建train、market、mbie、fad目录
    [root@localhost /]# cd /usr
    [root@localhost usr]# mkdir dzqc
    [root@localhost usr]# cd dzqc
    [root@localhost dzqc]# mkdir train market mbie fad
    [root@localhost dzqc]# ls -l
    total 16
    drwxr-xr-x. 2 root root 4096 May 6 05:31 fad
    drwxr-xr-x. 2 root root 4096 May 6 05:31 market
    drwxr-xr-x. 2 root root 4096 May 6 05:31 mbie
    drwxr-xr-x. 2 root root 4096 May 6 05:31 train
    步骤3:新创建的4个目录都属于root用户组,我们需要将它们修改为各自所属的部门组。
    [root@localhost dzqc]# chgrp fad fad
    [root@localhost dzqc]# chgrp market market
    [root@localhost dzqc]# chgrp mbie mbie
    [root@localhost dzqc]# chgrp train train
    [root@localhost dzqc]# ls -l
    total 16
    drwxr-xr-x. 2 root fad 4096 May 6 05:31 fad // 文件所属组已经发生变化
    drwxr-xr-x. 2 root market 4096 May 6 05:31 market
    drwxr-xr-x. 2 root mbie 4096 May 6 05:31 mbie
    drwxr-xr-x. 2 root train 4096 May 6 05:31 train
    步骤4:不同的用户组之间不可以访问其他组的目录
    我们可以看到其他用户可以对fad目录有r(读)和x(执行)权限。我们希望不同部门,也就是不同的用户组之间不可以访问其他组的目录。例如market、mbie、train用户组的用户不能访问fad目录中的文件。
    [root@localhost dzqc]# chmod o-rx fad
    [root@localhost dzqc]# chmod o-rx market
    [root@localhost dzqc]# chmod o-rx mbie
    [root@localhost dzqc]# chmod o-rx train
    [root@localhost dzqc]# ls -l
    total 16
    drwxr-x—. 2 root fad 4096 May 6 05:31 fad
    drwxr-x—. 2 root market 4096 May 6 05:31 market
    drwxr-x—. 2 root mbie 4096 May 6 05:31 mbie
    drwxr-x—. 2 root train 4096 May 6 05:31 train
    步骤5:创建用户目录
    每个员工在所属部门目录下拥有一个目录,下面我们进行创建用户目录。
    [root@localhost dzqc]# ls
    fad market mbie train
    [root@localhost dzqc]# cd train
    [root@localhost train]# mkdir zhaohuawei jiangtao sunlei
    [root@localhost train]# cd …/market
    [root@localhost market]# mkdir liubei caocao
    [root@localhost market]# cd …/mbie
    [root@localhost mbie]# mkdir tom jack
    [root@localhost mbie]# cd …/fad
    [root@localhost fad]# mkdir mike
    步骤6:修改目录所属用户。
    如将zhaohuawei目录所属用户改为zhaohuawei用户。
    [root@localhost dzqc]# cd train
    [root@localhost train]# ls
    jiangtao sunlei zhaohuawei
    [root@localhost train]# chown jiangtao jiangtao // chown [选项] 用户名 文件名
    [root@localhost train]# chown sunlei sunlei
    [root@localhost train]# chown zhaohuawei zhaohuawei
    [root@localhost train]# ls -l
    total 12
    drwxr-xr-x. 2 jiangtao root 4096 May 6 06:43 jiangtao
    drwxr-xr-x. 2 sunlei root 4096 May 6 06:43 sunlei
    drwxr-xr-x. 2 zhaohuawei root 4096 May 6 06:43 zhaohuawei
    步骤7:用户目录修改所属组
    我们可以看到jiangtao目录所属用户是jiangtao,属于root组。下面我们需要将jiangtao、sunlei、zhaohuawei目录更改所属组train。
    [root@localhost train]# chown :train jiangtao
    [root@localhost train]# chown :train sunlei
    [root@localhost train]# chown :train zhaohuawei
    [root@localhost train]# ls -l
    total 12
    drwxr-xr-x. 2 jiangtao train 4096 May 6 06:43 jiangtao
    drwxr-xr-x. 2 sunlei train 4096 May 6 06:43 sunlei
    drwxr-xr-x. 2 zhaohuawei train 4096 May 6 06:43 zhaohuawe
    步骤8:用户目录删除其他用户的权限
    jiangtao,sunlei,zhaohuawei目录的其他用户的权限是r(读)-x(执行),删除所有权限。
    [root@localhost train]# chmod o-rx jiangtao
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值