Linux学习笔记

Linux学习笔记

一、Linux基本简介

1.1 Linux的应用领域

1.1.1 个人桌面应用领域

此领域是传统linux应用最薄弱的环节,传统linux由于界面简单、操作复杂、应用软件少的缺点,一直被windows所压制,但近些年来随着ubuntu、fedora[fɪˈdɔ:rə] 等优秀桌面环境的兴起,同时各大硬件厂商对其支持的加大,linux在个人桌面领域的占有率在逐渐的提高。

1.1.2 服务器应用领域

linux在服务器领域的应用是最强的。
linux免费、稳定、高效等特点在这里得到了很好的体现,近些年来linux服务器市场得到了飞速的提升,尤其在一些高端领域尤为广泛。

1.1.3 嵌入式应用领域

linux运行稳定、对网络的良好支持性、低成本,且可以根据需要进行软件裁剪,内核最小可以达到几百KB等特点,使其近些年来在嵌入式领域的应用得到非常大的提高。

主要应用:机顶盒、数字电视、网络电话、程控交换机、手机、PDA、智能家居、智能硬件等都是其应用领域。以后在物联网中应用会更加广泛。

1.2 学习LINUX的阶段

linux是一个开源、免费的操作系统,其稳定性、安全性、处理多并发已经得到业界的认可,目前很多中型,大型甚至是集群项目都在使用linux,很多软件公司考虑到开发成本都首选linux,在中国软件公司得到广泛的使用。

我个人认为学习linux流程为:
第 1 阶段:linux环境下的基本操作命令,包括 文件操作命令(rmmkdirchmod,chown) 编辑工具使用(vivim)linux用户管理(useradduserdelusermod)等
第 2 阶段:linux的各种配置(环境变量配置,网络配置,服务配置)
第 3 阶段:linux下如何搭建对应语言的开发环境(大数据,JavaEE,Python等)
第 4 阶段:能编写shell脚本,对Linux服务器进行维护。
第 5 阶段:能进行安全设置,防止攻击,保障服务器正常运行,能对系统调优。
第 6 阶段:深入理解Linux系统(对内核有研究),熟练掌握大型网站应用架构组成、并熟悉各个环节的部署和维护方法。

1.3 LINUX的学习方法和建议

1
2
3
4
5
6
7
1 ) 高效而愉快的学习
2 ) 先建立一个整体框架,然后细节
3 ) 不需要掌握所有的Linux指令,要学会查询手册和百度
4 ) 先knowhow,再knowwhy
5 ) 计算机是一门”做中学” 的学科 ,不是会了再做,而是做了才会.
6 ) 适当的囫囵吞枣
7 ) Linux不是编程,重点是实际操作,各种常用指令要玩的溜

二、LINUX 入门

2.1 LINUX介绍

1 ) Linux怎么读 【里纽克斯,利尼克斯,里纳克斯】
2 ) Linux是一款操作系统,免费,开源,安全,高效,稳定, 处理高并发非常强悍,现在很多的企业级的项目都部署到Linux/unix服务器运行。
3 ) Linux创始人

linus

4 ) Linux的吉祥物

Tux

5 ) Linux的主要的发行版:Ubuntu、RedHat、CentOS等,Linux内核源码下载地址,可以将源码下载下来查看。

2.2Unix与Linux的关系

2.2.1 Unix来源

Unix来源

2.2.2 Linux来源

Richard提出了伟大的GNU计划,大大促进了开源事业。

Linux来源

2.2.3 Linux与Unix关系

Linux与Unix关系

2.2.4 Linux与Windows关系

Linux与Windows关系

三、VM 和 LINUX 系统 (CENTOS) 安装

3.1 安装VM和CENTOS

学习Linux需要一个环境,我们需要创建一个虚拟机,然后在虚拟机上安装一个Centos系统来学习。

1 )先安装virtual machine 15.5
2 )再安装Linux(CentOS 7.6 \ CentOS 8.1)
3 )原理示意图,这里我们画图说明一下 VM 和 CentOS的关系。

3.2 安装步骤

1 ) 去BIOS里修改设置开启虚拟化设备支持
2 ) 安装虚拟机软件(VM 15.5)
3 ) 创建虚拟机(空间)
4 ) 安装系统(CentOS 6.8 )

3.3 虚拟机网络连接三种方式

虚拟机网络连接有三种方式:桥接模式、NAT模式和主机模式。

1.桥接模式:虚拟机系统可以与外部系统互相通讯,但是由于桥接模式占用与物理机同一级的ip地址,所以如果当前局域网ip地址耗尽,容易造成ip冲突

2.NAT模式:网络地址转换模式,虚拟机系统可以向外部系统发消息,但是外部系统不可以向虚拟机系统发消息(如果没有内网穿透相关功能的话),NAT模式不会造成ip冲突。

3.主机模式:可以成为单机模式,不与外部系统连接网络,是一个独立的系统。

3.4 虚拟机克隆

如果已经安装了一台Linux操作系统,此时还需要更多,这时可以使用虚拟机克隆操作,有以下两种方式:

方式1:直接拷贝一份安装好的虚拟机文件

方式2:使用vmware的克隆操作(需要先关闭Linux系统)

3.5 虚拟机快照

如果在使用虚拟机系统的时候(比如Linux),如果你想回到原先的某一个状态,也就是说你担心可能有些误操作造成系统异常,需要回到原先某个正常运行的状态,vmware特提供了这样的功能,叫快照管理。

1
2
3
4
5
应用实例:
1.安装好系统以后,先做一个快照A
2.进入系统,创建一个文件夹,在保存一个快照B
3.回到系统刚刚安装好的状态,即快照A
4A试试看,是否还能再次回到快照B(答案是肯定的)

需要注意的是,快照底层是使用指针实现的。

3.6 虚拟机迁移删除

虚拟机系统的本质就是文件。因此虚拟机系统的迁移很方便,可以把安装好的虚拟机系统这个文件夹整体拷贝或者剪切到另外位置使用。同样地,虚拟机系统删除也很简单,用vmware进行移除(菜单 -> 从磁盘删除),或者直接手动删除虚拟系统对应的文件夹即可。

3.7 vmtools

3.7.1 vmtools作用

  1. vmtools安装后,可以让我们在windows下跟好的管理vm虚拟机
  2. 可以设置windows和centos的共享文件夹

3.7.2 vmtools的安装步骤

1
2
3
4
5
6
7
8
9
1.进入centos
2.点击vm菜单的 -> install vmwaretools
3.centos会出现一个vm的安装包,xx.tar.gz
4.拷贝到/opt,使用解压命令tar -zxvf xx.tar.gz, 得到一个安装文件
5.进入该vm解压的目录 ,该文件在/opt目录下
6.安装 ./vmware-install.pl
7.全部使用默认设置即可
8.需要reboot重新启动即可生效
9.注意:安装vmtools,需要有gcc

3.7.3 使用vmtools来设置windows和linux的共享文件夹

1.在windows中新建一个文件夹

2.在vmware中设置共享文件夹

3.在Centos的/mnt/hgfs/下可以找到共享文件夹

四、Linux 的目录结构

4.1 基本介绍

linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”,然后在此目录下再创建其他的目录。

深刻理解linux树状文件目录是非常重要的,这里我给大家说明一下,记住一句经典的话:在Linux世界里,一切皆文件。硬件都当做文件来管理。

4.2 目录结构的具体介绍

  • /bin: 是Binary的缩写,这个目录存放着最经常使用的命令(命令其实就是一个个可执行文件)。
  • /sbin:s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。
  • /home:存放普通用户的主目录,在Linux中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。(对应MacOS中的/Users目录)
  • /root:该目录为系统管理员,也称作超级权限者的用户主目录。
  • /lib:系统开机所需要最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
  • /lost+found:这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
  • /etc:所有的系统管理所需要的配置文件和子目录,比如安装mysql数据库 my.conf。
  • /boot:存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。
  • /proc:这个目录是一个虚拟的目录,它是系统内存的映射,访问这个目录来获取系统信息。该目录不要动。
  • /srv:service的缩写,该目录存放一些服务启动之后需要提供的数据。该目录不要动。
  • /sys:这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统sysfs。该目录不要动。
  • /tmp:这个目录是用来存放一些临时文件的。
  • /dev:类似windows的设备管理器,把所有的硬件文件的形式存储
  • /media:linux系统会自动识别一些设备,例如U盘光驱等等,当识别后,linux会把识别的设备挂载到这个目录下(Linux把这些设备映射成文件进行管理)。
  • /mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂载在/mnt/上,然后进入该目录就可以查看里面的内容了。
  • /opt:这是给主机额外安装软件所摆放的目录,如安装ORACLE数据库就可放到该目录下。默认为空。
  • /usr/local:这是另一个给主机额外安装软件所安装的目录,一般是通过编译源码的方式安装的程序。
  • /var:这个目录中存放着在不断扩充着的东西,习惯将经常被修改的目录放在这个目录下,包括各种日志文件。
  • /selinux:SELinux是一种安全子系统,它能控制程序只能访问特定文件。

4.2.1 /opt & /usr/local & /usr 区别

/opt这里主要存放那些可选的程序。你想尝试最新的firefox测试版吗?那就装到/opt目录下吧,这样,当你尝试完,想删掉firefox的时候,你就可以直接删除它,而不影响系统其他任何设置。安装到/opt目录下的程序,它所有的数据、库文件等等都是放在同个目录下面。相当于windows中的D:/Software。

/usr/local这里主要存放那些手动安装的软件,即不是通过apt-get等自动安装的软件,/usr/local目录下的一些子目录往往都是被加入到PATH环境变量中的。 相当于windows中的C:/Program Files

/usr:系统级的目录,可以理解为C:/Windows/,/usr/lib理解为C:/Windows/System32。

/usr/src:系统级的源码目录。/usr/local/src:用户级的源码目录。

4.3 Linux目录总结一下

  1. linux的目录中有且只要一个根目录 /
  2. linux的各个目录存放的内容是规划好,不用乱放文件。
  3. linux是以文件的形式管理我们的设备,因此linux系统,一切皆为文件。

linux的各个文件目录下存放什么内容,必须有一个认识,你脑海中应该有一颗linux目录树

五、远程登录Linux系统

5.1 SSH 三步解决免密登录

5.1.1 客户端生成公私钥

本地客户端生成公私钥:(一路回车默认即可)

1
ssh-keygen -t rsa

上面这个命令会在用户目录. ssh 文件夹下创建公私钥

1
cd ~/.ssh
1
ls

下创建两个密钥:

  1. id_rsa (私钥)
  2. id_rsa.pub (公钥)

5.1.2 上传公钥到服务器

这里测试用的服务器地址为:192.168.235.22
用户为:root

1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.235.22

上面这条命令是写到服务器上的 ssh 目录下去了

1
cd ~/.ssh
1
cat authorized_keys

可以看到客户端写入到服务器的 id_rsa.pub (公钥)内容。

5.1.3 测试免密登录

客户端通过 ssh 连接远程服务器,就可以免密登录了。

1
ssh root@192.168.235.22

5.2 管理多个私钥

~/.ssh/config中进行配置,配置原则如下所示:

Host是别名

HostName是ip地址或者域名

User是登录用户名

IdentityFile是私钥地址

PerferredAuthentications是首选身份验证方式

六、Vi 和 Vim 编辑器

6.1 Vi和Vim的基本介绍

所有的 Linux 系统都会内建 vi 文本编辑器。

Vim 具有程序编辑的能力,可以看做是Vi的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

6.2 Vi和Vim的三种常见模式

6.2.1 正常模式

在正常模式下,我们可以使用快捷键。
以 vim 打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中,你可以使用『上下左右』按键来移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容, 也可以使用『复制、贴上』来处理你的文件数据。

6.2.2 插入模式/编辑模式

在模式下,程序员可以输入内容。按下i,I,o,O,a,A,r,R等任何一个字母之后才会进入编辑模式, 一般来说按i即可。

6.2.3 命令行模式

在这个模式当中,可以提供你相关指令,完成读取、存盘、替换、离开 vim 、显示行号等的动作则是在此模式中达成的!

6.4 Vi和Vim三种模式的相互转化图

Vi和Vim三种模式的互相转换图

6.5 Vi和Vim的快捷键键盘一览图

Vi和Vim的快捷键键盘一览图

Vi和Vim的快键键包罗万象,遇到具体需求可以查看Vim Cheat Sheet或者在linux命令行输入vimtutor查看vim官方教程。

七、关机、重启和用户登录注销

7.1 关机&重启命令

1
2
3
4
5
6
7
shutdown      : 相当于 shutdown -h 1
shutdown-h now: 表示立即关机
shutdown-h 1 : 表示 1 分钟后关机
shutdown-r now: 立即重启
halt : 效果等价于关机
reboot : 就是重启系统。
sync :把内存的数据同步到磁盘

注意细节:

1.当我们关机或者重启时,都应该先执行以下sync指令,把内存的数据写入磁盘,防止数据丢失。

2.目前的shutdown/reboot/halt等命令君已经在关机前进行了sync。

7.2 用户登录和注销

1 ) 登录时尽量少用root帐号登录,因为它是系统管理员,最大的权限,避免操作失误。可以利用普通用户登录,登录后再用su -s命令来切换成系统管理员身份。

2 ) 在提示符下输入 logout 即可注销用户。(在root用户下使用会退回到上次的普通用户上,在普通用户上使用会退出系统)

使用细节:
1.logout 注销指令在图形运行级别无效,在 运行级别 3 下有效.
2.运行级别这个概念,后面给大家介绍

八、用户管理

8.1 基本介绍

Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。并且Linux的用户需要至少要属于一个组,每一个用户都对应一个自己的家目录。

8.2 添加用户

8.2.1 基本语法

1
useradd [选项] 用户名

8.2.2 实际案例

添加一个用户jyg,useradd jyg,并且默认该用户的家目录在/home/jyg

8.2.3 细节说明

  1. 当创建用户成功后,会自动的创建和用户同名的家目录
  2. 也可以通过 useradd -d 指定目录 新的用户名,给新创建的用户指定家目录
  3. 以什么用户身份登录,初始目录就在该用户的家目录下

8.3 给用户指定或者修改密码

8.3.1 基本语法

1
passwd 用户名 #如果缺省用户名,则修改当前用户密码

8.2.2 实际案例

给用户jyg更改密码,# passwd jyg

8.4 删除用户

8.4.1 基本语法

1
userdel 用户名

8.4.2 应用案例

  1. 删除用户jyg,但是要保留家目录 userdel jyg

  2. 删除用户jyg以及用户主目录 userdel -r jyg

主要注意的是,在删除用户时,我们一般不会将家目录删除。

8.5 查询用户信息

8.5.1 基本语法

1
id 用户名

8.5.2 应用实例

请查询root 信息 id root

8.5.3 细节说明

当用户不存在时,返回no such user

8.6 切换用户

8.6.1 介绍

在操作Linux中,如果当前用户的权限不够,可以通过 su - 用户名 指令,切换到高权限用户,比如root

8.6.2 基本语法

1
su - 用户名

8.6.3 细节说明

  1. 从权限高的用户切换到权限低的用户,不需要输入密码,反之需要。

  2. 当需要返回到原来用户时,使用exit指令

8.7 查看当前用户 & 登录信息

8.7.1 基本语法

1
whoami / who am i #两者不同,whoami是指当前用户,who am i是指登录信息(登录用户,登录信息,登录ip)

8.8 用户组

8.8.1 介绍

类似于角色,系统可以对有共性的多个用户进行统一的管理。

8.8.2 增加组

1
groupadd 组名

8.8.3 删除组

1
groupdel 组名

8.9 增加用户时直接加上组

8.9.1 基本语法

1
useradd -g 用户组 用户名

需要注意的是,如果增加用户,但是没有指定用户组,那么系统会生成一个和该用户同名的用户组,并把该用户放入同名用户组中。

8.9.2 案例演示

1
2
增加一个用户 zwj, 直接将他指定到 wudang
useradd -g wudang zwj

8.10 修改用户的组

8.10.1 基本语法

1
usermod -g 用户组 用户名

8.10.2 案例演示

1
2
3
创建一个shaolin组,让将zwj 用户修改到shaolin
gourpadd shaolin
usermod -g shaolin zwj

8.11 用户和组相关文件

8.11.1 /ETC/PASSWD 文件

1
2
用户(user)的配置文件,记录用户的各种信息
每行的含义:用户名:口令(被加密):用户标识号:组标识号:注释性描述:主目录:登录Shell

8.11.2 /ETC/SHADOW文件

1
2
口令的配置文件
每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

8.11.3 /ETC/GROUP文件

1
2
组(group)的配置文件,记录Linux包含的组的信息
每行含义:组名:口令:组标识号:组内用户列表

组密码的作用:非本用户组的用户想切换到本用户组身份时,可以通过密码保证安全性。如果没有设置组密码,则只有属于本用户组的用户能够切换到本用户组的身份。

九、实用指令

9.1 指定运行级别

1
2
3
4
5
6
7
8
9
运行级别说明:
0 :关机
1 :单用户【找回丢失密码】
2 :多用户状态没有网络服务
3 :多用户状态有网络服务
4 :系统未使用保留给用户
5 :图形界面
6 :系统重启
常用运行级别是 3 5

要修改默认的运行级别:

1
2
3
4
5
6
7
8
9
10
11
在centos7以前,可改文件/etc/inittab的id: 5 :initdefault:这一行中的数字

在Centos7以后,在/etc/inittab文件中,进行了简化,如下:
muti-user.target: analogous to runlevel 3
graphical.target: analogous to runlevel 5

# To view current default target, run:
systemctl get-default

# To set a default target, run:
systemctl set-default [TARGET.target] # 例如:systemctl set-default graphical.target

9.2 切换到指定运行级别的指令

9.2.1 基本语法

1
init [012356]

9.2.2 应用实例

1
2
3
4
案例 1 : 通过init 来切换不同的运行级别,比如动 5 - > 3 , 然后关机
init 3
init 5
init 0

9.2.3 面试题

1
2
如何找回root密码,如果我们不小心,忘记root密码,怎么找回。
思路: 进入到单用户模式,然后修改root密码。因为进入单用户模式,root不需要密码就可以登录,随后使用passwd指令修改root密码。

9.3 帮助指令

9.3.1 介绍

当我们对某个指令不熟悉时,我们可以使用Linux提供的帮助指令来了解这个指令的使用方法。

9.3.2 man 命令

基本语法

1
man [命令或配置文件](功能描述:获得帮助信息)

应用实例

案例:查看ls命令的帮助信息

1
man ls

-a : 不忽略以 . 开头的文件

主要注意的是,[]是可选项的意思,而且可以组合使用且无顺序要求

9.3.3 help指令

基本语法

1
help 命令 (功能描述:获得shell内置命令的帮助信息,只能用于内部命令,不能用于外部命令)

应用实例

案例:查看cd命令的帮助信息

1
help cd

9.3.4 info命令

基本语法

1
info 命令 # info 得到的信息比 man 还要多

注意:由于help支持命令少,推荐使用man或者info命令。

9.4 文件目录类

9.4.1 pwd 指令

基本语法

1
pwd (功能描述:显示当前工作目录的绝对路径)

9.4.2 ls指令

基本语法

1
ls [选项] [目录或是文件]

常用选项

  • a :显示当前目录所有的文件和目录,包括隐藏的。
  • l :以列表的方式显示信息

9.4.3 cd 指令

基本语法

1
cd [参数] (功能描述:切换到指定目录)
1
2
cd~ / cd :回到自己的家目录
cd.. :回到当前目录的上一级目录

9.4.4 mkdir指令

基本语法:

1
mkdir [选项] 要创建的目录

常用选项:

  • p :创建多级目录

9.4.5 rmdir指令

rmdir指令删除空目录

基本语法:

1
rmdir [选项] 要删除的空目录

需要注意的是:rmdir指令只能删除空目录,只能使用rm -rf

9.4.6 touch指令

touch指令创建空文件

基本语法

1
touch 文件名

9.4.7 cp指令

cp 指令拷贝文件到指定目录

基本语法:

1
2
cp [选项] source dest # source、dest可以是文件也可以是文件夹
\cp [选项] source dest # 直接覆盖,不提示是否覆盖

常用选项:

  • r :递归复制整个文件夹

9.4.8 rm指令

rm 指令移除文件或目录

基本语法

1
rm [选项] 要删除的文件或目录

常用选项

  • r :递归删除整个文件夹
  • f : 强制删除不提示

9.4.9 mv指令

mv 移动文件与目录或重命名

基本语法

1
2
mv oldNameFile           newNameFile          (功能描述:重命名)
mv /oldFolder/movefile /targetFolder (功能描述:移动文件)

案例移动整个目录

1
mv oldFolder /targetFolder

9.4.10 cat指令

cat 查看文件内容,是以只读的方式打开。

基本语法

1
cat [选项] 要查看的文件

常用选项

  • n :显示行号

使用细节
cat 只能浏览文件,而不能修改文件,为了浏览方便,一般会带上 管道命令 | more

1
cat 文件名 | more

9.4.11 more指令

more指令是一个基于VI编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。more指令中内置了若干快捷键,详见操作说明。

基本语法

1
more 要查看的文件

操作说明

快捷键 功能
space 向下翻一页
return 向下翻一行
q 退出
b 向上翻一页
z 向下翻一页
= 输出当前行号
:f 输出文件名和当前行号

9.4.12 less指令

less指令用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更加强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。

基本语法

1
less 文件

操作说明

快捷键 功能
space 向下翻一页
return 向下翻一行
q 退出
b 向上翻一页
z 向下翻一页
= 显示当前页面行号范围
:f 显示当前页面行号范围

推荐使用less而不是more

9.4.13 >指令 和 >>指令

>命令是输出重定向:会将原来的文件内容覆盖

>>命令是追加:不会覆盖原来文件的内容,而是追加到文件的尾部。

基本语法

1
2
3
4
5
ls -l > 文件      (功能描述:列表的内容写入文件a.txt中(覆盖写))
说明:ls-l>a.txt, 将ls-l 的显示的内容覆盖写入到a.txt文件,如果该文件不存在,就创建该文件。
ls -al >> 文件 (功能描述:列表的内容追加到文件aa.txt的末尾)
cat 文件1 > 文件2 (功能描述:将文件 1 的内容覆盖到文件 2 )
echo "内容" >> 文件

9.4.14 echo指令

echo输出内容到控制台。

基本语法

1
echo [选项] [输出内容]

应用实例

1
2
3
echo $PATH        #输出环境变量
echo $HOSTNAME #输出主机名
echo hello world #输出hello world

9.4.15 head指令

head用于显示文件的开头部分内容,默认情况下head指令显示文件的前 10 行内容

基本语法

1
2
head 文件 (功能描述:查看文件头 10 行内容)
head-n 5 文件 (功能描述:查看文件头 5 行内容, 5 可以是任意行数)

9.4.16 tail指令

tail用于输出文件中尾部的内容,默认情况下tail指令显示文件的后 10 行内容。

基本语法

1
2
3
tail 文件       (功能描述:查看文件后 10 行内容)
tail -n 5 文件 (功能描述:查看文件后 5 行内容, 5 可以是任意行数)
tail -f 文件 (功能描述:实时追踪该文档的所有更新,工作经常使用)

9.4.17 ln指令

软链接也叫符号链接,类似于windows里的快捷方式,主要存放了链接其他文件的路径

基本语法

1
ln -s  [原文件或目录] [软链接名] (功能描述:给原文件创建一个软链接)

应用实例
案例 1 : 在/home 目录下创建一个软连接 linkToRoot,连接到 /root 目录

1
ln -s /root ./linkToRoot

案例 2 : 删除软连接 linkToRoot

1
rm ./linkToRoot

细节说明
当我们使用pwd指令查看目录时,仍然看到的是软链接所在目录。

9.4.18 history指令

查看已经执行过历史命令,也可以执行历史指令

基本语法

1
history (功能描述:查看已经执行过历史命令)

应用实例
案例 1 : 显示所有的历史命令

1
history

案例 2 : 显示最近使用过的 10 个指令。

1
history 10

案例 3 :执行历史编号为 5 的指令

1
!5

9.5 时间日期类

9.5.1 date指令-显示当前日期

基本语法

1
2
3
4
5
date     (功能描述:显示当前时间)
date +%Y (功能描述:显示当前年份)
date +%m (功能描述:显示当前月份)
date +%d (功能描述:显示当前是哪一天)
date "+%Y-%m-%d%H:%M:%S"(功能描述:显示年月日时分秒)

9.5.2 date指令-设置日期

基本语法

1
2
3
date -s 字符串时间     (字符串时间格式为:“2018-10-10 11:22:22”,此时日期和时间用双引号引起来)
date -s 14:31:00 (设置时间)
date -s 20100405 (设置日期)

9.5.3 cal指令

查看日历指令

基本语法

1
2
cal [选项] (功能描述:不加选项,显示本月日历)
cal 2020 (功能描述:显示2020年日历)

9.6 搜索查找类

9.6.1 find指令

find指令将从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端。

基本语法

1
find [搜索范围] [选项]

选项

选项 功能
-name <文件名> 按照指定的文件名查找模式查找文件
-user <用户名> 查找属于指定用户名所有文件
-size <文件大小> 按照指定的文件大小查找文件

应用实例
案例 1 : 按文件名:根据名称查找/home 目录下的hello.txt文件

1
find /home -name hello.txt

案例 2 :按拥有者:查找/opt目录下,属于nobody的文件

1
find /opt -user nobody

案例 3 :查找整个linux系统下大于 20 m的文件(+n 大于 -n小于 n等于)

1
find / -size +200M

案例 4:查询 / 目录下,所有 .txt的文件

1
find / -name *.txt

9.6.2 locate指令

locate指令可以快速定位文件路径。locate指令利用事先建立的系统中所有文件名称及路径的locate数据库实现快速定位给定的文件。Locate指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新locate时刻。

基本语法

1
locate 搜索文件

特别说明
由于locate指令基于数据库进行查询,所以第一次运行前,必须使用updatedb指令创建locate数据库

应用实例
案例 1 : 请使用locate 指令快速定位 hello.txt 文件所在目录

1
2
updatedb
locate hello.txt

9.6.3 which指令

which指令可以查看某个指令在哪个目录下。

基本语法

1
which 指令

9.6.4 grep指令 和 管道符号 |

grep 过滤查找 , 管道符“|”,表示将前一个命令的处理结果输出传递给后面的命令处理。

基本语法

1
grep [选项] 查找内容 源文件

常用选项

  • -n : 显示匹配行及行号
  • -i :忽略字母大小写

应用实例
案例 1 : 请在 hello.txt 文件中,查找 “yes” 所在行,并且显示行号

1
2
cat /home/hello.txt | grep -n yes
grep -n yes hello.txt

9.7 压缩和解压类

9.7.1 gzip/gunzip 指令

gzip 用于压缩文件, gunzip 用于解压的

基本语法

1
2
gzip 文件      (功能描述:压缩文件,只能将文件压缩为*.gz文件)
gunzip 文件.gz (功能描述:解压缩文件命令)

细节说明
当我们使用gzip 对文件进行压缩后,不会保留原来的文件。

9.7.2 zip/unzip 指令

zip 用于压缩文件, unzip 用于解压的,这个在项目打包发布中很有用的

基本语法

1
2
zip   [选项] XXX.zip 将要压缩的内容(功能描述:压缩文件和目录的命令)
unzip [选项] XXX.zip(功能描述:解压缩文件)

zip常用选项

  • r:递归压缩,即压缩目录

unzip的常用选项

  • d<目录>:指定解压后文件的存放目录

应用实例
案例 1 : 将 /home本身及下的所有文件进行压缩成 mypackage.zip

1
zip -r mypackage.zip /home

案例 2 : 将 mypackage.zip 解压到 /opt/tmp 目录下

1
unzip -d /opt/tmp mypackage.zip

9.7.3 tar 指令

tar 指令 是打包指令,最后打包后的文件是 .tar.gz 的文件。

基本语法

1
tar [选项] XXX.tar.gz 打包的内容 (功能描述:打包目录,压缩后的文件格式.tar.gz)

选项说明

选项 功能
-c 产生.tar打包文件
-v 显示详细信息
-f 指定压缩后的文件名
-z 打包同时压缩 (压缩成.gz文件需要加上,同时解压.gz文件也需要加上。如果文件是.tar结尾,不能加z选项)
-x 解包.tar文件

应用实例

案例 1 : 压缩多个文件,将 /home/pig.txt 和 /home/cat.txt 压缩成 pc.tar.gz

1
tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt

案例 2 : 将/home 的文件夹 压缩成 myhome.tar.gz

1
tar -zcvf myhome.tar.gz /home

案例 3 : 将 pc.tar.gz 解压到当前目录

1
tar -zxvf pc.tar.gz

案例 4 : 将myhome.tar.gz 解压到 /opt/ 目录下

1
tar -zxvf myhome.tar.gz -C /opt # -C 选项代表解压到指定目录,指定解压到的那个目录,事先要存在才能成功,否则会报错。

十、组管理和权限管理

10.1 Linux组基本介绍

在linux中的每个用户必须属于一个组,不能独立于组外。在linux中每个文件有所有者、所在组、其它组的概念。

10.2 文件/目录所有者

一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者(当然随后可以更改文件的所有者)。

10.2.1 查看文件的所有者

基本语法

1
2
3
ls -ahl  # -a 显示所有文件
# -l 显示文件详细信息,以行的形式显示
# -h 以人类的习惯,显示文件大小

10.2.2 修改文件所有者

基本语法

1
chown 用户名 文件名

应用案例

案例:使用root 创建一个文件apple.txt ,然后将其所有者修改成 tom

1
chown tom apple.txt

10.3 文件/目录 所在组

当某个用户创建了一个文件后,默认这个文件的所在组就是该用户所在的组。

10.3.1 查看文件/目录所在组

基本语法

1
ls -lah

10.3.2 修改文件/目录所在的组

基本语法

1
chgrp 组名 文件名/目录

应用实例
实例:使用root用户创建文件 orange.txt,看看当前这个文件属于哪个组,然后将这个文件所在组,修改到fruit组。

1
chgrp fruit orange.txt

10.4 其它组

除文件所在组外,系统其他组都是文件的其它组.

10.5 改变用户所在组

在添加用户时,可以指定将该用户添加到哪个组中,同样的用root的管理权限可以改变某个用户所在的组。

10.5.1 改变用户所在组

1
2
usermod –g 组名 用户名
usermod –d 目录名 用户名 # 改变该用户登陆的初始目录,当然该用户必须有进入该目录的权限

应用实例

实例:创建一个土匪组(bandit)将 tom 这个用户从原来所在的police组,修改到 bandit(土匪) 组

1
2
groupadd bandit
usermod -g bandit tom

10.6 权限的基本介绍

1
2
ls -l 中显示的内容如下:
-rwxrw-r-- 1 root root 1213 Feb 2 09:39 abc

0 - 9 位说明

  • 第 0 位确定文件类型(d,-,l,c,b)

    • l是连接,相当于windows的快捷方式
    • d是目录,相当于windows的文件夹
    • c是字符设备文件,比如鼠标、键盘等
    • b是块设备,比如硬盘
    • -是文件
  • 第 1 - 3 位确定所有者(该文件的所有者)拥有该文件的权限。—User

  • 第 4 - 6 位确定所属组(同用户组的)拥有该文件的权限,—Group

  • 第 7 - 9 位确定其他用户拥有该文件的权限 —Other

10.7 RWX权限详解

10.7.1 rwx作用到文件

1
2
3
[r]代表可读(read): 可以读取,查看
[w]代表可写(write): 可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件.
[x]代表可执行(execute):可以被执行

10.7.2 rwx作用到目录

1
2
3
[r]代表可读(read): 可以读取,ls查看目录内容
[w]代表可写(write): 可以修改,目录内创建+删除+重命名目录
[x]代表可执行(execute):可以进入该目录

10.8 文件及目录权限实际案例

1
2
ls -l 
-rwxrw-r-- 1 rootroot 1213 Feb 2 09 : 39 abc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-rwxrw-r-- 10个字符确定不同用户能对文件干什么
第一个字符代表文件类型:文件 (-),目录(d),链接(l),字符设备文件(c),块设备(b)
其余字符每 3 个一组(rwx)(r)(w) 执行(x)
第一组rwx: 文件拥有者的权限是读、写和执行
第二组rw-: 与文件拥有者同一组的用户的权限是读、写但不能执行
第三组r--: 不与文件拥有者同组的其他用户的权限是读不能写和执行
可用数字表示为:r= 4 ,w= 2 ,x= 1 因此rwx= 4 + 2 + 1 = 7

1 文件:硬连接数或 目录:子目录数(该目录下一级的子目录数,注意空目录下也有 . 和 .. 代表当前目录和上一级目录)
root 所属用户
root 所属组
1213 文件大小(字节),如果是文件夹,显示 4096 字节
Feb 2 09:39 最后修改日期
abc 文件名

10.9 修改权限

基本说明:通过chmod指令,可以修改文件或者目录的权限

10.9.1 第一种方式:+、-、=变更权限

1
2
3
4
u:所有者 g:所有组 o:其他人 a:所有人(u、g、o的总和)
1 )chmod u=rwx,g=rx,o=x 文件目录名
2 )chmod o+w 文件目录名
3 )chmod a-x 文件目录名

案例演示
案例1: 给abc文件 的所有者读写执行的权限,给所在组读执行权限,给其它组读执行权限。

1
chmod u=rwx,g=rx,o=rx abc

案例2: 给abc文件的所有者除去执行的权限,增加组写的权限

1
chmod u-x,g+w abc

案例3: 给abc文件的所有用户添加读的权限

1
chmod a+r abc

10.9.2 第二种方式:通过数字变更权限

1
2
3
规则:r= 4 w= 2 x= 1 ,rwx= 4 + 2 + 1 = 7
chmodu=rwx,g=rx,o=x 文件目录名
相当于 chmod 751 文件目录名

案例演示

案例:将 /home/abc.txt 文件的权限修改成 rwxr-xr-x, 使用给数字的方式实现:
rwx= 4 + 2 + 1 = 7
r-x= 4 + 1 = 5
r-x= 4 + 1 = 5

1
chmod 755 /home/abc.txt

10.10 修改文件/目录所有者

基本语法:

1
2
chown newowner file           #改变文件/目录的所有者
chown newowner:newgroup file #改变文件/目录的所有者和所有组

常用选项:

  • -R 如果是目录 则使其下所有子文件或目录递归生效

案例演示:

案例1:请将 /home/abc.txt 文件的所有者修改成 tom

1
chmod tom abc.txt

案例2:请将 /home/kkk 目录下所有的文件和目录的所有者都修改成tom,首选我们应该使用root操作。

1
chmod -R tom /home/kkk

10.11 修改文件/目录所在组

基本语法:

1
chgrp newgroup file 改变文件/目录的所在组

案例演示:

案例1:请将 /home/abc.txt 文件的所在组修改成 bandit(土匪)

1
chgrp bandit /home/abc.txt

案例2:请将 /home/kkk 目录下所有的文件和目录的所在组都修改成 bandit(土匪)

1
chgrp -R bandit /home/kkk

10.12 最佳实践-警察和土匪游戏

police ,bandit
jack,jerry: 警察
xh,xq: 土匪
( 1 )创建组

1
2
groupadd police
groupadd bandit

( 2 )创建用户

1
2
3
4
useradd -g police jack
useradd -g police jerry
useradd -g bandit xh
useradd -g bandit xq

( 3 ) jack 创建一个文件,自己可以读写,本组人可以读,其它组没人任何权限

1
2
3
su - jack
touch jack.txt
chmod 640 jack.txt

( 4 )jack 修改该文件,让其它组人可以读, 本组人可以读写

1
chmod 664 jack.txt

( 5 )xh 投靠警察,看看是否可以读写

1
usermod -g police xh

10.13 课后练习

建立两个组(神仙,妖怪)

1
2
groupadd shenxian 
groupadd yaoguai

建立四个用户(唐僧,悟空,八戒,沙僧)

1
2
3
4
useradd tang
useradd wu
useradd ba
useradd sha

设置密码

1
2
3
4
passwd tang
passwd wu
passwd ba
passwd sha

把悟空,八戒放入妖怪 唐僧 沙僧 在神仙

1
2
3
4
usermod -g yaoguai wu
usermod -g yaoguai ba
usermod -g shenxian tang
usermod -g shenxian sha

用悟空建立一个文件 (monkey.java 该文件要输出 iammonkey)

1
2
3
su - wu
touch monkey.java
echo ianmonkey > monkey.java

给八戒一个可以rw 的权限

1
2
chmod 760 monkey.java
chmod 777 /home/wu

八戒修改monkey.java 加入一句话(iampig)

1
echo iampig >> monkey.java

唐僧 沙僧 对该文件没有权限,把 沙僧 放入妖怪组

1
2
usermod -g yaoguai sha
reboot #重新登录,刷新登录信息

让沙僧 修改 该文件 monkey, 加入一句话 (“我是沙僧,我是妖怪!”);

1
echo "我是沙僧,我是妖怪!" >> monkey.java

十一、crond 任务调度

11.1 原理示意图

crontab 进行定时任务的设置。

任务调度:是指系统在某个时间执行的特定的命令或程序。
任务调度分类:

1 .系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等

2 .个别用户工作:个别用户可能希望执行某些程序,比如对mysql数据库的备份。

基本语法:

1
crontab [选项]

常用选项:

  • -e: 编辑crontab定时任务
  • -l: 查询crontab任务
  • -r: 删除当前用户所有的crontab任务

11.2 快速入门

11.2.1 任务的要求

1
2
3
4
5
设置任务调度文件:/etc/crontab
设置个人任务调度。执行crontab –e命令。
接着输入任务到调度文件
如:ls –l /etc/ > /tmp/to.txt
意思说每小时的每分钟执行ls –l/etc > /tmp/to.txt命令

11.2.2 步骤如下

1
2
3
4
1 ) crontab -e
2 ) */ 1 * * * * ls -l /etc > /tmp/to.txt
3 ) 当保存退出后就程序。
4 ) 在每一分钟都会自动的调用 ls -l /etc > /tmp/to.txt

11.2.3 参数细节说明

项目 含义 范围
第一个 “*” 一个小时当中的第几分钟 0-59
第二个 ”*“ 一天当中的第几小时 0-23
第三个 ”*“ 一个月当中的第几天 1-31
第四个 ”*“ 一年当中的第几月 1-12
第五个 ”*“ 一周当中的星期几 0-7(0和7代表星期日)

11.2.4 特殊符号的说明

特殊符号 含义
* 代表任何时间。比如第一个”*“就代表一小时中每分钟都执行一次的意思
, 代表不连续的时间。比如0 8,12,16 * * * 命令,就代表在每天的8点0分,12点0分,16点0分都执行一次命令
- 代表连续的时间范围。比如0 5 * * 1-6命令,代表在周一到周六的凌晨5点0分执行命令
*/n 代表每个多久执行一次。比如*/10 * * * *命令,代表每个10分钟就执行一遍命令

11.2.5 特定时间执行任务案例

命令 含义
45 22 * * * 每天22点45分执行任务
0 17 * * 1 每周星期一0点17分执行任务
0 5 1,15 * * 每月1号和15号的5点0分执行任务
40 4 * * 1-5 每周一到周五的4点40分执行任务
*/10 4 * * * 每天4点每隔10分钟执行任务
0 0 1,15 * 1 每月1号和5号,每周一的0点0分执行任务。(这里1号15号与周一取并集)

注意:星期几和几号最好不要同时出现,因为他们定义的都是天,非常容易让管理员混乱。

crontab定时任务解析网站

11.2.4 任务调度的几个应用实例

案例 1 :每隔 1 分钟,就将当前的日期信息,追加到 /tmp/mydate文件中

1
2
crontab -e
*/1 * * * * date >> /tmp/mydate

案例 2 :每隔 1 分钟, 将当前日期和日历都追加到 /home/mycal文件中

1
2
3
4
5
6
7
8
vim my.sh
date >> /home/mycal
cal >> /home/mycal

chmod 777 home/my.sh

crontab -e
*/1 * * * * home/my.sh

案例 3 : 每天凌晨 2 : 00 将mysql数据库testdb ,备份到文件中 mydb.bak。提示:指令为mysqldump -u root -p密码 数据库 > /home/db.bak

1
2
crontab -e
0 2 * * * mysqldump -u root -proot testdb > /home/db.bak

11.3 crond 相关指令

1
2
3
1 ) conrtab –r:				终止任务调度(就是删除任务)。
2 ) crontab –l: 列出当前有那些任务调度
3 ) service crond restart [重启任务调度]

11.4 at定时任务

基本介绍:

  1. at命令是一次性定时计划任务,at的守护进行atd会以后台模式运行,检查作业队列来运行。
  2. 默认情况下,atd守护进行每60秒检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业。
  3. at命令是一次性定时计划任务,执行完一个任务后不再执行此任务了
  4. 在使用at命令的时候,一定要保证atd进程的启动,可以使用相关指令来查看。ps -ef | grep atd可以检测atd是否在运行。

基本语法:

1
2
at [选项] [时间]
Ctrl + D 结束at命令的输入(两次按Ctrl + D)

选项说明:

选项 含义
-m 当指定的任务被完成后,将给用户发送邮件,即使没有标准输出
-I atq的别名(查询)
-d atrm的别名(删除)
-v 显示任务将被执行的时间
-c 打印任务的内容到标准输出
-V 显示版本信息
-q <队列> 使用指定的队列
-f <文件> 从指定文件读入任务而不是从标准输入读入
-t <时间参数> 以时间参数的形式提交要运行的任务

at时间定义:

  1. 接受在当天hh:mm(小时:分钟)式的时间指定。假如该时间已经过去,那么就放在第二天执行。例如:04:00
  2. 使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间。
  3. 采用12小时计时制,即在时间后面加上AM(上午)或者PM(下午)来说明是上午还是下午。例如12PM
  4. 指定命令执行的具体日期,指定格式为month day (月 日)或者 mm/dd/yy(月/日/年) 或者 dd.mm.yy(日.月.年),指定的日期必须跟在指定时间的后面。例如:04:00 2021-03-01
  5. 使用相对计时法。指定格式为: now + count time-units,now就是当前时间,time-units是时间单位,几天,几小时。例如:now + 5 minutes
  6. 直接使用today(今天)、tomorrow(明天)来制定完成命令的时间。

应用实例:

实例1:2天后的下午5点执行 /bin/ls /home

1
2
at 5pm + 2 days
at> /bin/ls /home

案例2:atq命令来查看系统中没有执行的工作任务

1
atq

案例3:明天17点钟,输出时间到指定文件内,比如/root/date100.log

1
2
at 5pm tomorrow
date >> /root/date100.log

案例4:2分钟后,输出时间到指定文件内,比如/root/date200.log

1
2
at now + 2 minutes
date >> /root/date200.log

案例5:删除已经设置的任务,artm编号

1
atrm 1

十二、Linux 磁盘分区、挂载

12.1 LINUX分区

12.1.1 原理介绍

  1. Linux来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构 ,Linux中每个分区都是用来组成整个文件系统的一部分。

  2. Linux采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得。

  3. 示意图:

12.1.2 硬盘说明

  1. Linux硬盘分IDE硬盘和SCSI硬盘,目前基本上是SCSI硬盘
  2. 对于IDE硬盘,驱动器标识符为“hdx”,其中“hd”表明分区所在设备的类型,这里是指IDE硬盘了。“x”为盘号(a为基本盘,b为基本从属盘,c为辅助主盘,d为辅助从属盘),“”代表分区,前四个分区用数字 1 到 4 表示,它们是主分区或扩展分区,从 5 开始就是逻辑分区。例,hda 3 表示为第一个IDE硬盘上的第三个主分区或扩展分区,hdb 2 表示为第二个IDE硬盘上的第二个主分区或扩展分区。
  3. 对于SCSI硬盘则标识为“sdx~”,SCSI硬盘是用“sd”来表示分区所在设备的类型的,其余则和IDE硬盘的表示方法一样。

分区的方式:

1
2
3
4
5
1 )mbr分区:
1 .最多支持四个主分区
2 .系统只能安装在主分区
3 .扩展分区要占一个主分区
4 .MBR最大只支持 2 TB,但拥有最好的兼容性
1
2
3
4
2 )gtp分区:
1 .支持无限多个主分区(但操作系统可能限制,比如 windows下最多 128 个分区)
2 .最大支持 18 EB的大容量( 1 EB= 1024 PB, 1 PB= 1024 TB )
3 .windows 7 64 位以后支持gtp

12.1.3 使用lsblk指令查看当前系统的分区情况

基本语法:

1
lsblk 或者 lsblk -f

12.2 挂载的经典案例

需求是给我们的Linux系统增加一个新的硬盘,并且挂载到/home/newdisk

1
2
3
4
5
6
7
1 )虚拟机添加硬盘
2 )分区 fdisk/dev/sdb
3 )格式化 mkfs -text 4 /dev/sdb 1
4 )挂载 先创建一个 /home/newdisk , 挂载 mount /dev/sdb 1 /home/newdisk
5 )设置可以自动挂载(永久挂载,当你重启系统,仍然可以挂载到 /home/newdisk) 。
vim /etc/fstab
/dev/sdb 1 /home/newdisk ext 4 defaults 00

12.2.1 虚拟机增加硬盘步骤 1

在【虚拟机】菜单中,选择【设置】,然后设备列表里添加硬盘,然后一路【下一步】,中间只有选择磁盘大小的地方需要修改,至到完成。然后重启系统(才能识别)!

12.2.2 虚拟机增加硬盘步骤 2

1
2
分区命令 fdisk /dev/sdb
开始对/sdb分区
  • m 显示命令列表
  • p 显示磁盘分区 同 fdisk –l
  • n 新增分区
  • d 删除分区
  • w 写入并退出
    说明: 开始分区后输入n,新增分区,然后选择p ,分区类型为主分区。两次回车默认剩余全部空间。最后输入w写入分区并退出,若不保存退出输入q。

12.2.3 虚拟机增加硬盘步骤 3

1
2
3
格式化磁盘
分区命令:mkfs -t ext4 /dev/sdb1
其中 ext4 是分区类型

12.2.4 虚拟机增加硬盘步骤 4

挂载: 将一个分区与一个目录联系起来。

挂载基本语法:

1
2
mount 设备名称 挂载目录
例如: mount /dev/sdb1 /newdisk

卸载基本语法:

1
2
umount 设备名称 或者 挂载目录
例如: umount /dev/sdb1 或者 umount /newdisk

需要注意的是,使用命令行挂载,在重启后会失效。

12.2.5 虚拟机增加硬盘步骤 5

1
2
永久挂载: 通过修改 /etc/fstab 实现挂载
添加完成后 执行 mount –a 即刻生效

字段解释

/etc/fstab文件主要包括6段,依次是:

  

        

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<file system> 要挂载的分区或存储设备
<dir> 挂载的目录位置
<type> 挂载分区的文件系统类型,比如:ext3、ext4、xfs、swap
<options> 挂载使用的参数有哪些。举例如下:
auto - 在启动时或键入了 mount -a 命令时自动挂载。
noauto - 只在你的命令下被挂载。
exec - 允许执行此分区的二进制文件。
noexec - 不允许执行此文件系统上的二进制文件。
ro - 以只读模式挂载文件系统。
rw - 以读写模式挂载文件系统。
user - 允许任意用户挂载此文件系统,若无显示定义,隐含启用 noexec, nosuid, nodev 参数。
users - 允许所有 users 组中的用户挂载文件系统.
nouser - 只能被 root 挂载。
owner - 允许设备所有者挂载.
sync - I/O 同步进行。
async - I/O 异步进行。
dev - 解析文件系统上的块特殊设备。
nodev - 不解析文件系统上的块特殊设备。
suid - 允许 suid 操作和设定 sgid 位。这一参数通常用于一些特殊任务,使一般用户运行程序时临时提升权限。
nosuid - 禁止 suid 操作和设定 sgid 位。
noatime - 不更新文件系统上 inode 访问记录,可以提升性能。
nodiratime - 不更新文件系统上的目录 inode 访问记录,可以提升性能(参见 atime 参数)。
relatime - 实时更新 inode access 记录。只有在记录中的访问时间早于当前访问才会被更新。(与 noatime 相似,但不会打断如 mutt 或其它程序探测文件在上次访问后是否被修改的进程。),可以提升性能。
flush - vfat 的选项,更频繁的刷新数据,复制对话框或进度条在全部数据都写入后才消失。
defaults - 使用文件系统的默认挂载参数,例如 ext4 的默认参数为:rw, suid, dev, exec, auto, nouser, async.

<dump> dump 工具通过它决定何时作备份. dump 会检查其内容,并用数字来决定是否对这个文件系统进行备份。 允许的数字是 0 和 1 。0 表示忽略, 1 则进行备份。大部分的用户是没有安装 dump 的 ,对他们而言 <dump> 应设为 0。

<pass> fsck 读取 <pass> 的数值来决定需要检查的文件系统的检查顺序。允许的数字是0, 1, 和2。 根目录应当获得最高的优先权 1, 其它所有需要被检查的设备设置为 2. 0 表示设备不会被 fsck 所检查。

12.3 磁盘情况查询

12.3.1 查询系统整体磁盘使用情况

基本语法

1
df -h

应用实例
实例1:查询系统整体磁盘使用情况

12.3.2 查询指定目录的磁盘占用情况

基本语法

1
du -h 目录   #查询指定目录的磁盘占用情况,默认为当前目录

选项说明:

  • -s 指定目录占用大小汇总
  • -h 带计量单位
  • -a 含文件
  • –max-depth=1 子目录深度为1
  • -c 列出明细的同时,增加汇总值

应用实例
案例1:查询 /opt 目录的磁盘占用情况,深度为 2

12.4 磁盘情况-工作实用指令

  1. 统计/home文件夹下文件的个数
1
ls -l /home | grep "^-" | wc -l
  1. 统计/home文件夹下目录的个数
1
ls -l /home | grep "^d" | wc -l

3 统计/home文件夹下文件的个数,包括子文件夹里的

1
ls -lR /home | grep "^-" | wc -l

4 ) 统计文件夹下目录的个数,包括子文件夹里的

1
ls -lR /home | grep "^-" | wc -l

5 ) 以树状显示/home目录结构

1
tree /home

十三、网络配置

13.1 Linux网络配置原理图(含虚拟机)

目前我们的网络配置采用的是NAT。

13.2 查看网络IP和网关

在windows环境下,查看ip配置,基本语法:

1
ipconfig

在linux环境下,查看ip配置,基本语法:

1
ifconfig

13.3 Ping测试主机之间网络连通

基本语法

1
ping 目的主机 (功能描述:测试当前服务器是否可以连接目的主机)

应用实例

案例1:测试当前服务器是否可以连接百度

1
ping www.baidu.com

13.4 Linux网络环境配置

13.4.1 第一种方法(自动获取)

说明:登录以后,通过界面来设置自动获取ip,特点:linux启动后会自动获取ip。

缺点:linux启动后会自动获取IP,缺点是每次自动获取的ip地址可能不一样。这个不适用于做服务器,因为我们的服务器的 ip需要时固定的。

可以多了解一些DHCP(动态路由选择协议)。

13.4.2 第二种方法(指定固定的ip)

说明:直接修改配置文件来指定ip,并可以连接到外网(程序员推荐),要求:将ip地址配置的静态的,ip地址为 192.168.184.130

1
vi /etc/sysconfig/network-scripts/ifcfg-ens33

修改后,一定要重启服务/重启

1
2
service network restart
reboot

13.5 设置主机名和hosts映射

13.5.1 设置主机名

  1. 为了方便记忆,可以给linux系统设置主机名,也可以根据需要修改主机名
  2. 指令 hostname:查看主机名
  3. 修改文件在/etc/hostname指定
  4. 修改后,重启生效

13.5.2 设置hosts映射

通过 主机名 能够找到(比如ping)某个linux系统。

在windows系统下,修改C:\Windows\System32\drivers\etc\hosts文件指定即可:

1
192.168.200.130 jyg

在linux系统下,修改/etc/hosts文件指定即可:

1
192.168.200.1 jyg

13.6 主机名解析过程分析(Hosts、DNS)

13.6.1 Hosts是什么

一个文本文件,用来记录ip和Hostname(主机名)的映射关系

13.6.2 DNS

  1. DNS,就是Domain Name System的缩写,翻译过来就是域名系统
  2. DNS是互联网上作为域名和ip地址相互映射的一个分布式数据库

13.6.3 当用户在浏览器输入www.baidu.com,系统如何解析的ip地址

  1. 浏览器先检查浏览器缓存中有没有该域名解析IP地址,如果有就先返回这个IP完成解析;如果没有,就检查操作系统DNS解析器缓存,如果有就直接返回这个IP完成解析。这两个缓存,可以理解为本地解析器缓存。

    一般来说,当电脑第一次成功访问某一网站后,在一定时间内,浏览器或操作系统会缓存该域名的IP地址(DNS解析记录),例如在cmd窗口中输入:

    1
    2
    ipconfig /displaydns   #DNS域名解析缓存
    ipconfig /flushdns #手动清理DNS缓存
  2. 如果本地解析器缓存没有找到对应映射,检查系统中hosts文件中,有没有配置对应的域名IP映射,如果有,则完成解析病返回该IP

    所以,修改系统hosts文件,可以做到域名劫持。

  3. 如果本地DNS解析器缓存和hosts文件中均没有找到哦啊对应的IP,则到域名服务器DNS进行解析域名。

十四、进程管理

14.1 进程的基本介绍

1
2
3
4
1)在LINUX中,每个执行的程序(代码)都称为一个进程。每一个进程都分配一个ID号(pid,进程号)。
2)每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程。例如www服务器。
3)每个进程都可能以两种方式存在的。前台与后台,所谓前台进程就是用户目前的屏幕上可以进行操作的。后台进程则是实际在操作,但由于屏幕上无法看到的进程,通常使用后台方式执行。
4)一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中。直到关机才才结束。

14.2 显示系统执行的进程

14.2.1 ps命令基本介绍

ps命令是用来查看目前系统中,有哪些正在执行,以及它们执行的状况。可以加任何参数。

14.2.2 ps现实的信息选项:

字段 说明
PID 进程识别号
TTY 终端机号
TIME 此进程所消耗CPU时间
CMD 正在执行的命令或进程名
1
2
3
ps -a #显示当前终端的所有进程信息
ps -u #以用户格式显示进程信息
ps -x #显示后台进程运行的参数

一般组合使用ps -aux

14.2.3 ps指令详解

1
ps -aux

各字段解释:

  • USER: 用户名称

  • PID:进程号

  • %CPU:进程占用CPU的百分比

  • %MEM:进程占用物理内存的百分比

  • VSZ:进程占用的虚拟内存大小(单位:KB)

  • RSS:进程占用的物理内存大小(单位:KB)

  • TTY:终端名称,太长就缩写为?.

  • STAT:进程状态,其中S-睡眠,s-表示该进程是会话的先导进程,N-表示进程拥有比普通优先级更低的优先级,R-正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止等等

  • START:进程的启动时间

  • TIME:CPU时间,即进程使用CPU的总时间

  • COMMAND:进程名或者执行进程所用的命令和参数,如果过长会被截断显示

应用实例:

实例1:查看有没有sshd服务进程

1
ps -aux | grep sshd

实例2:以全格式显示当前所有的进程,查看sshd进程的父进程。

1
ps -ef | grep sshd #以全格式显示当前所有的进程

选项解释:

  • -e:显示所有进程
  • -f:全格式

各字段解释:

  • UID:用户ID

  • PID:进程ID

  • PPID:父进程ID

  • C:CPU用于计算执行优先级的因子。数值越大,表明进程是CPU密集型运算,执行优先级会降低;数值越小,表明进程是I/O密集型运算,执行优先级会提高

  • STIME:进程启动的时间

  • TTY:完整的终端名称

  • TIME:CPU时间

  • CMD:启动进程所用的命令和参数
    思考题,如果我们希望查看 sshd进程的父进程号是多少,应该怎样查询 ?

14.3 终止进程kill和killall

若是某个进程执行一半需要停止时,或是已消了很大的系统资源时,此时可以考虑停止该进程。使用kill命令来完成此项任务。

基本语法:

1
2
kill [选项] 进程号	 (功能描述:通过进程号杀死进程)
killall 进程名称 (功能描述:通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用)

常用选项:

  • -9 :表示强迫进程立即停止

应用实践:

案例 1 :踢掉某个非法登录用户tom

1
2
ps -ef | grep sshd #查询tom登录的PID
kill [tom用户登录对应的进程号]

案例 2 : 终止远程登录服务sshd, 在适当时候再次重启sshd服务

1
2
3
ps -ef | grep sshd #查询sshd服务的PID
kill [sshd服务的PID]
/bin/systemctl start sshd.service #重启sshd服务

案例 3 : 终止多个gedit 编辑器 【killall, 通过进程名称来终止进程】

1
killall gedit

案例 4 :强制杀掉一个终端

1
2
3
ps -ef | grep bash
kill [bash的PID] #这种情况系统有保护,不能杀掉
kill -9 [bash的PID] #强制杀掉

14.4 查看进程树pstree

基本语法:

1
pstree [选项] #可以更加直观的来看进程信息

常用选项:

  • -p:显示进程的PID
  • -u:显示进程的所属用户

应用实例:

案例 1 :请你树状的形式显示进程的pid

1
pstree -p

案例 2 :请你树状的形式进程的用户

1
pstree -u

14.5 服务(service)管理

服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysqld,sshd,防火墙等),因此我们又称为守护进程,是Linux中非常重要的知识点。

14.5.1 service管理指令

1
2
service 服务名 [start|stop|restart|reload|status]
在CentOS 7.0 后,不再使用service,而是 systemctl(ubuntu也是使用systemctl)

/etc/init.d下,可以查看service指令管理的服务。

使用实例:

实例1:使用service指令,查看、关闭、启动network。

1
2
3
service network status
service network stop
service network start

14.5.2 查看服务名

方式 1 :使用setup-> 系统服务 就可以看到(可以查看全部服务,许多发行版不支持了)

1
setup

方式 2 : /etc/init.d/服务名称(只能查看一部分)

1
ls -l /etc/init.d

14.5.3 服务的运行级别(runlevel)

Linux系统有 7 种运行级别(runlevel):常用的是级别 3 和 5

  • 运行级别 0 :系统停机状态,系统默认运行级别不能设为 0 ,否则不能正常启动
  • 运行级别 1 :单用户工作状态,root权限,用于系统维护,禁止远程登陆
  • 运行级别 2 :多用户状态(没有NFS),不支持网络
  • 运行级别 3 :完全的多用户状态(有NFS),登陆后进入控制台命令行模式
  • 运行级别 4 :系统未使用,保留
  • 运行级别 5 :X 11 控制台,登陆后进入图形GUI模式
  • 运行级别 6 :系统正常关闭并重启,默认运行级别不能设为 6 ,否则不能正常启动

14.5.4 Linux开机的流程说明

14.5.5 chkconfig指令

介绍:

  1. 通过chkconfig命令可以给服务的各个运行级别设置自 启动/关闭
  2. chkconfig命令管理的服务在/etc/init.d查看
  3. 注意:centos7.0后,很多服务使用systemctl管理

基本语法:

1
2
chkconfig --list [| grep xxx] 		#查看chkconfig管理的服务以及各个运行级别下自启动情况
chkconfig --level 5 服务名 on/off #将某个服务在运行级别5下,自启动on还是off

使用细节:chkconfig重新设置服务后自动启动或关闭,需要重启机器生效。

14.5.6 systemctl管理指令

基本语法

1
systemctl [start | stop | restart | status] 服务名

systemctl指令管理的服务在/usr/lib/systemd/system查看。

systemctl设置服务的自启动状态

1
2
3
4
5
systemctl list-unit-files [ | grep 服务名] #查看所有服务以及其自启动状态,grep可以进行过滤
systemctl enable 服务名 #设置服务开机启动
systemctl disable 服务名 #关闭服务开机启动
systemctl is-enable 服务名 #查询某个服务是否是自启动的
这里不指定运行级别,是因为Centos将运行级别简化为了3和5,这里都是针对3和5说的

应用案例

案例1:查看防火墙当前状态,关闭防火墙和重启防火墙

1
2
3
systemctl status firewalld
systemctl stop firewalld
systemtl restart firewalld

细节讨论:

  1. 关闭或者启动防火墙后,立即生效。使用telnet查看

    1
    telnet ip:port
  2. 这种方式只是临时生效,当重启系统后,还是回归以前对服务的设置。

  3. 如果希望设置某个服务自启动或关闭永久生效,要使用systemctl [enable | disable] 服务名

14.5.7 telnet命令

Linux telnet命令用于远端登入。执行telnet指令开启终端机阶段作业,并登入远端主机。

基本语法:

1
2
3
telnet 主机名称|ip
或者
telnet 主机名称|ip:port

14.5.8 firewall命令

在真正的生产环境,往往需要将防火墙打开,但问题来了,如果我们把防火墙打开,那么外部请求数据包就不能跟服务器监听端口通讯。这时,需要打开指定的端口。

基本语法:

1
2
3
4
firewall-cmd --permanent --add-port=端口号/协议   #打开端口
firewall-cmd --permanent --remove-port=端口号/协议 #关闭端口
firewall-cmd --reload #重新载入,才能生效
firewall-cmd --query-port=端口号/协议 #查询端口是否开放

应用实例:

案例1:开放111端口

1
2
firewall-cmd --permanent --add-port=111/tcp
firewall-cmd --reload

案例2:关闭111端口

1
2
firewall-cmd --permanent --remove-port=111/tcp
firewall-cmd --reload

14.6 动态监控进程

介绍:

top与ps命令很相似。它们都用来显示正在执行的进程。top与ps最大的不同之处,在于top在执行一段时间可以更新正在运行的的进程。

基本语法:

1
top [选项]

选项说明:

选项 功能
-d 秒数 指定top命令每隔几秒更新,默认是3秒。
-i 是top不显示任何闲置或者僵死进程
-p 通过指定监控进程id来仅仅金控某个进程的状态

各项解释:

top:系统时间;up:登录用户数;load average:负载均衡

Tasks:进程数;running:运行进程数;sleeping:睡眠进程数;stopped:停止进程;zombie:僵死进程数(进程已死,内存未释放)

%Cpu(s):us:用户占用Cpu比率;sy:系统占用Cpu比率;ni:用户进程空间内改变过优先级的进程占用Cpu比率;id:空闲Cpu比率;wa:等待输入输出的cpu时间占比;si:软终端占用百分比;st:虚拟机占用百分比

KiB Mem:total:物理内存总量;used:使用的物理内存总量;free:空闲内存总量;buffers:用作内核缓冲的内存量

KiB Swap:total:交换区总量;used:使用的交换区总量;free:空闲交换区总量;cached:缓冲的交换区总量,内存中的内容被换出到交换区,而后又被换入到内存,但使用过得交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小,相应的内存再次被换出是可不必再对交换区写入。

PR:优先级;NI:nice值。负值代表高优先级,正值代表低优先级;VIRT:进程使用的虚拟内存总量,单位kb。VIRT = SWAP + RES;RES:进程使用的、未被换出的物理内存大小,单位kb。RES = CODE + DATA;SHR:共享内存大小,单位kb;S:进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/通知,Z=僵尸进程)

交互操作说明:

操作 功能
P 以CPU使用率排序,默认就是此项
M 以内存使用率排序
N 以PID排序
q 退出top

应用实例:

案例1:监视特定用户

1
2
top 
u 用户名

top:输入此命令,按回车键,查看执行的进程。
u:然后输入“u”回车,再输入用户名,即可。

案例 2 :终止指定的进程。

1
2
top
k PID

top:输入此命令,按回车键,查看执行的进程。

k:然后输入“k”回车,再输入要结束的进程ID号

案例 3 :指定系统状态更新的时间(每隔 10 秒自动更新, 默认是 3 秒):

1
top -d 10

14.7 查看系统网络情况netstat(重要)

基本语法

1
2
netstat [选项]
netstat -anp

选项说明

​ -a (all)显示所有选项,默认不显示LISTEN相关
​ -t (tcp)仅显示tcp相关选项
​ -u (udp)仅显示udp相关选项
​ -n 拒绝显示别名,能显示数字的全部转化成数字。
​ -l 仅列出有在 Listen (监听) 的服務状态

​ -p 显示建立相关链接的进程
​ -r 显示路由信息,路由表
​ -e 显示扩展信息,例如uid等
​ -s 按各个协议进行统计
​ -c 每隔一个固定时间,执行该netstat命令。

应用案例
案例1:查看系统所有的网络服务

1
netstat -anp

案例2:请查看服务名为 sshd 的服务的信息。

1
netstat -anp | grep sshd

十五、RPM 和 YUM

15.1 RPM包的管理

15.1.1介绍

1
2
3
rmp一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中。
它生成具有.RPM扩展名的文件。RPM是RedHatPackageManager(RedHat软件包管理工具)的缩写,类似windows的setup.exe,这一文件格式名称虽然打上了RedHat的标志,但理念是通用的。
Linux的分发版本都有采用(suse,redhat,centos等等),可以算是公认的行业标准了。

15.1.2 rpm包的简单查询指令

1
2
#查询已安装的rpm列表 
rpm –qa | grep xx

应用实例:

案例1:请查询看一下,当前的Linux有没有安装 firefox.

1
rpm -qa | grep firefox

15.1.3 rpm包名基本格式

1
2
3
4
5
6
一个rpm包名:firefox-45.0.1-1.el6.centos.x86_64.rpm
名称: firefox
版本号: 45.0.1-1
适用操作系统: el6.centos.x86_64
表示centos 6.x的64位系统
如果是i686 、i386 表示 32 位系统,noarch表示通用。

15.1.4 rpm包的其它查询指令:

1
2
3
4
5
6
7
rpm -qa 							#查询所安装的所有rpm软件包
rpm -qa | more #[分页显示]
rpm -qa | grep X[rpm-qa|grepfirefox]
rpm -q 软件包名 #查询软件包是否安装,例如:rpm -q firefox
rpm -qi 软件包名 #查询软件包信息,例如:rpm -qi firefox
rpm -ql 软件报名 #查询软件包中的文件,例如rpm -ql firefox
rpm -qf 文件全路径名 #查询文件所属软件包,例如rpm -qf /etc/passwd;rpm -qf /root/install.log

15.1.5 卸载rpm包:

基本语法

1
rpm -e RPM包的名称  #e是erase删除的意思

应用案例
案例1: 删除firefox 软件包

1
rpm -e firefox

细节问题

  1. 如果其它软件包依赖于您要卸载的软件包,卸载时则会产生错误信息。如:

    1
    rpm -e foo
    1
    2
    error:
    removing these packages would break dependencies: foo is needed by bar-1.0-1
  2. 如果我们就是要删除 foo这个rpm 包,可以增加参数 –nodeps,就可以强制删除,但是一般不推荐这样做,因为依赖于该软件包的程序可能无法运行。如:

    1
    rpm -e --nodeps foo #带上 --nodeps 就是强制删除。

15.1.6 安装rpm包:

基本语法

1
rpm -ivh RPM包全路径名称

参数说明
i=install 安装
v=verbose 提示
h=hash 进度条

应用实例
实例1: 演示安装firefox浏览器
步骤先找到firefox的安装rpm 包,你需要挂载上我们安装centos的iso文件,然后到/media/下去找rpm 找。

1
rpm -ivh firefox-45.0.1-1.el6.centos.x86_64.rpm

15.2 YUM

15.2.1 介绍:

Yum 是一个Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。使用yum的前提是可以联网。

15.2.2 yum的基本指令

1
2
yum list | grep xx #查询yum服务器是否有需要安装的软件
yum install xx #安装指定的yum包

15.2.3 yum应用实例

案例1:请使用yum的方式来安装firefox

  1. 先查看一下 firefox rpm 在yum服务器有没有

    1
    yum list | grep firefox
  2. 安装yuminstallfirefox会安装最新版本的软件。

    1
    yum install firefox

十六、搭建 JAVAEE 环境

16.1 概述

如果需要在Linux下进行JavaEE的开发,我们需要安装如下软件:

16.2 安装JDK

16.2.1 安装步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
mkdir /opt/jdk
wget [下载链接] #下载JKD安装包
tar -zxvf 安装包
mkdir /usr/local/java
mv 文件夹 /usr/local/java

而配置环境变量,vim /etc/profile
export JAVA_HOME=/opt/jdk1.7.0_79
export PATH=$JAVA_HOME/bin:$PATH

需要注销用户,环境变量才能生效。
如果是在 3 运行级别, logout
如果是在 5 运行级别, source /etc/profile

16.2.1 测试是否安装成功

随意找一个目录,输入javac --version & java --version

1
2
javac --version
java --version

16.3 安装TOMCAT

16.3.1 步骤

1
2
3
1.上传安装文件,并解压缩到/opt/tomcat
2.进入解压目录/bin,启动tomcat(./startup.sh)
3.开放8080端口

16.3.2 测试是否安装成功

1
在windows、Linux下访问 http://ip:8080

16.4 安装IDEA

16.4.1 步骤

1
2
3
4
5
1. wget https://download.jetbrains.com/idea/ideaIU-2021.3.2.tar.gz?_gl=1*empi04*_ga*MTg0OTIyNTYuMTY0MzI1OTQ0Mw..*_ga_V0XZL7QHEB*MTY0NTc3NDI2OC40LjEuMTY0NTc3NDMwMy4w&_ga=2.141732210.1541181338.1645774269-18492256.1643259443
2. tar -zxvf 安装包 #解压缩到/opt/idea
3. cd /opt/idea/bin
4. ./idea.sh
5. 配置jdk

16.5 MYSQL5.7的安装和配置

16.5.1 安装的步骤和文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1. mkdir /opt/mysql
2. wget http://dev.mysql.com/get/mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar
3. tar -zxvf mysql-5.7.26-1.el7.x86-64.rpm-bundle.tar
4. rpm -qa | grep mari
5. rpm -e --nodep mariadb-libs #Centos7.6自带mariadb数据库,会与mysql冲突,需要先删除
6. 按顺序执行:
rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
7. systemctl start mysqld.service
8. grep "password" /var/log/mysqld.log #查看当前密码
9. mysql -u root -p #root用户登录
10. set global validate_password_policy=0; #提示密码设置策略
11. set password for 'root'@'localhost'=password('mimamima'); #设置密码mimamima
12. flush privileges; #使密码设置生效

十七、Shell 编程

为什么要学习SHELL编程

1
2
3
1.Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理。
2.对于JavaEE和Python程序员来说,工作的需要,你的老大会要求你编写一些Shell脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。
3.对于大数据程序员来说,需要编写Shell程序来管理集群。

SHELL是什么?

Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序.

17.1 SHELL脚本的执行方式

17.1.1 脚本格式要求

1
2
1.脚本以#!/bin/bash开头 (或者不用指定解释器,直接使用bash xxx.sh执行)
2.脚本需要有可执行权限

17.1.2 编写第一个Shell脚本

需求说明:创建一个Shell脚本,输出helloworld!

1
2
3
4
5
6
7
vim helloworld.sh #(也可以不以.sh为结尾,但是为了规范建议以.sh为结尾)

#!/bin/bash
echo helloworld

chmod u+x helloworld.sh
./helloworld.sh

17.1.3 脚本的常用执行方式

方式 1 (输入脚本的绝对路径或相对路径)
1 )首先要赋予helloworld.sh 脚本的+x权限
2 )执行脚本

1
2
chomd u+x helloworld.sh
./helloworld.sh #或者 ~/shcode/helloworld.sh

方式 2 (sh+脚本的绝对路径或者相对路径),不推荐
说明:不用赋予脚本+x权限,直接执行即可

1
bash helloworld.sh

17.2 Shell的变量

Shell的变量的介绍

1
2
3
1 )LinuxShell中的变量分为,系统变量和用户自定义变量。
2 )系统变量:$HOME、$PWD、$SHELL、$USER等等。比如:echo$HOME 等等..
3 )显示当前shell中所有变量:使用命令set来查看

17.2.1 shell变量的定义

基本语法

1
2
3
1 )定义变量:变量=值
2 )撤销变量:unset 变量
3 ) 声明静态变量:readonly变量,注意:不能unset

应用案例:

案例 1 :定义变量A

1
2
3
4
#!/bin/bash
A=100
echo A = $A
echo "A = %A"

案例 2 :撤销变量A

1
2
3
#!/bin/bash
A=100
unset A

案例 3 :声明静态的变量B= 2 ,不能unset

1
2
3
#!/bin/bash
readonly B=200
echo "B = $B"

案例 4 :可把变量提升为全局环境变量,可供其他shell程序使用【一会举例。】

17.2.2定义变量的规则

1
2
3
1. 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
2. 等号两侧不能有空格
3. 变量名称一般习惯为大写,当然小写不出错,但是大写是规范

17.2.3 将命令的返回值赋给变量(重点)

1
2
3
1. A=`ls-la` 反引号,运行里面的命令,并把结果返回给变量A
2. A=$(ls-la) 等价于反引号
否则,就是将字符串赋值给变量

17.3 设置环境变量

基本语法

1
2
3
1. export 变量名=变量值 (功能描述:将shell变量输出为环境变量/全局变量)
2. source 配置文件 (功能描述:让修改后的配置信息立即生效)
3. echo $变量名 (功能描述:查询环境变量的值)

应用案例:

案例1:在/etc/profile文件中定义TOMCAT_HOME环境变量

1
2
3
vim /etc/profile

export TOMCAT_HOME=/opt/tomcat

案例2:查看环境变量TOMCAT_HOME的值

1
echo $TOMCAT_HOME

案例3:在另外一个shell程序中使用TOMCAT_HOME。注意:在输出TOMCAT_HOME 环境变量前,需要让其生效

1
source /etc/profile

17.4 Shell的注释

单行注释:

1
#

多行注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
:<<[字符]  #这里的字符可以是数字或者是字符都可以
语句1
语句2
[字符]

#比如
:<<!
语句1
语句2
!

#或者
:<<0
语句1
语句2
0

17.5 位置参数变量

介绍:

当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如 :./myshell.sh 100 200 , 这个就是一个执行shell的命令行,可以在myshell 脚本中获取到

基本语法:

1
2
3
4
$n (功能描述:n为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$# (功能描述:这个变量代表命令行中所有参数的个数)

应用实例:

案例1:编写一个shell脚本 positionPara.sh , 在脚本中获取到命令行的各个参数信息

1
2
3
vim myshell.sh

echo 第一个参数 = $1 第二个参数 = $2

17.6 预定义变量

基本介绍

预定义变量就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用。

基本语法

1
2
3
$$ (功能描述:当前进程的进程号(PID))
$! (功能描述:后台运行的最后一个进程的进程号(PID))
$?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0 ,证明上一个命令正确执行;如果这个变量的值为非 0 (具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

应用实例

案例1:在一个shell脚本中简单使用一下预定义变量

1
2
3
4
5
#!/bin/bash
echo 当前进程的进程号$$
bash ~/shcode/myshell.sh & #次数加上&,说明让该命令后台运行
echo 最后一个后台运行的进程ID$!
echo 最后一次执行的命令的返回状态$?

17.7 运算符

基本介绍

学习如何在shell中进行各种运算操作。

基本语法:

1
2
3
“$((运算式))” 或者 “$[运算式]”  #*不需要转义,运算符间也不需要空格
expr m + n #注意expr运算符间要有空格,如果希望将expr结果赋值给某个变量,需要使用‘’引起来,例如`expr m + n`
expr \*,/,% 乘,除,取余 #需要注意的是*,需要转义

应用实例

案例 1 :计算( 2 + 3 )X 4 的值

1
2
3
4
5
A=$(((2 + 3) * 4)) #注意只有expr运算符才需要将*转义
A=$[(2 + 3) * 4]
A=`expr (2 + 3) \* 4` #这种做法是错误的,应该分步走
A=`expr 2 + 3`
A=`expr 4 \* $A`

案例 2 :请求出命令行的两个参数[整数]的和

1
2
A=$[$1 + $2]
echo 和为 $A

17.8 条件判断

基本语法

1
2
[ condition ]   #注意condition前后要有空格
#非空返回true,可使用$?验证( 0 为true,> 1 为false)

应用实例

1
2
3
[ atguigu ] 返回true
[ ] 返回false
[ condition ] && echo OK || echo notok #条件满足,执行后面的语句,相当于三目运算

常用判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
= 字符串比较
#两个整数的比较
- lt 小于
- le 小于等于
- eq 等于
- gt 大于
- ge 大于等于
- ne 不等于
#按照文件权限进行判断
- r 有读的权限 [-r 文件 ]
- w 有写的权限
- x 有执行的权限
#按照文件类型进行判断
- f 文件存在并且是一个常规的文件
- e 文件存在
- d 文件存在并是一个目录

应用实例

案例1:”ok”是否等于”ok”

1
ok = ok

案例2: 23 是否大于等于 22

1
23 -ge 22

案例 3 :/root/install.log目录中的文件是否存在

1
-f /root/install.log

17.9 流程控制

17.9.1 if 判断

基本语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if [ 条件判断式 ]
then
程序
fi

或者

if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
fi

或者

if [ 条件判断式 ]
then
程序
else
程序
fi
1
注意事项:[ 条件判断式 ]中括号和条件判断式之间必须有空格

应用实例
案例1:请编写一个shell程序,如果输入的参数,大于等于 60 ,则输出 “及格了”,如果小于 60 ,则输出 “不及格”

1
2
3
4
5
6
7
8
9
#!/bin/bash

if [ $1 -ge 60 ]
then
echo 及格了
elif [ $1 -lt 60 ]
then
echo 不及格
fi

17.9.2 case语句

基本语法

1
2
3
4
5
6
7
8
9
10
11
case $变量名 in
"值 1 ")
如果变量的值等于值 1 ,则执行程序 1
;;
"值 2 ")
如果变量的值等于值 2 ,则执行程序 2
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

应用实例
案例 1 :当命令行参数是 1 时,输出 “周一”, 是 2 时,就输出”周二”,其它情况输出 “other”

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

case $1 in
"1")
echo 周一
;;
"2")
echo 周二
;;
*)
echo other...
;;
esac

17.9.3 for循环

基本语法

1
2
3
4
for 变量 in 值1 值2 值3 ...
do
程序/代码
done

应用实例
案例 1 :打印命令行输入的参数 【会使用到$* $@,体会$* 与 $@的区别】

1
2
3
4
5
#!/bin/bash
for i in "$*"
do
echo num is $i
done
1
2
3
bash for.sh 1 2 3 4 5
输出:
num is 1 2 3 4 5
1
2
3
4
5
#!/bin/bash
for i in "$@"
do
echo num is $i
done
1
2
3
4
5
6
7
bash for.sh 1 2 3 4 5
输出:
num is 1
num is 2
num is 3
num is 4
num is 5

基本语法

1
2
3
4
for(( 初始值 ; 循环控制条件 ; 变量变化 ))
do
程序
done

应用实例

案例 1 :从 1 加到 100 的值输出显示

1
2
3
4
5
6
7
#!/bin/bash
SUM=0
for (( i=1; i<=100; i++))
do
SUM=$[$SUM+$i]
done
echo $SUM

17.9.4 while循环

基本语法

1
2
3
4
5
while[ 条件判断式 ]
do
程序
done
#注意:while和[有空格,条件判断式和[也有空格

应用实例
案例 1 :从命令行输入一个数n,统计从 1 +..+n 的值是多少?

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo $SUM

17.10 READ读取控制台输入

基本语法

1
read (选项)(参数)

选项:

  • -p:指定读取值时的提示符;
  • -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。
    参数
    变量:指定读取值的变量名

应用实例

案例 1 :读取控制台输入一个num值

1
2
3
#!/bin/bash
read -p 请输入一个数 NUM
echo $NUM

案例 2 :读取控制台输入一个num值,在 10 秒内输入。

1
2
3
#!/bin/bash
read -t 10 -p 输入一个数 NUM
echo $NUM

17.11 函数

函数介绍:

shell编程和其它编程语言一样,有系统函数,也可以自定义函数。系统函数中,我们这里就介绍两个。

17.11.1 系统函数

basename基本语法

1
basename [pathname] [suffix] #功能:返回完整路径最后 / 的部分,常用于获取文件名

选项:

suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。

案例 1 :请返回 /home/aaa/test.txt 的 “test.txt” 部分

1
2
basename /home/aaa/test.txt
basename /home/aaa/test.txt .txt

dirname基本语法

1
dirname 文件绝对路径 #(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

案例 2 :请返回 /home/aaa/test.txt 的 /home/aaa

1
dirname /home/aaa/test.txt

17.11.2 自定义函数

基本语法

1
2
3
4
5
6
[function]funname[()]
{
Action;
[return int;]
}
#在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...

调用直接写函数名:funname [值]

应用实例
案例 1 :计算输入两个参数的和(read), getSum

1
2
3
4
5
6
function getSum() {
SUM=$[$n1+$n2]
echo 和是$SUM
}
read -p 输入两个值 n1 n2
getSum
1
2
3
4
5
Shell 变量的作用域可以分为三种:
有的变量只能在函数内部使用,这叫做局部变量(local variable);除非定义时使用local限定,否则都是全局变量
有的变量可以在当前 Shell 进程中使用,这叫做全局变量(global variable);正常定义都是全局变量
而有的变量还可以在子进程中使用,这叫做环境变量(environment variable)。需要使用export导出环境变量。

Shell作用域细节

17.12 SHELL编程综合案例

1
2
3
4
5
需求分析
1 )每天凌晨 2 : 10 备份 数据库 atguiguDB 到 /data/backup/db
2 )备份开始和备份结束能够给出相应的提示信息
3 )备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:2018-03-12_230201.tar.gz
4 ) 在备份的同时,检查是否有 10 天前备份的数据库文件,如果有就将其删除。

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
1. cd/usr/sbin #root用户的系统管理程序
vim mysqlbd_backup.sh

#!/bin/bash

#备份目录
BACKUP=/data/backup/bd
#当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME
#数据库地址
HOST=localhost
#数据库用户名
DB_USER=root
#数据库密码
DB_PW=hspedu100
#备份的数据库名
DATABASE=hspedu

#创建备份目录,如果不存在,就创建
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"

#备份数据库
mysqldump -u${DB_USER} -p${DB_PW} --host${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/${DATETIME}.sql.gz

#将文件处理成.tar.gz
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATETIME}
#删除对应的备份目录
rm -rf ${BACKUP}/${DATETIME}

#删除十天前备份文件
find ${BACKUP} -atime + 10 -name "*.tar.gz" -exec rm -rf {} \;
echo "备份数据库${DATABASE}"


crond -e
30 2 * * * /usr/sbin/mysqlbd_backup.sh

十八、Ubuntu

Ubuntu介绍

Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu是基于GNU/Linux,支持x 86 、amd 64 (即x 64 )和ppc架构,由全球化的专业开发团队(CanonicalLtd)打造的。

专业的Python开发者一般会选择 Ubuntu 这款Linux系统作为生产平台.
温馨提示:
Ubuntu 和 Centos 都是基于 GNU/Linux 内核的,因此基本使用和Centos是几乎一样的,它们的各种指令可以通用,同学们在学习和使用Ubuntu的过程中,会发现各种操作指令在前面学习CentOS都使用过。只是界面和预安装的软件有所差别。

Ubuntu下载地址:http://cn.ubuntu.com/download/

18.1 设置Ubuntu支持中文

默认安装的ubuntu 中只有英文语言,因此是不能显示汉字的。要正确显示汉字,需要安装中文语言包。

安装中文支持步骤:

1 .单击左侧图标栏打开 SystemSettings(系统设置)菜单,点击打开 LanguageSupport(语言支持)选项卡。

2 .点击 Install/RemoveLanguages,在弹出的选项卡中下拉找到Chinese(Simplified),即中文简体,在后面的选项框中打勾。然后点击ApplyChanges 提交,系统会自动联网下载中文语言包。(保证ubuntu 是联网的)。

3 .这时“汉语(中国)”在最后一位因为当前第一位是”English”,所以默认显示都是英文。我们如果希望默认显示用中文,则应该将“汉语(中国)”设置为第一位。设置方法是拖动,鼠标单击“汉语(中国)”,当底色变化(表示选中了)后,按住鼠标左键不松手,向上拖动放置到第一位。

4 .设置后不会即刻生效,需要下一次登录时才会生效。

18.2 Ubuntu的root用户

安装ubuntu成功后,都是普通用户权限,并没有最高root权限,如果需要使用root权限的时候,通常都会在命令前面加上 sudo 。有的时候感觉很麻烦。

我们一般使用su命令来直接切换到root用户的,但是如果没有给root设置初始密码,就会抛出 su:Authenticationfailure 这样的问题。所以,我们只要给root用户设置一个初始密码就好了。

18.2.1 给root用户设置密码并使用

1
2
3
4
1 ) 输入 sudo passwd 命令,输入一般用户密码并设定root用户密码。
2 ) 设定root密码成功后,输入 su 命令,并输入刚才设定的root密码,就可以切换成root了。# 提示符$代表一般用户,提示符#代表root用户。
3 ) 输入 exit 命令,退出root并返回一般用户
4 ) 以后就可以使用root用户了

需要注意的是,sudo是允许当前用户以root身份执行命令,但是本身还是普通用户;而su root是切换到root用户,家目录变成/root

十九、Ubuntu 软件管理和远程登录

APT介绍

apt是AdvancedPackagingTool的简称,是一款安装包管理工具。在Ubuntu下,我们可以使用apt命令可用于软件包的安装、删除、清理等,类似于Windows中的软件管理工具。

ubuntu 软件管理的原理示意图:

19.1 Ubuntu软件操作的相关命令

1
2
3
sudo apt-get update 更新源
sudo apt-get install package 安装包
sudo apt-get remove package 删除包
1
2
3
sudo apt-cache search package 搜索软件包
sudo apt-cache show package 获取包的相关信息,如说明、大小、版本等
sudo apt-get install package --reinstall 重新安装包
1
2
3
sudo apt-get -f install 修复安装
sudo apt-get remove package --purge 删除包,包括配置文件等
sudo apt-get build-dep package 安装相关的编译环境
1
2
3
4
5
sudo apt-get upgrade 更新已安装的包
sudo apt-get dist-upgrade 升级系统
sudo apt-cache depends package 了解使用该包依赖那些包
sudo apt-cache rdepends package 查看该包被哪些包依赖
sudo apt-get source package 下载该包的源代码

19.2 更新UBUNTU软件下载地址

19.2.1 寻找国内镜像源

https://mirrors.tuna.tsinghua.edu.cn/

所谓的镜像源:可以理解为提供下载软件的地方,比如Android手机上可以下载软件的安卓市场;iOS手机上可以下载软件的AppStore

19.2.2 备份Ubuntu默认的源地址

1
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup

19.2.3 更新源服务器列表

1
2
vim /etc/apt/souces.list #更新镜像源地址文件
sudo apt-get update #更新源地址

19.3 Ubuntu软件安装与卸载

使用apt完成安装和卸载vim 软件,并查询 vim软件的信息:

1
2
3
sudo apt-get remove vim
sudo apt-get install vim
sudo apt-cache show vim

需要注意的是,现在官方主推apt命令,apt相当于apt-get + apt-cache + apt-config

19.4 使用SSH远程登录Ubuntu

ssh介绍

SSH为SecureShell的缩写,由 IETF 的网络工作小组(NetworkWorkingGroup)所制定;SSH为建立在应用层和传输层基础上的安全协议。

SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。常用于远程登录,以及用户之间进行资料拷贝。几乎所有 UNIX 平台—包括 HP-UX、Linux、AIX、Solaris、DigitalUNIX、Irix,以及其他平台,都可运行SSH。

使用SSH服务,需要安装相应的服务器和客户端。客户端和服务器的关系:如果,A机器想被B机器远程控制,那么,A机器需要安装SSH服务器,B机器需要安装SSH客户端。和CentOS不一样,Ubuntu默认没有安装SSHD服务(netstat -anp 查看是否有进程监听22号端口,如果连netstat命令都没有安装,可以使用apt install net-tools先安装netstat命令),因此,我们不能进行远程登录。

19.4.1 原理示意图

19.5 使用SSH远程登录Ubuntu

19.5.1 安装SSH和启用

1
2
sudo apt-get install openssh-server #执行上面指令后,在当前这台Linux上就安装了SSH服务端和客户端。
service sshd restart #执行上面的指令,就启动了 sshd 服务。会监听端口 22

19.5.2 从linux系统客户机远程登陆linux系统服务机

首先,我们需要在linux的系统客户机也要安装openssh-server

基本语法

1
2
3
ssh 用户名@IP
#例如:sshatguigu@192.168.188.131
#使用ssh访问,如访问出现错误。可查看是否有该文件 ~/.ssh/known_ssh 尝试删除该文件解决。

登出

1
2
3
exit
#或者
logout

二十、CentOS8.0 Vs CentOS7.0

可惜,由于红帽的政策,Centos会逐渐变成上游不稳定版本,而且Centos7和Centos8也会很快不被维护。

二十一、日志管理

基本介绍

  1. 日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。
  2. 日志对于安全来说也很重要,它记录了系统每天发生的各种事情,通过日志来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。
  3. 可以这样理解日志是用来记录重大事件的工具

21.1 系统常用日志

/var/log目录就是系统日志文件的保存位置:

应用案例

案例1:使用root用户通过xshell6登陆,第一次使用错误的密码,第二次使用正确的密码登录成功看看在日志文件/var/log/secure里有没有记录相关信息

1
cat /var/log/secure

21.2 日志管理服务rsyslogd

​ CentOS7.6日志服务是rsyslogd,CentOS6.x日志服务是syslogd。rsyslogd功能更强大。rsyslogd的使用、日志文件的格式,和syslogd服务兼容的。

/etc/rsyslog.conf中记录了,各种服务应该写入日志的目录。

应用案例

案例1:查询Linux中的rsyslogd服务是否启动

1
ps -aux | grep rsyslogd | grep -v grep  # grep -v 是指选择不含匹配串的行

案例2:查询rsyslogd服务的自启动状态

1
systemctl list-unit-files | grep rsyslogd

21.2.1 配置文件 /etc/rsyslog.conf

编辑文件时的格式为:*.*, 存放日志文件

其中第一个*代表日志类型,第二个*代表日志级别

  1. 日志类型分为:

    auth:pam产生的日志

    authpriv:ssh、ftp等登录信息的验证信息

    corn:时间任务相关

    kern:内核

    lpr:打印

    mail:邮件

    mark(syslog)-rsyslog:服务内部的信息,时间标识

    news:新闻组

    user:用户程序产生的相关信息

    uucp:unix to unix copy主机之间相关的通信

    local 1-7:自定义的日志设备

  2. 日志级别:

    debug:有调试信息的,日志通信最多

    info:一般信息日志,最常用

    notice:最具有重要性的普通条件的信息

    warning:警告级别

    err:错误级别,阻止某个功能或者模块不能正常工作的信息

    crit:严重级别,阻止整个系统或者整个软件不能正常工作的信息

    alert:需要立刻修改的信息

    emerg:内核崩溃等重要信息

    none:什么都不记录

    注意:从上到下,级别从低到高,记录信息越来越少

由日志服务rsyslogd记录的日志文件,日志文件的格式包含以下4列:

  1. 事件产生的时间

  2. 产生事件的服务器的主机名

  3. 产生事件的服务名或程序名

  4. 事件的具体信息

应用案例

案例1:查看一下/var/log/secure日志,这个日志中记录的是用户验证和授权方面的信息,来分析如何查看

1
cat /var/log/secure

案例2:在/etc/rsyslog.conf中添加一个日志文件/var/log/hsp.log,当有事件发送时(比如sshd服务相关事件),该文件会接收到信息并保存.给小伙伴演示重启,登录的情况,看看是否有日志保存。

1
2
3
vim /etc/rsyslog.conf

*.* /var/log/hsp.log
1
cat /var/log/hsp.log 	#就可以看到相关服务时间的日志

21.3 日志轮替

基本介绍

日志轮替就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围之后,就会进行删除。

21.3.1 日志轮替文件命名

  1. centos7使用logrotate进行日志轮替管理,要想改变日志轮替文件名字,通过/etc/logrotate.conf配置文件中“dateext”参数
  2. 如果配置文件中有“dateext”参数,那么日志会用日期来作为日志文件的后缀,例如“secure-20201010”。这样日志文件名不会重叠,也就不需要日志文件的改名,只需要指定保存日志个数,删除多余的日志文件即可。
  3. 如果配置文件中没有“dateext”参数,日志文件就需要进行改名了。当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,然后新建“secure”日志,用来保存新的日志。当第二次进行日志轮替时,“secure.1”会自动改名为“secure.2”,当前的“secure”日志会自动改名为“secure.1”,然后也会新建“secure”日志,用来保存新的日志,以此类推。

21.3.2 logrotate配置文件

/etc/logrotate.conf为logrotate的全局配置文件

#rotate log files weekly,每周对日志文件进行一次轮替

weekly

#keep 4 weeks worth of backlogs,共保存4份日志文件,当建立新的日志文件时,旧的将会被删除

rotate4

#create new (empty) log files after rotating old ones,创建新的空的日志文件,在日志轮替后

create

#use date as a suffix of the rotated file,使用日期作为日志轮替文件的后缀

dateext

#uncomment this if you want your log files compressed,日志文件是否压缩。如果取消注释,则日志会在转储的同时进行压缩#compress

#RPM packages drop log rotation information into this directory

include /etc/logrotate.d/

#包含/etc/logrotate.d/目录中所有的子配置文件。也就是说会把这个目录中所有子配置文件读取进来,

#下面是单独设置,优先级更高。

#no packages own wtmp and btmp – we’ll rotate them here

1
2
3
4
5
6
/var/log/wtmp {
monthly#每月对日志文件进行一次轮替
create 0664 root utmp #建立的新日志文件,权限是0664,所有者是root,所属组是utmp组
minsize 1M #日志文件最小轮替大小是1MB,也就是日志一定要超过1MB才会被轮替,否则就算时间达到一个月,也不进行日志转储
rotate 1 #仅保留一个日志备份。也就是只有wtmp和wtmp.1日志保留而已
}
1
2
3
4
5
6
/var/log/btmp {
missingok #如果日志不存在,则忽略该日志的警告信息
monthly
create 0600 root utmp
rotate 1
}

21.3.3 logroate配置文件的参数说明

daily 日志的轮替周期是每天
weekly 日志的轮替周期是每周
monthly 日后在的轮替周期是每月
rotate 数字 保留的日志文件个数。0指每月备份
compress 日志轮替是,旧的日志进行压缩
create mode owner group 建立新日志,同时指定新日志的权限与所有者和所属组
mail address 当日志轮替是,输出内容通过邮件发送到指定的邮件地址
missingok 如果日志不存在,则忽略该日志的警告信息
notifempty 如果日志为空文件,则不进行日志轮替
minsize 大小 日志轮替的最小值,也就是日志一定要达到这个最小值才会轮替,否则就算时间达到也不轮替
size 大小 日志只有大于指定大小才进行日志轮替,而不是按照时间轮替
dateext 使用日期作为日志轮替文件的后缀
sharedscripts 再次关键字之后的监本只执行一次
prerotate/endscript 在日志轮替前执行脚本命令
postroate/endscript 在日志轮替后执行脚本命令

应用案例

案例1:把自己的日志加入日志轮替

1
2
3
4
5
6
7
8
9
10
可以写入到/etc/logrotate.d/下,vim hsp

/var/log/hsp.log {
missingok
daily
copytruncate
rotate 7
notifempty
}
#同样也可以直接写入到主配置文件中,/etc/logrotate.conf中

21.3.4 日志轮替机制原理

日志轮替之所以可以在指定的时间备份日志,是依赖系统定时任务。在/etc/cron.daily/目录,就会发现这个目录中是有logrotate文件(可执行),logrotate通过这个文件依赖定时任务执行的。

21.4 查看内存日志

journalctl可以查看内存日志,这里我们看看常用的指令。

1
2
3
4
5
6
7
journalctl #查看全部
journalctl -n 3 #查看最新3条
journalctl --since 19:00 --until 19:10:10 #查看起始时间到结束时间的日志可加日期
journalctl -p err #报错日志
journalctl -o varbose #日志详细内容
journalctl _PID=1245 _COMM=sshd #查看包含这些参数的日志
或者 journalctl | grep sshd

注意:journalctl查看的事内存日志,重启清空

应用案例:

案例1:使用 journalctl | grep sshd来看看用户登录清空,重启系统,再次查询,看看日志有什么变化没有

1
journalctl | grep sshd

二十二、定制自己的Linux系统

22.1 基本介绍

通过裁剪现有Linux系统(CentOS7.6),创建属于自己的minLinux小系统,可以加深我们对linux的理解。

22.2 启动流程介绍

制作Linux小系统之前,再了解一下Linux的启动流程:

1、首先Linux要通过自检,检查硬件设备有没有故障

2、如果有多块启动盘的话,需要在BIOS中选择启动磁盘

3、启动MBR中的bootloader引导程序

4、加载内核文件

5、执行所有进程的父进程、老祖宗systemd

6、欢迎界面

在Linux的启动流程中,加载内核文件时关键文件:

1)kernel文件:vmlinuz-3.10.0-957.el7.x86_64

2)initrd文件:initramfs-3.10.0-957.el7.x86_64.img

22.3 制作minlinux思路分析

1)在现有的Linux系统(centos7.6)上加一块硬盘/dev/sdb,在硬盘上分两个分区,一个是/boot,一个是/,并将其格式化。需要明确的是,现在加的这个硬盘在现有的Linux系统中是/dev/sdb,但是,当我们把东西全部设置好时,要把这个硬盘拔除,放在新系统上,此时,就是/dev/sda

2)在/dev/sdb硬盘上,将其打造成独立的Linux系统,里面的所有文件是需要拷贝进去的

3)作为能独立运行的Linux系统,内核是一定不能少,要把内核文件和initramfs文件也一起拷到/dev/sdb上

4)以上步骤完成,我们的自制Linux就完成,创建一个新的linux虚拟机,将其硬盘指向我们创建的硬盘,启动即可

二十三、Linux内核源码介绍&内核升级

为什么要阅读linux内核?

1)爱好,就是喜欢linux(黑客精神)

2)想深入理解linux底层运行机制,对操作系统有深入理解

3)阅读Linux内核,你会对整个计算机体系有一个更深刻的认识。作为开发者,不管你从事的是驱动开发,应用开发还是后台开发,你都需要了解操作系统内核的运行机制,这样才能写出更好的代码。

4)作为开发人员不应该只局限在自己的领域,你设计的模块看起来小,但是你不了解进程的调用机制,你不知道进程为什么会阻塞、就绪、执行几个状态。那么很难写出优质的代码。

5)作为有追求的程序员,还是应该深入的了解一个操作系统的底层机制,(比如linux/unix)最好是源码级别的,这样你写多线程高并发程序,包括架构,优化,算法等,高度不一样的,当然老韩也不是要求小伙伴儿把一个非常庞大的Linux内核每一行都读懂。我觉得。你至少能看几个核心的模块。

23.1 linux0.01内核源码

Linux的内核源代码可以从网上下载,解压缩后文件一般也都位于linux目录下。内核源代码有很多版本,可以从linux0.01内核入手,总共的代码1w行左右,最新版本5.9.8总共代码超过700w行,非常庞大.Linux内核下载地址

23.1.1 内核源码阅读技巧

1)linux0.01的阅读需要懂c语言

2)阅读源码前,应知道Linux内核源码的整体分布情况。现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序和网络等组成。Linux内核源码的各个目录大致与此相对应.

3)在阅读方法或顺序上,有纵向与横向之分。所谓纵向就是顺着程序的执行顺序逐步进行;所谓横向,就是按模块进行。它们经常结合在一起进行

4)对于Linux启动的代码可顺着Linux的启动顺序一步步来阅读;对于像内存管理部分,可以单独拿出来进行阅读分析。实际上这是一个反复的过程,不可能读一遍就理解

23.1.2 linux目录说明

23.1.3 main.c初探

23.2 内核升级

1
2
3
4
uname -a #查看当前的内核版本
yum info kernel -q #检测内核版本,显示可以升级的内核
yum update kernel #升级内核
yum list kernel -q #查看已经安装的内核

二十四、备份与恢复

基本介绍:

实体机无法做快照,如果系统出现异常或者数据损坏,后果严重,要重做系统,还会造成数据丢失。所以我们可以使用备份和恢复技术linux的备份和恢复很简单,有两种方式:

1)把需要的文件(或者分区)用tar打包就行,下次需要恢复的时候,再解压开覆盖即可

2)使用dump和restore命令

24.1 安装dump和restore

1
2
yum -y install dump
yum -y install restore

24.2 使用dump完成备份

基本介绍

dump支持分卷和增量备份(所谓增量备份是指备份上次备份后修改/增加过的文件,也称差异备份)。

基本语法

1
2
dump [-cu] [-f <备份后文件名>] [-T <日期>] [目录或文件系统]
dump [-wW]

选项解释

1
2
3
4
5
6
7
8
9
-c :创建新的归档文件,并将由一个或多个文件参数所指定的内容写入归档文件的开头(c就是下面0-9的数字)
-0123456789: 备份的层级。0为最完整备份,会被分所有文件。若指定0以上的层级,则备份至上一次备份以来修改或新增的文件,到9后,可以再次轮替
-f <备份后文件名>: 指定备份后文件名
-j: 调用bzlib库压缩备份文件,也就是将备份后的文件压缩成bz2格式,让文件更小
-T <日期>: 指定开始备份的时间与日期
-u: 备份完毕后,在/etc/dumpdares中记录备份的文件系统,层级,日期与时间等。
-t: 指定文件若改文件已存在备份文件中,则列出名称
-W: 显示需要备份的文件及其最后一次备份的层级,时间,日期
-w:与-W类似,但仅显示需要备份的文件。

应用案例

案例1:将/boot分区所有内容备份到/opt/boot.bak0.bz2文件中,备份层级为“0”

1
dump -0uj -f /opt/book.bak0.bz2 /boot

案例2:在/boot目录下增加新文件,备份层级为“1”(只备份上次使用层次“0”备份后发生过改变的数据),注意比较看看这次生成的备份文件boot1.bak有多大

1
dump -1uj -f /opt/boot.bak1.bz2 /boot

通过dump命令在配合crontab可以实现无人值守备份

案例3:显示需要备份的文件及其最后一次备份的层级,时间,日期

1
dump -W

案例4:查看备份时间文件

1
cat /etc/dumpdates

dump备份文件或者目录前面我们在备份分区时,是可以支持增量备份的,如果备份文件或者目录,不再支持增量备份,即只能使用0级别备份案例,也不支持-u选项。

使用dump备份/etc整个目录

1
dump -0j -f /opt/etc.bak.bz2 /etc/#下面这条语句会报错,提示DUMP:Only level 0 dumps are allowed on a subdirectory dump -1j -f /opt/etc.bak.bz2 /etc/

24.3 使用restore完成恢复

基本介绍

restore命令用来恢复已备份的文件,可以从dump生成的备份文件中恢复原文件,一般是恢复到当前目录

基本语法

1
restore [模式选项] [选项]

说明下面四个模式,不能混用,再一次命令中,只能指定一种:

1
2
3
4
-C: 使用对比模式,将备份的文件与已存在的文件相互对比。
-i: 使用交互模式,在进行还原操作时,restore指令将依序询问用户
-r: 进行还原模式
-t: 查看模式,看备份文件有哪些文件

选项:

1
-f <备份设备>: 从指定的文件中读取备份数据,进行还原操作

应用案例

案例1:restore命令比较模式,比较备份文件和原文件的区别

1
2
mv /boot/hello.java /boot/hello100.java
restore -C -f boot.bak1.bz2 #注意和最新的文件比较

1
2
mv /boot/hello100.java /boot/hello.java
restore -C -f boot.bak1.bz2

案例2:restore命令查看模式,看备份文件有哪些数据/文件

1
restore -t -f boot.bak0.bz2

案例3:restore命令还原模式,注意细节:如果你有增量备份,需要把增量备份文件也进行恢复,有几个增量备份文件,就要恢复几个,按顺序来恢复即可。

1
2
restore -r -f /opt/boot.bak0.bz2 #恢复到第一次完全备份状态
restore -r -f /opt/boot.bak1.bz2 #恢复到第二次完全备份状态

案例4:restore命令恢复备份的文件,或者整个目录的文件

1
restore -r -f 备份好的文件

二十五、Linux可视化管理

25.1 webmin

25.1.1 基本介绍

Webmin是功能强大的基于Web的Unix/linux系统管理工具。管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理操作。除了各版本的linux以外还可用于:AIX、HPUX、Solaris、Unixware、Irix和FreeBSD等系统

25.1.2 安装webmin&配置

1)下载地址:http://download.webmin.com/download/yum/,用下载工具下载即可

或者wgethttp://download.webmin.com/download/yum/webmin-1.700-1.noarch.rpm

2)安装:rpm -ivh webmin-1.700-1.noarch.rpm

3)重置密码:/usr/libexec/webmin/changepass.pl /etc/webminroot test root是webmin的用户名,不是OS的,这里就是把webmin的root用户密码改成了test

4)修改webmin服务的端口号(默认是10000出于安全目的)

1
2
3
4
vim /etc/webmin/miniserv.conf#修改端口

将port=10000修改为其他端口号,如port=6666
将listen=10000修改为listen=6666

5)重启webmin

1
2
3
/etc/webmin/restart#重启
/etc/webmin/start#启动
/etc/webmin/stop#停止

6)防火墙放开6666端口

1
2
3
firewall -cmd--zone=public --add-port=6666/tcp --permanent#配置防火墙开放6666端口
firewall -cmd--reload#更新防火墙配置
firewall -cmd--zone=public --list-ports#查看已经开放的端口号

7)登录webmin

http://ip:6666可以访问了

用root账号和重置的新密码test

25.2 bt(宝塔)

25.2.1基本介绍

bt宝塔Linux面板是提升运维效率的服务器管理软件,支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等多项服务器管理功能。

25.2.2 安装使用

1)安装

1
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

&&代表先执行前面的命令,在执行后面的命令。

2)安装成功后控制台会显示登录地址,账户密码,复制浏览器打开登录,

25.2.3 如果bt的用户名,密码忘记了,使用btdefault可以查看

1
by default

二十六、Linux应用实例

案例1:分析日志t.log(访问量),将各个ip地址截取,并统计出现次数,并按从大到小排序

1
2
3
4
5
6
7
8
t.txt
http://192.168.200.10/index1.html
http://192.168.200.10/index2.html
http://192.168.200.20/index1.html
http://192.168.200.30/index1.html
http://192.168.200.40/index1.html
http://192.168.200.30/order.html
http://192.168.200.10/order.html
1
cat t.txt | cut -d '/' -f 3 | sort | uniq -c | sort -nr

cut是split命令,-d是指定分割符号(不可以是空格),-f是取出第几列,uniq -c 统计命令是统计相邻行相同的数量

案例2:统计连接到服务器的各个ip情况,并按连接数从大到小排序

1
netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}' | sort | uniq -c | sort -nr

案例3:如忘记了mysql5.7数据库的ROOT用户的密码,如何找回?

1
2
3
4
5
6
7
8
9
10
11
12
vim /etc/my.cnf

skip-grant-tables #加上一行,跳过密码

service mysqld.service #重启mysqld服务
mysql -u root -p #登录
show databases;
use mysql;
show tables;
desc users;
update user set authentication_string=password("xinmima") where user='root';
flush privileges;

案例4:统计ip访问情况,要求分析nginx访问日志(access.log),找出访问页面数量在前2位的ip

1
cat access.log | awk -F " " '{print $1}' | sort | uniq -c | sort -nr | head -2

案例5:使用tcpdump监听本机,将来自ip192.168.200.1,tcp端口为22的数据,保存输出到tcpdump.log,用做将来数据分析

1
tcpdump -i ens33 host 192.168.200.1 and port 22 >> /opt/tcpdump.log

监听网络设备ens33

案例6:常用的Nginx模块,用来做什么

1
2
3
4
5
6
7
rewrite模块,实现重写功能
access模块:来源控制
ssl模块:安全加密
ngx_http_gzip_module:网络传输压缩模块
ngx_http_proxy_module:模块实现代理
ngx_http_upstream_module:模块实现定义后端服务器列表
ngx_cache_purge:实现缓存清除功能

案例7:如果你是系统管理员,在进行Linux系统权限划分时,应考虑哪些因素?

  1. 注意权限分离,比如:工作中,Linux系统权限和数据库权限不要在同一个部门

  2. 权限最小原则(即:在满足使用的情况下最少优先)

  3. 减少使用root用户,尽量用普通用户+sudo提权进行日常操作。

  4. 重要的系统文件,比如/etc/passwd,/etc/shadowetc/fstab,/etc/sudoers等,日常建议使用chattr(change attribute)锁定,需要操作时再打开。【演示比如:锁定/etc/passwd让任何用户都不能随意useradd,除非解除锁定】

    1
    chattr +i /etc/passwd #锁定文件
  5. 使用SUID,SGID,Sticky设置特殊权限。

  6. 可以利用工具,比如chkrootkit或者rootkit hunter检测rootkit脚本(rootkit是入侵者使用工具,在不察觉的建立了入侵系统途径)[演示使用wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz]

  7. 利用工具Tripwire检测文件系统完整性

案例8:权限操作思考题

(1)用户tom对目录/home/test有执行x和读r写w权限,/home/test/hello.java是只读文件,问tom对hello.java文件能读吗(ok)?能修改吗(no)?能删除吗?(ok)

(2)用户tom对目录/home/test只有读写权限,/home/test/hello.java是只读文件,问tom对hello.java文件能读吗(no)?能修改吗(no)?能删除吗(no)?

(3)用户tom对目录/home/test只有执行权限x,/home/test/hello.java是只读文件,问tom对hello.java文件能读吗(ok)?能修改吗(no)?能删除吗(no)?

(4)用户tom对目录/home/test只有执行x和写w权限,/home/test/hello.java是只读文件,问tom对hello.java文件能读吗(ok)?能修改吗(no)?能删除吗(ok)?

案例9:列举Linux高级命令,至少6个

1
2
3
4
5
6
7
netstat #网络状态监控
top #系统运行状态
lsblk #查看硬盘分区
find
ps -aux #查看运行进程
chkconfig #查看服务启动状态
systemctl #管理系统服务器

案例10:Linux查看内存、io读写、磁盘存储、端口占用、进程查看命令是什么?

1
top,iotop,df -lh,netstat -tunlp,ps -aux | grep 关心的进程

案例11:使用Linux命令计算t2.txt第二列的和并输出

1
cat t2.txt | awk -F " " '{sum+=$2} END {print sum}'

案例12:Shell脚本里如何检查一个文件是否存在?

1
if [ -f 文件名 ] then echo "存在" else echo "不存在" fi

案例13:用shell写一个脚本,对文本t3.txt中无序的一列数字排序,并将总和输出

1
sort -nr t3.txt | awk '{sum+=$0; print $0} END {print "和="sum}'

案例14:请用指令写出查找当前文件夹(/home)下所有的文本文件内容中包含有字符“cat”的文件名称

1
grep -r "cat" /home | cut -d ":" -f 1

案例15:请写出统计/home目录下所有文件个数和所有文件总行数的指令

1
2
find /home -name "*.*" | wc -l
find /home -name "*.*" | xargs wc -l

案例16:每天晚上10点30分,打包站点目录/var/spool/mail备份到/home目录下(每次备份按时间生成不同的备份包比如按照年月日时分秒)

1
2
3
4
5
6
7
8
9
10
crontab -e

30 22 * * * test.sh

vim test.sh

#!/bin/bash
cd /var/spool/ && /bin/tar zcf /home/mail-`date +%Y-%m-%d_%H%M%S`.tar.gz mail

chomd 777 test.sh

案例17:如何优化Linux系统,说出你的方法

(1)不用root,使用sudo提示权限

(2)定时的自动更新服务时间,使用nptdate npt1.aliyun.com,让croud定时更新

(3)配置yum源,指向国内镜像(清华,163)

(4)配置合理的防火墙策略,打开必要的端口,关闭不必要的端口

(5)打开最大文件数(调整文件的描述的数量)vim /etc/profile ulimit -SHn 65535

(6)配置合理的监控策略

(7)配置合理的系统重要文件的备份策略

(8)对安装的软件进行优化,比如nginx,apache

(9)内核参数进行优化/etc/sysctl.conf

(10)锁定一些重要的系统文件chattr/etc/passwd /ect/shadow /etc/inittab

(11)禁用不必要的服务setup,ntsysv


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!