Fork me on GitHub

rsync

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

rsync

rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。

rsync特性

它的特性如下:

  • 可以镜像保存整个目录树和文件系统。

  • 可以很容易做到保持原来文件的权限、时间、软硬链接等等。

  • 无须特殊权限即可安装。

  • 快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。

  • 安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接。

  • 支持匿名传输,以方便进行网站镜像。

rsync官网:rsysc

与scp命令比较

优点:

  • 支持增量备份。

  • 选择性的保持 : 符号链接,硬链接,文件属性,权限 及时间 等。

  • 传输前执行压缩。适用亍异地备份 ,镜像服务器等应用 。

  • 使用ssh做为传输端口。 sftp ,ssh

区别:

当文件数据很大时候:

  • scp 无法备份大量数据, 特点: 先统一信息,像windows复制。
  • rsync 边复制,边比较,边统计。

端口: 873
模式:C/S 。 如果直接使用命令rsync,就是点到点传输。

备份源

何为备份源?

在远程同步任务中,负责发起rsync同步操作的客户机称为发起端,而负责响应来自客机的rsync同步操作的服务器称为备份源。

安装rsync

1
2
3
4
5
6
[root@server222 ~]# rpm -qf `which rsync`
rsync-3.0.9-18.el7.x86_64
[root@server222 ~]# rpm -ivh /mnt/cdrom/Packages/rsync-3.0.9-18.el7.x86_64.r pm
警告:/mnt/cdrom/Packages/rsync-3.0.9-18.el7.x86_64.rpm: 头V3 RSA/SHA256 Signatu re, 密钥 ID f4a80eb5: NOKEY
准备中... ################################# [100%]
软件包 rsync-3.0.9-18.el7.x86_64 已经安装

安装xinetd服务来管理rsync服务

1
2
3
4
5
[root@server222 cdrom]# rpm -ivh /mnt/cdrom/Packages/xinetd-2.3.15-13.el7.x86_64.rpm
警告:/mnt/cdrom/Packages/xinetd-2.3.15-13.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:xinetd-2:2.3.15-13.el7 ################################# [100%]

开启rsync 服务

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@server222 ~]# systemctl restart rsyncd
[root@server222 ~]# systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; disabled; vendor preset: disabled)
Active: active (running) since 四 2019-08-22 23:57:10 CST; 2s ago
Main PID: 14359 (rsync)
CGroup: /system.slice/rsyncd.service
└─14359 /usr/bin/rsync --daemon --no-detach

8月 22 23:57:10 server222 systemd[1]: Started fast remote file copy program ...n.
8月 22 23:57:10 server222 systemd[1]: Starting fast remote file copy program.....
8月 22 23:57:11 server222 rsyncd[14359]: rsyncd version 3.0.9 starting, liste...3
Hint: Some lines were ellipsized, use -l to show in full.

监听端口

1
2
3
[root@server222 ~]# netstat -antup | grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 14359/rsync
tcp6 0 0 :::873 :::* LISTEN 14359/rsync

rsync 命令的基本用法

格式:rsync 【选项】 源文件 目标文件

常见的选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-a,--archive(存档) 归档模式,表示以递归的方式传输文件,并且保持文件属性,等同亍加了参数-rlptgoD
-r,–recursive 对子目彔以递归模式处理
-l,--links 表示拷贝链接文件
-p , --perms 表示保持文件原有权限
-t , --times 表示保持文件原有时间
-g , --group 表示保持文件原有属用户组
-o , --owner 表示保持文件原有属主
-D , --devices 表示块设备文件信息
-z , --compress 表示压缩传输
-H 表示硬连接文件
-A 保留ACL 属性信息
-P 显示传输进度
-u, --update 仅仅进行更新,也就是跳过所有已经存在亍目标位置,并且文件时间晚亍要备份的文件。(丌
覆盖更新的文件)
--port=PORT 指定其他的rsync服务端口 873
--delete 删除那些目标位置有而原始位置没有的文件
--password-file=FILE 从FILE 中得到密码
--bwlimit=KBPS 限制I/O 带宽,Kbytes /second
--filter “- 文件名”需要过滤的文件
--exclude= :需要过滤的文件
-v 显示同步过程的详细信息

–delete 删除那些目标位置有而原始位置没有的文件

例如 目彔/web : /back a.txt

实战1:

client111:192.168.176.111

server222:192.168.176.222

备份server222的/mnt 目录到client111 的/root/mnt。
创建用户hary用于下载、读;创建用户natasha 用于上传、写。

创建用户

1
2
3
4
5
6
7
8
[root@server222 ~]# useradd hary
[root@server222 ~]# useradd natasha
[root@server222 ~]# echo '123456' | passwd --stdin hary
更改用户 hary 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@server222 ~]# echo '123456' | passwd --stdin natasha
更改用户 natasha 的密码 。
passwd:所有的身份验证令牌已经成功更新。

设置权限

1
2
3
[root@server222 ~]# setfacl -R -m user:hary:r-x /mnt

[root@server222 ~]# setfacl -R -m user:natasha:rwx /mnt

创建测试数据

1
2
3
4
5
[root@server222 mnt]# echo "123qwe" > 123qwe
[root@server222 mnt]# ls
123qwe cdrom
[root@server222 mnt]# cat 123qwe
123qwe

client111同步数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@client111 ~]# mkdir /root/mnt
[root@client111 ~]# cd /root/mnt/
[root@client111 mnt]# pwd
/root/mnt
[root@client111 mnt]# rsync -azP --delete natasha@192.168.176.222:/mnt/ /root/mnt
natasha@192.168.176.222's password:
..........

sent 74971 bytes received 4361814808 bytes 10918372.41 bytes/sec
total size is 4515096809 speedup is 1.04
[root@client111 mnt]# ls
123qwe cdrom
[root@client111 mnt]# cat 123qwe
123qwe

实战2:

使用ssh 密钥实现无交亏备份。做成脚本,将server222上的数据,定期备份到client111上。

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
[root@client111 mnt]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):#直接回库
Enter passphrase (empty for no passphrase):#直接回库
Enter same passphrase again:#直接回库
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:SsPRWpKt+9+YLYH4IcfSGFsH/rKlKFxb3QzwqC/DdMs root@client111
The key's randomart image is:
+---[RSA 2048]----+
| |
| +o |
| +.+= |
| ..*+ + |
| *XS= + |
| .X+X = o |
| . +o% B . |
| o *.E .= |
| . o..+.o |
+----[SHA256]-----+
[root@client111 mnt]# ssh copy id hary@192.168.176.222
ssh: Could not resolve hostname copy: Name or service not known
[root@client111 mnt]# ssh-copy-id hary@192.168.176.222
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
hary@192.168.176.222's password:


Number of key(s) added: 1

Now try logging into the machine, with: "ssh 'hary@192.168.176.222'"
and check to make sure that only the key(s) you wanted were added.

测试hary登陆server222

1
2
3
4
[root@client111 mnt]# ssh hary@192.168.176.222
Last failed login: Sat Aug 24 00:59:25 CST 2019 from 192.168.176.111 on ssh:notty
There were 2 failed login attempts since the last successful login.
[hary@server222 ~]$

编写脚本

1
2
3
4
[root@client111 mnt]# vim /root/rsync-ssh-get-mnt.sh
[root@client111 mnt]# cat /root/rsync-ssh-get-mnt.sh
#!/bin/bash
rsync -az --delete hary@192.168.176.222:/mnt/ /root/mnt/

测试脚本

1
2
3
4
5
6
7
[root@client111 mnt]# chmod +x /root/rsync-ssh-get-mnt.sh
[root@client111 mnt]# rm -rf /root/mnt/*
[root@client111 mnt]# pwd
/root/mnt
[root@client111 mnt]# ls
[root@client111 mnt]#
[root@client111 mnt]# /root/rsync-ssh-get-mnt.sh

定期备份

1
2
3
4
5
6
[root@client111 ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@client111 ~]# crontab -l
01 3 * * * /root/rsync-ssh-get-mnt.sh &
# 每天的凌晨3点10分执行脚本

LNMP

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

LNMP

LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。

Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统。代表版本有:debian、centos、ubuntu、fedora、gentoo等。

Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。

Mysql是一个小型关系型数据库管理系统

PHP是一种在服务器端执行的嵌入HTML文档的脚本语言。

这四种软件均为免费开源软件,组合到一起,成为一个免费、高效、扩展性强的网站服务系统。

LNMP特点

​ LNMP动态网站部署架构是一套由Linux + Nginx + MySQL + PHP组成的动态网站系统解决方案,具有免费、高效、扩展性强且资源消耗低等优良特性。

​ Nginx是一款相当优秀的用于部署动态网站的轻量级服务程序,它最初是为俄罗斯门户站点而开发的,因其稳定性、功能丰富、占用内存少且并发能力强而备受用户的信赖。目前国内诸如新浪、网易、腾讯等门户站点均已使用了此服务。

Nginx服务程序的稳定性源自于采用了分阶段的资源分配技术,降低了CPU与内存的占用率,所以使用Nginx程序部署的动态网站环境不仅十分稳定、高效,而且消耗的系统资源也很少。此外,Nginx具备的模块数量与Apache具备的模块数量几乎相同,而且现在已经完全支持proxy、rewrite、mod_fcgi、ssl、vhosts等常用模块。更重要的是,Nginx还支持热部署技术,可以7×24不间断提供服务,还可以在不暂停服务的情况下直接对Nginx服务程序进行升级。

坦白来讲,虽然Nginx程序的代码质量非常高,代码很规范,技术成熟,模块扩展也很容易,但依然存在不少问题,比如是由俄罗斯人开发的,所以在资料文档方面还并不完善,中文资料的质量更是鱼龙混杂。但是Nginx服务程序在近年来增长势头迅猛,相信会在轻量级Web服务器市场具有不错的未来。

​ PHP(Hypertxt Preprocessor,超文本预处理器)是一种通用的开源脚本语言,发明于1995年,它吸取了C语言、Java语言及Perl语言的很多优点,具有开源、免费、快捷、跨平台性强、效率高等优良特性,是目前Web开发领域最常用的语言之一。

LNMP优点

作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率。

作为负载均衡服务器:Nginx 既可以在内部直接支持RailsPHP,也可以支持作为 HTTP代理服务器对外进行服务。Nginx 用C编写,不论是系统资源开销还是CPU使用效率都比Perlbal要好的多。

作为邮件代理服务器:Nginx同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last/fm 描述了成功并且美妙的使用经验。

Nginx 安装非常的简单,配置文件非常简洁(还能够支持perl语法)。Nginx支持平滑加载新的配置,还能够在不间断服务的情况下进行软件版本的升级。

源码包安装

在使用源码包安装服务程序之前,首先要让安装主机具备编译程序源码的环境,他需要具备C语言、C++语言、Perl语言的编译器,以及各种常见的编译支持函数库程序。因此请先配置妥当Yum软件仓库

配置yum仓库

1
2
3
4
5
6
7
8
9
10
[root@server222 ~]# tail -n 1 /etc/fstab
/dev/cdrom /mnt/cdrom iso9660 defaults 0 0
[root@server222 ~]# vim /etc/yum.repos.d/bendi.repo
[root@server222 ~]# cat /etc/yum.repos.d/bendi.repo
[bendi]
name=///mnt/cdrom
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=0
[root@server222 ~]# mount -a

安装软件包

1
[root@server222 ~]# yum install -y apr* autoconf automake bison bzip2 bzip2* compat* cpp curl curl-devel fontconfig fontconfig-devel freetype freetype* freetype-devel gcc gcc-c++ gd gettext gettext-devel glibc kernel kernel-headers keyutils keyutils-libs-devel krb5-devel libcom_err-devel libpng libpng-devel libjpeg* libsepol-devel libselinux-devel libstdc++-devel libtool* libgomp libxml2 libxml2-devel libXpm* libtiff libtiff* make mpfr ncurses* ntp openssl openssl-devel patch pcre-devel perl php-common php-gd policycoreutils telnet t1lib t1lib* nasm nasm* wget zlib-devel

下载源码包以及系统软件包

​ 然后我们安装LNMP动态网站部署架构所需的16个软件源码包和1个用于检查效果的论坛网站系统软件包

此处建议把要安装的软件包存放在/usr/local/src目录中。

首先我们创建/usr/local/src目录

1
[root@server222 ~]# mkdir /usr/local/src

源码包文件已经放到百度云盘里面,下载下来传到Linux系统里面/usr/local/src目录即可

链接:https://pan.baidu.com/s/1X-eh_SRBbpXcVuxcu62VTA
提取码:ox0w
复制这段内容后打开百度网盘手机App,操作更方便哦

1
2
3
4
5
6
7
8
[root@server222 ~]# cd /usr/local/src
[root@server222 src]# ls
cmake-2.8.11.2.tar.gz libpng-1.6.12.tar.gz php-5.5.14.tar.gz
Discuz_X3.2_SC_GBK.zip libvpx-v1.3.0.tar.bz2 t1lib-5.1.2.tar.gz
freetype-2.5.3.tar.gz mysql-5.6.19.tar.gz tiff-4.0.3.tar.gz
jpegsrc.v9a.tar.gz nginx-1.6.0.tar.gz yasm-1.2.0.tar.gz
libgd-2.1.0.tar.gz openssl-1.0.1h.tar.gz zlib-1.2.8.tar.gz
libmcrypt-2.5.8.tar.gz pcre-8.35.tar.gz

如果是17个包就算OK,差一个都不行

安装编译工具

cmake是Linux系统中一款常用的编译工具。

1
2
3
[root@server222 src]# tar xzvf cmake-2.8.11.2.tar.gz
[root@server222 src]# cd cmake-2.8.11.2/
[root@server222 cmake-2.8.11.2]# ./configure ; make ; make install

此处命令./configure ; make ; make install

格式为 命令A ; 命令B ; 命令C

这里意思是先执行命令A再执行命令B最后执行命令C

配置MySQL服务

​ 在使用Yum软件仓库安装服务程序时,系统会自动根据RPM软件包中的指令集完整软件配置等工作。但是一旦选择使用源码包的方式来安装,这一切就需要自己来完成了。针对MySQL数据库来讲,我们需要在系统中创建一个名为mysql的用户,专门用于负责运行MySQL数据库。请记得要把这类账户的Bash终端设置成nologin解释器,避免黑客通过该用户登录到服务器中,从而提高系统安全性。

1
2
[root@server222 cmake-2.8.11.2]# cd ..
[root@server222 src]# useradd mysql -s /sbin/nologin

​ 创建一个用于保存MySQL数据库程序和数据库文件的目录,并把该目录的所有者和所属组身份修改为mysql。其中,/usr/local/mysql是用于保存MySQL数据库服务程序的目录,/usr/local/mysql/var则是用于保存真实数据库文件的目录。

1
2
[root@server222 src]# mkdir -p /usr/local/mysql/var
[root@server222 src]# chown -Rf mysql:mysql /usr/local/mysql

​ 接下来解压、编译、安装MySQL数据库服务程序。在编译数据库时使用的是cmake命令

-DCMAKE_INSTALL_PREFIX参数用于定义数据库服务程序的保存目录

-DMYSQL_DATADIR参数用于定义真实数据库文件的目录

-DSYSCONFDIR则是定义MySQL数据库配置文件的保存目录

1
2
3
[root@server222 src]# tar xzvf mysql-5.6.19.tar.gz
[root@server222 src]# cd mysql-5.6.19/
[root@server222 mysql-5.6.19]# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/var -DSYSCONFDIR=/etc ; make ; make install

​ 为了让MySQL数据库程序正常运转起来,需要先删除/etc目录中的默认配置文件,然后在MySQL数据库程序的保存目录scripts内找到一个名为mysql_install_db的脚本程序,执行这个脚本程序并使用–user参数指定MySQL服务的对应账号名称(在前面步骤已经创建),使用–basedir参数指定MySQL服务程序的保存目录,使用–datadir参数指定MySQL真实数据库的文件保存目录,这样即可生成系统数据库文件,也会生成出新的MySQL服务配置文件。

1
2
3
[root@server222 mysql-5.6.19]# rm -rf /etc/my.cnf
[root@server222 mysql-5.6.19]# cd /usr/local/mysql
[root@server222 mysql]# ./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var

​ 把系统新生成的MySQL数据库配置文件链接到/etc目录中,然后把程序目录中的开机程序文件复制到/etc/rc.d/init.d目录中,以便通过service命令来管理MySQL数据库服务程序。记得把数据库脚本文件的权限修改成755以便于让用户有执行该脚本的权限

1
2
3
[root@server222 mysql]# ln -s my.cnf /etc/my.cnf
[root@server222 mysql]# cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@server222 mysql]# chmod 755 /etc/rc.d/init.d/mysqld

​ 编辑刚复制的MySQL数据库脚本文件,把第46、47行的basedir与datadir参数分别修改为MySQL数据库程序的保存目录和真实数据库的文件内容。

1
2
3
4
5
[root@server222 mysql]# vim /etc/rc.d/init.d/mysqld
45
46 basedir=/usr/local/mysql
47 datadir=/usr/local/mysql/var
48

:set nu 查看行

​ 配置好脚本文件后便可以用service命令启动mysqld数据库服务了。mysqld是MySQL数据库程序的服务名称,注意不要写错。顺带再使用chkconfig命令把mysqld服务程序加入到开机启动项中。

1
2
3
[root@server222 mysql]# service mysqld start
Starting MySQL. SUCCESS!
[root@server222 mysql]# chkconfig mysqld on

​ MySQL数据库程序自带了许多命令,但是Bash终端的PATH变量并不会包含这些命令所存放的目录,因此我们也无法顺利地对MySQL数据库进行初始化,也就不能使用MySQL数据库自带的命令了。想要把命令所保存的目录永久性地定义到PATH变量中,需要编辑/etc/profile文件并写入追加的命令目录,这样当物理设备在下一次重启时就会永久生效了。如果不想通过重启设备的方式来生效,也可以使用source命令加载一下/ect/profile文件,此时新的PATH变量也可以立即生效了。

1
2
3
4
5
6
[root@server222 mysql]# vim /etc/profile
73 done
74 export PATH=$PATH:/usr/local/mysql/bin
75 unset i
76 unset -f pathmunge
[root@server222 mysql]# source /etc/profile

​ MySQL数据库服务程序还会调用到一些程序文件和函数库文件。由于当前是通过源码包方式安装MySQL数据库,因此现在也必须以手动方式把这些文件链接过来。

1
2
3
4
[root@server222 mysql]# mkdir /var/lib/mysql
[root@server222 mysql]# ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql
[root@server222 mysql]# ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock
[root@server222 mysql]# ln -s /usr/local/mysql/include/mysql /usr/include/mysql

​ 现在,MySQL数据库服务程序已经启动,调用的各个函数文件已经就位,PATH环境变量中也加入了MySQL数据库命令的所在目录。接下来准备对MySQL数据库进行初始化

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
[root@server222 mysql]# mysql_secure_installation



NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!

In order to log into MySQL to secure it, we'll need the current
password for the root user. If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] y (要为root管理员设置数据库的密码)
New password: 输入要为root管理员设置的数据库密码
Re-enter new password: 再输入一次密码
Password updated successfully!
Reloading privilege tables..
... Success!


By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y (删除匿名账户)
... Success!

Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y (禁止root管理员从远程登录)
... Success!

By default, MySQL comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y (删除test数据库并取消对其的访问权限)
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y (刷新授权表,让初始化后的设定立即生效)
... Success!




All done! If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!


Cleaning up...

配置Nginx服务

​ 在正式安装Nginx服务程序之前,我们还需要为其解决相关的软件依赖关系,下面来解压、编译、生成、安装Nginx服务程序的源码文件:

1
2
3
4
[root@server222 mysql]# cd /usr/local/src
[root@server222 src]# tar xzvf pcre-8.35.tar.gz
[root@server222 src]# cd pcre-8.35
[root@server222 pcre-8.35]# ./configure --prefix=/usr/local/pcre ;make ; make install

​ openssl软件包是用于提供网站加密证书服务的程序文件,在安装该程序时需要自定义服务程序的安装目录,以便于稍后调用它们的时候更可控。

1
2
3
4
[root@server222 pcre-8.35]# cd /usr/local/src
[root@server222 src]# tar xzvf openssl-1.0.1h.tar.gz
[root@server222 src]# cd openssl-1.0.1h
[root@server222 openssl-1.0.1h]# ./config --prefix=/usr/local/openssl ; make ; make install

​ openssl软件包安装后默认会在/usr/local/openssl/bin目录中提供很多的可用命令,我们需要像前面的操作那样,将这个目录添加到PATH环境变量中,并写入到配置文件中,最后执行source命令以便让新的PATH环境变量内容可以立即生效:

1
2
3
4
5
6
[root@server222 openssl-1.0.1h]# vim /etc/profile
73 done
74 export PATH=$PATH:/usr/local/mysql/bin:/usr/local/openssl/bin
75 unset i
76 unset -f pathmunge
[root@server222 openssl-1.0.1h]# source /etc/profile

使用:set nu 命令显示数字

​ zlib软件包是用于提供压缩功能的函数库文件。

1
2
3
4
[root@server222 openssl-1.0.1h]# cd /usr/local/src
[root@server222 src]# tar xzvf zlib-1.2.8.tar.gz
[root@server222 src]# cd zlib-1.2.8
[root@server222 zlib-1.2.8]# ./configure --prefix=/usr/local/zlib ; make ; make install

​ 在安装部署好具有依赖关系的软件包之后,创建一个用于执行Nginx服务程序的账户。账户名称可以自定义,但一定别忘记,因为在后续需要用到

1
2
[root@server222 zlib-1.2.8]# cd ..
[root@server222 src]# useradd www -s /sbin/nologin

​ 在使用命令编译Nginx服务程序时,需要设置特别多的参数

–prefix参数用于定义服务程序稍后安装到的位置

–user与–group参数用于指定执行Nginx服务程序的用户名和用户组

1
2
3
[root@server222 src]# tar xzvf nginx-1.6.0.tar.gz
[root@server222 src]# cd nginx-1.6.0/
[root@server222 nginx-1.6.0]# ./configure --prefix=/usr/local/nginx --without-http_memcached_module --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-openssl=/usr/local/src/openssl-1.0.1h --with-zlib=/usr/local/src/zlib-1.2.8 --with-pcre=/usr/local/src/pcre-8.35 ; make ; make install

​ 要想启动Nginx服务程序以及将其加入到开机启动项中,也需要有脚本文件。可惜的是,在安装完Nginx软件包之后默认并没有为用户提供脚本文件

此处代码复制粘贴即可

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
[root@server222 nginx-1.6.0]# vim /etc/rc.d/init.d/nginx
[root@server222 nginx-1.6.0]# cat /etc/rc.d/init.d/nginx
#!/bin/bash
# nginx - this script starts and stops the nginx daemon
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /usr/local/nginx/conf/nginx.conf
# pidfile: /usr/local/nginx/logs/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
if [ -z "`grep $user /etc/passwd`" ]; then
useradd -M -s /bin/nologin $user
fi
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
#configtest || return $?
stop
sleep 1
start
}
reload() {
#configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac

保存脚本文件后记得为其赋予755权限,以便能够执行这个脚本

然后以绝对路径的方式执行这个脚本,通过restart参数重启Nginx服务程序

最后再使用chkconfig命令将Nginx服务程序添加至开机启动项中

1
2
3
4
5
[root@server222 nginx-1.6.0]# chmod 755 /etc/rc.d/init.d/nginx
[root@server222 nginx-1.6.0]# /etc/rc.d/init.d/nginx restart
Reloading systemd: [ 确定 ]
Restarting nginx (via systemctl): [ 确定 ]
[root@server222 nginx-1.6.0]# chkconfig nginx on

Nginx服务程序在启动后就可以在浏览器中输入服务器的IP地址来查看到默认网页了。相较于Apache服务程序的红色默认页面,Nginx服务程序的默认页面显得更加简洁。

配置PHP服务

解决PHP的程序包和其他软件的依赖关系。

需要先安装部署将近十个用于搭建网站页面的软件程序包,然后才能正式安装PHP程序。

yasm libmcrypt libvpx tiff libpng freetype jpeg libgd t1lib

yasm源码包是一款常见的开源汇编器

1
2
3
4
[root@server222 nginx-1.6.0]# cd ..
[root@server222 src]# tar zxvf yasm-1.2.0.tar.gz
[root@server222 src]# cd yasm-1.2.0
[root@server222 yasm-1.2.0]# ./configure ; make ; make install

libmcrypt源码包是用于加密算法的扩展库程序

1
2
3
4
[root@server222 yasm-1.2.0]# cd ..
[root@server222 src]# tar zxvf libmcrypt-2.5.8.tar.gz
[root@server222 src]# cd libmcrypt-2.5.8
[root@server222 libmcrypt-2.5.8]# ./configure ; make ; make install

libvpx源码包是用于提供视频编码器的服务程序

1
2
3
4
[root@server222 libmcrypt-2.5.8]# cd ..
[root@server222 src]# tar xjvf libvpx-v1.3.0.tar.bz2
[root@server222 src]# cd libvpx-v1.3.0
[root@server222 libvpx-v1.3.0]# ./configure --prefix=/usr/local/libvpx --enable-shared --enable-vp9 ; make ; make install

tiff源码包是用于提供标签图像文件格式的服务程序

1
2
3
4
[root@server222 libvpx-v1.3.0]# cd ..
[root@server222 src]# tar zxvf tiff-4.0.3.tar.gz
[root@server222 src]# cd tiff-4.0.3
[root@server222 tiff-4.0.3]# ./configure --prefix=/usr/local/tiff --enable-shared ; make ; make install

libpng源码包是用于提供png图片格式支持函数库的服务程序

1
2
3
4
[root@server222 tiff-4.0.3]# cd ..
[root@server222 src]# tar zxvf libpng-1.6.12.tar.gz
[root@server222 src]# cd libpng-1.6.12
[root@server222 libpng-1.6.12]# ./configure --prefix=/usr/local/libpng --enable-shared ;make ; make install

freetype源码包是用于提供字体支持引擎的服务程序

1
2
3
4
[root@server222 libpng-1.6.12]# cd ..
[root@server222 src]# tar zxvf freetype-2.5.3.tar.gz
[root@server222 src]# cd freetype-2.5.3
[root@server222 freetype-2.5.3]# ./configure --prefix=/usr/local/freetype --enable-shared ; make ; make install

jpeg源码包是用于提供jpeg图片格式支持函数库的服务程序

1
2
3
4
[root@server222 freetype-2.5.3]# cd ..
[root@server222 src]# tar zxvf jpegsrc.v9a.tar.gz
[root@server222 src]# cd jpeg-9a
[root@server222 jpeg-9a]# ./configure --prefix=/usr/local/jpeg --enable-shared ; make ; make install

libgd源码包是用于提供图形处理的服务程序

1
2
3
4
[root@server222 jpeg-9a]# cd ..
[root@server222 src]# tar zxvf libgd-2.1.0.tar.gz
[root@server222 src]# cd libgd-2.1.0
[root@server222 libgd-2.1.0]# ./configure --prefix=/usr/local/libgd --enable-shared --with-jpeg=/usr/local/jpeg --with-png=/usr/local/libpng --with-freetype=/usr/local/freetype --with-fontconfig=/usr/local/freetype --with-xpm=/usr/ --with-tiff=/usr/local/tiff --with-vpx=/usr/local/libvpx ; make ; make install

t1lib源码包是用于提供图片生成函数库的服务程序

1
2
3
4
5
6
[root@server222 libgd-2.1.0]# cd ..
[root@server222 src]# tar zxvf t1lib-5.1.2.tar.gz
[root@server222 src]# cd t1lib-5.1.2
[root@server222 t1lib-5.1.2]# ./configure --prefix=/usr/local/t1lib --enable-shared ; make ; make install
[root@server222 t1lib-5.1.2]# ln -s /usr/lib64/libltdl.so /usr/lib/libltdl.so
[root@server222 t1lib-5.1.2]# cp -frp /usr/lib64/libXpm.so* /usr/lib/

​ 在开始编译php源码包之前,先定义一个名为LD_LIBRARY_PATH的全局环境变量,该环境变量的作用是帮助系统找到指定的动态链接库文件,这些文件是编译php服务源码包的必须元素之一。编译php服务源码包时,除了定义要安装到的目录以外,还需要依次定义配置php服务程序配置文件的保存目录、MySQL数据库服务程序所在目录、MySQL数据库服务程序配置文件所在目录,以及libpng、jpeg、freetype、libvpx、zlib、t1lib等服务程序的安装目录路径,并通过参数启动php服务程序的诸多默认功能

1
2
3
4
5
[root@server222 t1lib-5.1.2]# cd ..
[root@server222 src]# tar -zvxf php-5.5.14.tar.gz
[root@server222 src]# cd php-5.5.14
[root@server222 php-5.5.14]# export LD_LIBRARY_PATH=/usr/local/libgd/lib
[root@server222 php-5.5.14]# ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-mysql-sock=/tmp/mysql.sock --with-pdo-mysql=/usr/local/mysql --with-gd --with-png-dir=/usr/local/libpng --with-jpeg-dir=/usr/local/jpeg --with-freetype-dir=/usr/local/freetype --with-xpm-dir=/usr/ --with-vpx-dir=/usr/local/libvpx/ --with-zlib-dir=/usr/local/zlib --with-t1lib=/usr/local/t1lib --with-iconv --enable-libxml --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --enable-opcache --enable-mbregex --enable-fpm --enable-mbstring --enable-ftp --enable-gd-native-ttf --with-openssl --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --without-pear --with-gettext --enable-session --with-mcrypt --with-curl --enable-ctype ; make ; make install

​ 在php源码包程序安装完成后,需要删除当前默认的配置文件,然后将php服务程序目录中相应的配置文件复制过来

1
2
3
4
5
[root@server222 php-5.5.14]# rm -rf /etc/php.ini
[root@server222 php-5.5.14]# ln -s /usr/local/php/etc/php.ini /etc/php.ini
[root@server222 php-5.5.14]# cp php.ini-production /usr/local/php/etc/php.ini
[root@server222 php-5.5.14]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
[root@server222 php-5.5.14]# ln -s /usr/local/php/etc/php-fpm.conf /etc/php-fpm.conf

​ php-fpm.conf是php服务程序重要的配置文件之一,我们需要启用该配置文件中第25行左右的pid文件保存目录,然后分别将第148和149行的user与group参数分别修改为www账户和用户组名称

1
2
3
4
5
6
7
8
9
10
[root@server222 php-5.5.14]# vim /usr/local/php/etc/php-fpm.conf
24 ; Default Value: none
25 pid = run/php-fpm.pid
26


147 ; will be used.
148 user = www
149 group = www
150

:set nu 可查看行数

​ 配置妥当后便可把用于管理php服务的脚本文件复制到/etc/rc.d/init.d中了。为了能够执行脚本,请记得为脚本赋予755权限。最后把php-fpm服务程序加入到开机启动项中

1
2
3
[root@server222 php-5.5.14]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
[root@server222 php-5.5.14]# chmod 755 /etc/rc.d/init.d/php-fpm
[root@server222 php-5.5.14]# chkconfig php-fpm on

​ 由于php服务程序的配置参数直接会影响到Web服务服务的运行环境,因此,如果默认开启了一些不必要且高危的功能(如允许用户在网页中执行Linux命令),则会降低网站被入侵的难度,入侵人员甚至可以拿到整台Web服务器的管理权限。因此我们需要编辑php.ini配置文件,在305行的disable_functions参数后面追加上要禁止的功能。

1
2
3
4
[root@server222 php-5.5.14]# vim /usr/local/php/etc/php.ini

304 ; http://php.net/disable-functions
305 disable_functions = passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restor e,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,escapeshellcmd,dll,popen,disk_free_space,checkdnsrr,checkdnsrr,g etservbyname,getservbyport,disk_total_space,posix_ctermid,posix_get_last_error,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid,po six_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix_getppid,posix_getpwnam,posix_ getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_isatty,posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid,posix_ setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname

​ 这样就把php服务程序配置妥当了。最后,还需要编辑Nginx服务程序的主配置文件,把第2行的井号(#)删除,然后在后面写上负责运行Nginx服务程序的账户名称和用户组名称;在第45行的index参数后面写上网站的首页名称。

​ 最后是将第65~71行参数前的井号(#)删除来启用参数,主要是修改第69行的脚本名称路径参数,其中$document_root变量即为网站信息存储的根目录路径,若没有设置该变量,则Nginx服务程序无法找到网站信息,因此会提示“404页面未找到”的报错信息。在确认参数信息填写正确后便可重启Nginx服务与php-fpm服务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@server222 php-5.5.14]# vim /usr/local/nginx/conf/nginx.conf
1
2 user www www;
3 worker_processes 1;
4

44 root html;
45 index index.html index.htm index.php forum.php;
46 }
47

64 #
65 location ~ \.php$ {
66 root html;
67 fastcgi_pass 127.0.0.1:9000;
68 fastcgi_index index.php;
69 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
70 include fastcgi_params;
71 }
72
73 # deny access to .htaccess files, if Apache's document root

[root@server222 php-5.5.14]# systemctl restart nginx
[root@server222 php-5.5.14]# systemctl restart php-fpm

从65行到71行的注释需要去掉

至此,LNMP动态网站环境架构的配置实验全部结束。

搭建Discuz!论坛

​ 为了检验LNMP动态网站环境是否配置妥当,可以使用在上面部署Discuz!系统,然后查看结果。如果能够在LNMP动态网站环境中成功安装使用Discuz!论坛系统,也就意味着这套架构是可用的。Discuz! X3.2是国内最常见的社区论坛系统,在经过十多年的研发后已经成为了全球成熟度最高、覆盖率最广的论坛网站系统之一。

​ Discuz! X3.2软件包的后缀是.zip格式,因此应当使用专用的unzip命令来进行解压。解压后会在当前目录中出现一个名为upload的文件目录,这里面保存的就是Discuz!论坛的系统程序。我们把Nginx服务程序网站根目录的内容清空后,就可以把这些这个目录中的文件都复制进去了。记得把Nginx服务程序的网站根目录的所有者和所属组修改为本地的www用户,并为其赋予755权限以便于能够读、写、执行该论坛系统内的文件。

1
2
3
4
5
6
[root@server222 php-5.5.14]# cd /usr/local/src/
[root@server222 src]# unzip Discuz_X3.2_SC_GBK.zip
[root@server222 src]# rm -rf /usr/local/nginx/html/{index.html,50x.html}*
[root@server222 src]# mv upload/* /usr/local/nginx/html/
[root@server222 src]# chown -Rf www:www /usr/local/nginx/html
[root@server222 src]# chmod -Rf 755 /usr/local/nginx/html

之后在浏览器输入192.168.176.222/install

依次按照傻瓜式步骤下一步

使用admin管理员账户登录

到此结束LNMP动态网站部署,如果您觉得不懂,可私信给我,后期将写一些部署docker容器虚拟化平台

RHCE 7版本认证考试练习

写在前面的话:考试练习不等于真实考试考题,里面的数据可能也与您考试练习的数据不一样,请认真仔细。祝愿RHCE取得好成绩!!

[TOC]

模拟考前配置

准备前

首先我们要将三台虚拟机开启
classroom是172.25.0.254

desktop是172.25.0.10

server是172.25.0.11

前提是三个主机能互相ping通

然后我们在本地上远程到classroom

1
2
3
[kiosk@foundation0 ~]$ ssh root@172.25.0.254
Last login: Sat Jul 6 09:08:15 2019 from 172.25.0.250
[root@classroom ~]#

等待远程过去之后

1
[root@classroom ~]# tail /etc/httpd/logs/error_log

将那段字母复制(NSS开头,off结尾的那段,具体我也不是带清楚)

1
[root@classroom ~]# vim /etc/httpd/conf.d/nss.conf

将你复制的那段粘贴到最底部,然后保存并退出

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
[root@classroom ~]# cd /var/www/html/pub/
[root@classroom pub]# echo "zheshi yige 在 server 上配置一个 web 站点" > example.html
[root@classroom pub]# echo "zheshi yige 在 server 上扩展您的 WEB 服务器" > www.html
[root@classroom pub]# echo "zheshi yige web 访问控制“ > private.html
[root@classroom pub]# vim webapp.wsgi
[root@classroom pub]# cat webapp.wsgi
def application(environ, start_response):
status = '200 OK'
output = 'Hello World!'

response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)

return [output]

[root@classroom pub]# vim user
[root@classroom pub]# cat user
user1
user2
user3
user4
user5

[root@foundation0 ~]# vim /etc/hosts
[root@foundation0 ~]# tail -n 1 /etc/hosts
172.25.0.11 server.example.com alt.example.com www.example.com
[root@foundation0 ~]# ssh root@172.25.0.10
Last login: Sat Jul 6 09:08:15 2019 from 172.25.0.10
[root@desktop0 ~]# vim /etc/hosts
[root@desktop0 ~]# tail -n 1 /etc/hosts
172.25.0.11 server.example.com alt.example.com www.example.com
[root@foundation0 ~]# ssh root@172.25.0.11
[root@server0 ~]# vim /etc/hosts
[root@desktop0 ~]# tail -n 1 /etc/hosts
172.25.0.11 server.example.com alt.example.com www.example.com

更改网卡在本地切换到root用户(此题需要做后面的链路聚合)

1
2
3
[kiosk@foundation0 ~]$ su -
Password:
[root@foundation0 ~]#

密码是:Asimov

1
[root@foundation0 ~]# virt-manager

按照这种方式,在server 和 desktop两台虚拟机里面添加两块网卡,保证有三快网卡

1
[root@foundation0 ~]# reboot

然后直接将整个大虚拟机重启

数据库文件因过繁多内容,此处数据库文件请找我进行拷贝。

打开火狐浏览器输入:http://classroom.example.com/

以上是模拟考试前需要做的,真实考试不需要配置以上步骤

下面就开始模拟考题

开始考题

请注意:由于本机环境原因上述模拟考前配置是正式考试前不需要做的,考者切记正式考试是不用做前面的东西

现在正式开始你的考试:

配置信息

您在考试中将使用到两个系统的信息如下:

desktop0.example.com : 作为服务器

server0.example.com : 作为客户端

两个系统root密码redhat

系统的IP地址有DHCP提供,您可以视为正常,或者您可以按照一下信息重新设置未静态IP:

server0.example.com : 172.24.8.11/24

desktop0.example.com : 172.24.8.10/24

两个系统均为DNS域example.com的成员。除非特别知名,所有要求配置的网络服务都必须能被该域的系统访问。

classroom.example.com提供了集中认证的服务器为example.com。两个系统desktop0和server0都已经预先配置成此域的客户端。

classroom.example.com 提供了YUM软件仓库,URL是 http://classroom.example.com/content/rhel7.0/x86_64/dvd/ .

防火墙是默认打开的,在您认为适当的时候可以关闭。其他防火墙的设置可能在单独的要求中。

my133.org(172.13.0.0/24)作为不可信网络。

》 》 》 》 》》》》》》》》》》》》》》》》》》》》》》》》

参考答案

1.配置 YUM

配置yum源考试时候是不作为考题的,需要考者自己去阅读配置文档,里面有说明

  • 分别在 server 和 desktop 上配置 YUM,指向:

server0

1
2
3
4
5
6
7
8
[root@server0 ~]# vim /etc/yum.repos.d/rhce.repo
[root@server0 ~]# cat /etc/yum.repos.d/rhce.repo
[rhce]
name=http://classroom.example.com/content/rhel7.0/x86_64/dvd/
baseurl=http://classroom.example.com/content/rhel7.0/x86_64/dvd/
enabled=1
gpgcheck=0
[root@server0 ~]#

desktop0

1
2
3
4
5
6
7
[root@desktop0 ~]# vim /etc/yum.repos.d/rhce.repo
[root@desktop0 ~]# cat /etc/yum.repos.d/rhce.repo
[rhce]
name=http://classroom.example.com/content/rhel7.0/x86_64/dvd/
baseurl=http://classroom.example.com/content/rhel7.0/x86_64/dvd/
enabled=1
gpgcheck=0

这一题是在真实考试中不做考题,您需要自己配置,yum源就在文中的信息当中,包括后面的各个域名的所归属的网段。您需要去阅读配置信息,这里配置信息在本博客开头部分。

2.配置 SELinux

  • SElinux 有三种模式,请将 server 与 desktop 运行于强制模式

server0

1
2
3
4
[root@server0 ~]# vim /etc/selinux/config
[root@server0 ~]# cat /etc/selinux/config | grep SELINUX=en
SELINUX=enforcing
[root@server0 ~]# reboot

desktop0

1
2
3
4
[root@desktop0 ~]# vim /etc/selinux/config
[root@desktop0 ~]# cat /etc/selinux/config | grep SELINUX=en
SELINUX=enforcing
[root@desktop0 ~]# reboot

其实可以不用reboot重启虚拟机,两边改完配置文件之后

我们可以这样

1
2
3
4
> [root@desktop0 ~]# setenforce 1
> [root@desktop0 ~]# getenforce
> Enforcing
>

配置文件也改为enforcing

同样我们也临时获取到Enforcing权限

接下来可不要忘记了另外一台虚拟机了哦

1
2
3
4
> [root@server0 ~]# setenforce 1
> [root@server0 ~]# getenforce
> Enforcing
>

3.配置 SSH

  • 用户能够从域 example.com 内的客户端通过 SSH 访问您的两个虚拟机系统
  • 在域 my133t.org 内的客户端不能访问您的两个虚拟机系统

server0

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@server0 ~]# systemctl stop iptables ebtables
[root@server0 ~]# systemctl disable iptables ebtables
[root@server0 ~]# systemctl mask iptables ebtables
ln -s '/dev/null' '/etc/systemd/system/iptables.service'
ln -s '/dev/null' '/etc/systemd/system/ebtables.service'
[root@server0 ~]# systemctl restart firewalld
[root@server0 ~]# systemctl enable firewalld
[root@server0 ~]# firewall-cmd --remove-service=ssh --permanent
success
[root@server0 ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=172.25.0.0/24 service name=ssh accept' --permanent
success
[root@server0 ~]# firewall-cmd --reload
success

desktop0

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@desktop0 ~]# systemctl stop iptables ebtables
[root@desktop0 ~]# systemctl disable iptables ebtables
[root@desktop0 ~]# systemctl mask iptables ebtables
ln -s '/dev/null' '/etc/systemd/system/iptables.service'
ln -s '/dev/null' '/etc/systemd/system/ebtables.service'
[root@desktop0 ~]# systemctl restart firewalld
[root@desktop0 ~]# systemctl enable firewalld
[root@desktop0 ~]# firewall-cmd --remove-service=ssh --permanent
success
[root@desktop0 ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=172.25.0.0/24 service name=ssh accept' --permanent
success
[root@desktop0 ~]# firewall-cmd --reload
success

做完这些操作之后,我们可以列出来查看一下,看看是否与我们想的一致

1
2
3
4
5
6
7
8
9
10
11
12
> [root@server0 ~]# firewall-cmd --list-all
> public (default, active)
> interfaces: eth0
> sources:
> services: dhcpv6-client
> ports:
> masquerade: no
> forward-ports:
> icmp-blocks:
> rich rules:
> rule family="ipv4" source address="172.25.0.0/24" service name="ssh" accept
>

从此处我们可以看出ssh这个服务没有了,从而添加上了允许172.25.0.0/24这个网段的主机去访问,与我们所想的一致,接下来看看另外一个

1
2
3
4
5
6
7
8
9
10
11
12
> [root@desktop0 ~]# firewall-cmd --list-all
> public (default, active)
> interfaces: eth0
> sources:
> services: dhcpv6-client
> ports:
> masquerade: no
> forward-ports:
> icmp-blocks:
> rich rules:
> rule family="ipv4" source address="172.25.0.0/24" service name="ssh" accept
>

4.命令别名及IP 转发

1)在系统 server 和 desktop 上创建自定义命令为 tk,此自定义命令将执行/bin/ps aux,此命令对系统中所有用户有效

server0

1
2
3
4
5
6
7
[root@desktop0 ~]# vim /etc/bashrc
[root@desktop0 ~]# tail -n 1 /etc/bashrc
alias tk='/bin/ps aux'
[root@desktop0 ~]# bash
[root@desktop0 ~]# which tk
alias tk='/bin/ps aux'
/bin/ps

desktop0

1
2
3
4
5
6
7
[root@server0 ~]# vim /etc/bashrc 
[root@server0 ~]# tail -n 1 /etc/bashrc
alias tk='/bin/ps aux'
[root@server0 ~]# bash
[root@server0 ~]# which tk
alias tk='/bin/ps aux'
/bin/ps

此题过于简单,这里就不过多解释

2)开启 IP 转发功能

server0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@server0 ~]# cat /etc/sysctl.conf 
# System default settings live in /usr/lib/sysctl.d/00-system.conf.
# To override those settings, enter new settings here, or in an
.........................................
[root@server0 ~]# vim /usr/lib/sysctl.d/00-system.conf
[root@server0 ~]# cat /usr/lib/sysctl.d/00-system.conf
........................................
net.bridge.bridge-nf-call-arptables = 0
net.ipv4.ip_forward = 1 #在此处添加

........................................
[root@server0 ~]# sysctl -p /usr/lib/sysctl.d/00-system.conf
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
net.ipv4.ip_forward = 1 #有这个表示成功
kernel.shmmax = 4294967295
kernel.shmall = 268435456

同样在desktop 这台虚拟机上也要做,此处不做过多演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@desktop0 ~]# cat /etc/sysctl.conf 
# System default settings live in /usr/lib/sysctl.d/00-system.conf.
# To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
[root@desktop0 ~]# vim /usr/lib/sysctl.d/00-system.conf
[root@desktop0 ~]# sysctl -p /usr/lib/sysctl.d/00-system.conf
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
net.ipv4.ip_forward = 1
kernel.shmmax = 4294967295
kernel.shmall = 268435456
[root@desktop0 ~]#

5.端口转发

  • 在 server 上配置端口转发,在 172.25.0.0/24 中的系统,访问 server 的本地端口 9527 将被转发到 80,此设置永久生效

server0

1
2
3
4
[root@server0 ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=172.25.0.0/24 forward-port port=9527 protocol=tcp to-port=80' --permanent 
success
[root@server0 ~]# firewall-cmd --reload
success

可以用firewall-cmd --list-all命令来查看是否添加上去

1
2
3
4
5
6
7
8
9
10
11
12
13
> [root@server0 ~]# firewall-cmd --list-all
> public (default, active)
> interfaces: eth0
> sources:
> services: dhcpv6-client
> ports:
> masquerade: no
> forward-ports:
> icmp-blocks:
> rich rules:
> rule family="ipv4" source address="172.25.0.0/24" forward-port port="9527" protocol="tcp" to-port="80"
> rule family="ipv4" source address="172.25.0.0/24" service name="ssh" accept
>

切记:此题需要之在server0上面操作,而且考试中题目需要你在那操作就在那操作,切勿心急盲目

6.聚合网络

在 server 和 desktop 之间配置链路聚合

此链路使用接口 slave1 和 slave2

此链路在一个接口失效后,仍然能工作

此链路在 server 上使用地址 192.168.0.1/24

此链路在 desktop 上使用地址 192.168.0.2/24

此链路在系统重启后依然保持正常状态

server0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@server0 ~]# nmcli device 
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected System eth0
eth1 ethernet disconnected --
eth2 ethernet disconnected --
lo loopback unmanaged --
[root@server0 ~]# nmcli connection add type team con-name team0 ifname team0 config '{"runner":{"name":"activebackup"}}'
Connection 'team0' (f816c00c-0488-455e-8d17-d66004112ef7) successfully added.
[root@server0 ~]# nmcli connection modify team0 ipv4.addresses "192.168.0.1/24" ipv4.method manual connection.autoconnect yes
[root@server0 ~]# nmcli connection add type team-slave con-name slave1 ifname eth1 master team0
Connection 'slave1' (5276955f-cbd6-4ec3-82dc-daf6b0073998) successfully added.
[root@server0 ~]# nmcli connection add type team-slave con-name slave2 ifname eth2 master team0
Connection 'slave2' (26009b44-7428-4cb4-a2b6-41d5aa5f3cac) successfully added.
[root@server0 ~]# nmcli connection up team0
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
[root@server0 ~]# systemctl restart network

desktop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@desktop0 ~]# nmcli device 
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected System eth0
eth1 ethernet disconnected --
eth2 ethernet disconnected --
lo loopback unmanaged --
[root@desktop0 ~]# nmcli connection add type team con-name team0 ifname team0 config '{"runner":{"name":"activebackup"}}'
[root@desktop0 ~]# nmcli connection modify team0 ipv4.addresses "192.168.0.2/24" ipv4.method manual connection.autoconnect yes
[root@desktop0 ~]# nmcli connection add type team-slave con-name slave1 ifname eth1 master team0
Connection 'slave1' (5c6c05b2-63b9-4aca-b991-ab570f4e23bd) successfully added.
[root@desktop0 ~]# nmcli connection add type team-slave con-name slave2 ifname eth2 master team0
Connection 'slave2' (546bc410-6a94-4fff-9bef-398e54b2feff) successfully added.
[root@desktop0 ~]# nmcli connection up team0
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
[root@desktop0 ~]# systemctl restart network

最后我们验证以下

1
2
3
4
5
> [root@desktop0 ~]# ping 192.168.0.1
> PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
> 64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=1.17 ms
> 64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=0.301 ms
>

然后我们断掉一个接口

1
2
3
4
5
6
7
8
9
> [root@desktop0 ~]# nmcli connection down slave1
> [root@desktop0 ~]# ping 192.168.0.1
> PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
> 64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.582 ms
> ^C
> --- 192.168.0.1 ping statistics ---
> 1 packets transmitted, 1 received, 0% packet loss, time 0ms
> rtt min/avg/max/mdev = 0.582/0.582/0.582/0.000 ms
>

我们down掉其中一个接口,还能ping通

7.IPv6 设置

在您的考试系统上配置接口,在你的默认网卡上使用如下 IPv6 地址

server 上的 IP 地址应该是 fd00:ba5e:ba11:10::1/64

desktop 上的 IP 地址应该是 fd00:ba5e:ba11:10::2/64

两个系统必须能与网络 fd00:ba5e:ba11:10::cc 内的系统通信

地址必须在重启后依然生效

两个系统保持当前的 IPv4 地址并能通信

server0

1
2
3
4
5
6
7
8
[root@server0 ~]# nmcli connection show 
NAME UUID TYPE DEVICE
slave1 5276955f-cbd6-4ec3-82dc-daf6b0073998 802-3-ethernet eth1
team0 f816c00c-0488-455e-8d17-d66004112ef7 team team0
System eth0 5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03 802-3-ethernet eth0
slave2 26009b44-7428-4cb4-a2b6-41d5aa5f3cac 802-3-ethernet eth2
[root@server0 ~]# nmcli connection modify "System eth0" ipv6.addresses fd00:ba5e:ba11:10::1/64 ipv6.method manual connection.autoconnect yes
[root@server0 ~]# systemctl restart network

desktop

1
2
3
4
5
6
7
8
[root@desktop0 ~]# nmcli connection show 
NAME UUID TYPE DEVICE
slave1 5c6c05b2-63b9-4aca-b991-ab570f4e23bd 802-3-ethernet eth1
team0 8ccca14c-7275-4996-9d06-9bfd33cf7b3e team team0
System eth0 5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03 802-3-ethernet eth0
slave2 546bc410-6a94-4fff-9bef-398e54b2feff 802-3-ethernet eth2
[root@desktop0 ~]# nmcli connection modify "System eth0" ipv6.addresses "fd00:ba5e:ba11:10::2/64" ipv6.method manual connection.autoconnect yes
[root@desktop0 ~]# systemctl restart network

验证

1
2
3
4
5
6
7
8
9
> [root@desktop0 ~]# ping6 fd00:ba5e:ba11:10::1
> PING fd00:ba5e:ba11:10::1(fd00:ba5e:ba11:10::1) 56 data bytes
> 64 bytes from fd00:ba5e:ba11:10::1: icmp_seq=1 ttl=64 time=4.55 ms
> 64 bytes from fd00:ba5e:ba11:10::1: icmp_seq=2 ttl=64 time=0.413 ms
> ^C
> --- fd00:ba5e:ba11:10::1 ping statistics ---
> 2 packets transmitted, 2 received, 0% packet loss, time 1003ms
> rtt min/avg/max/mdev = 0.413/2.485/4.558/2.073 ms
>

有好多考者都在思考这么一个问题,

两个系统必须能与网络 fd00:ba5e:ba11:10::cc 内的系统通信

请问:你电脑能平通自己的网段吗,考题说的是能与这个网络里面得系统

8.邮件服务

在 server 上配置邮件服务

这些系统不接受外部发来的邮件

在这些系统上本地发送任何邮件都会被路由到 server1.example.com

从这些系统上发送的邮件显示来自于 example.com

您可以通过发送邮件到 harry 来测试您的配置

您可以通过访问 http://server1.example.com/email/harry 来验证您的配置(模拟环境上面没有这个地址,所以此题验证不了)

发给 harry 的邮件同时能被 natasha 收到

server0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@server0 ~]# vim /etc/postfix/main.cf 
myorigin = example.com #大概在99行
inet_interfaces = localhost #大概在117行,默认是localhost
mydestination = #大概在165行,将=号后面的删掉
mynetworks = 127.0.0.0/8 #大概在265行,仅需要127.0.0.0/8
relayhost = [server1.example.com] #大概在319行
#保存并退出
[root@server0 ~]# vim /etc/aliases
[root@server0 ~]# tail -n 1 /etc/aliases
harry: harry,natasha
[root@server0 ~]# useradd harry
[root@server0 ~]# useradd natasha
[root@server0 ~]# systemctl restart postfix.service
[root@server0 ~]# systemctl enable postfix.service
[root@server0 ~]# firewall-cmd --add-service=smtp --permanent
success
[root@server0 ~]# firewall-cmd --reload
success

因为环境原因此题无法验证,真实考试环境中是可以验证的具体验证如下

1
2
3
> [root@server0 ~]# echo "hello" | mail -s testmail harry
> [root@server0 ~]# curl http://server1.example.com/email/harry
>

然后在最下面可以看到一个hello

配置文件具体解释:

myorigin = example.com #来自哪里
mynetworks = 127.0.0.0/8 # 邮件信息仅本地环回
relayhost = [server1.example.com] # 类似中间站,例如B在A和C的中间,A发给C的消息B就会收到。

9.Samba 服务

在 server 上配置 SAMBA 服务

您的 samba 服务器必须是 STAFF 工作组的一个成员

共享/common 目录,共享名为 common

只有 example.com 域内的客户端可以访问 common 共享

common 必须是可以浏览的

用户 natasha 必须能够读取共享中的内容,如果需要的话,验证密码是:tangkai

server0

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
39
40
41
42
43
44
45
46
[root@server0 ~]# yum install -y samba*
[root@server0 ~]# systemctl restart smb nmb
[root@server0 ~]# systemctl enable smb nmb
[root@server0 ~]# mkdir /common
[root@server0 ~]# vim /etc/samba/smb.conf
#找到:
[global]
workgroup = STAFF #将=后面改为STAFF
..................
..................
#在最下面,新加入:
[common]
path = /common
browseable = yes
valid users = natasha
# 保存并退出
[root@server0 ~]# getsebool -a | grep samba
samba_create_home_dirs --> off
samba_domain_controller --> off
samba_enable_home_dirs --> off
samba_export_all_ro --> off
samba_export_all_rw --> off
samba_portmapper --> off
samba_run_unconfined --> off
samba_share_fusefs --> off
samba_share_nfs --> off
sanlock_use_samba --> off
use_samba_home_dirs --> off
virt_sandbox_use_samba --> off
virt_use_samba --> off
[root@server0 ~]# setsebool -P samba_enable_home_dirs 1
[root@server0 ~]# chcon -Rt samba_share_t /common/
[root@server0 ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=172.25.0.0/24 service name=samba accept' --permanent
success
[root@server0 ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=172.25.0.0/24 service name=samba-client accept' --permanent
success
[root@server0 ~]# firewall-cmd --reload
success
[root@server0 ~]# id natasha
uid=1002(natasha) gid=1002(natasha) groups=1002(natasha)
[root@server0 ~]# smbpasswd -a natasha
New SMB password:
Retype new SMB password:
Added user natasha.
[root@server0 ~]# systemctl restart smb nmb
[root@server0 ~]# systemctl enable smb nmb

我们要养成一种习惯,不管之前有没有加入启动项,在每次重启之后,我们都要顺手把他加入到开机启动项里面

验证:需要到desktop0里面验证

1
2
3
4
5
6
7
8
9
10
11
> [root@desktop0 ~]# yum install -y cifs-util*
> [root@desktop0 ~]# mount -t cifs -o username=natasha,password=tangkai //172.25.0.11/common /media/
> [root@desktop0 ~]# df -h
> Filesystem Size Used Avail Use% Mounted on
> /dev/vda1 10G 3.1G 7.0G 31% /
> devtmpfs 906M 0 906M 0% /dev
> tmpfs 921M 80K 921M 1% /dev/shm
> tmpfs 921M 17M 904M 2% /run
> tmpfs 921M 0 921M 0% /sys/fs/cgroup
> //172.25.0.11/common 10G 3.1G 7.0G 31% /media
>

10.多用户 samba 挂载

在 server 上通过 samba 共享目录/storage

共享名为 share

共享目录只能被 example.com 域内的客户端使用

共享目录 share 必须可以被浏览

用户 sarah 能以读的方式访问此共享,访问密码是 tangkai

用户 kitty 能以读写的方式访问此共享,访问密码是 tangkai

此共享永久挂载在 desktop 上的/mnt/dev 目录,并使用用户 sarah 进行认证,任何用户可临时通过 kitty 来获得读写权限

server0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@server0 ~]# vim /etc/samba/smb.conf 
[root@server0 ~]# tail n 6 /etc/samba/smb.conf
[share]
path = /storage
browseable = yes
valid users = sarah,kitty
writable = no
write list = kitty
[root@server0 ~]# systemctl restart smb nmb
[root@server0 ~]# systemctl enable smb nmb
[root@server0 ~]# mkdir /storage
[root@server0 ~]# useradd sarah
[root@server0 ~]# useradd kitty
[root@server0 ~]# chcon -Rt samba_share_t /storage/
[root@server0 ~]# setfacl -m u:sarah:r-x /storage/
[root@server0 ~]# setfacl -m u:kitty:rwx /storage/
[root@server0 ~]# smbpasswd -a sarah
New SMB password:
Retype new SMB password:
Added user sarah.
[root@server0 ~]# smbpasswd -a kitty
New SMB password:
Retype new SMB password:
Added user kitty.

desktop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@desktop0 ~]# vim /etc/fstab
[root@desktop0 ~]# tail -n 1 /etc/fstab
//172.25.0.11/share /mnt/dev cifs multiuser,username=sarah,password=tangkai,sec=ntlmssp 0 0
[root@desktop0 ~]# mkdir /mnt/dev
[root@desktop0 ~]# mount -a
[root@desktop0 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 10G 3.1G 7.0G 31% /
devtmpfs 906M 0 906M 0% /dev
tmpfs 921M 80K 921M 1% /dev/shm
tmpfs 921M 17M 904M 2% /run
tmpfs 921M 0 921M 0% /sys/fs/cgroup
//172.25.0.11/common 10G 3.1G 7.0G 31% /media
//172.25.0.11/share 10G 3.1G 7.0G 31% /mnt/dev

11.配置 NFS 服务

1.) 在 server 上配置 NFS
以只读的方式共享/public,同时只能被 example.com 内用户访问

以读写的方式共享/protected 能被 example.com 内用户访问

访问/protected 需要通过 kerberos 安全加密,您可以使用下边链接的秘钥: http://classroom.example.com/pub/keytabs/server0.keytab

目录/protected 应该包含名为 project 拥有人为 ldapuser12 的子目录

用户 ldapuser12 能以读写的方式访问/protected/project

server0

1
2
3
4
5
6
7
[root@server0 ~]# vim /etc/exports
[root@server0 ~]# cat /etc/exports
/public 172.25.0.0/24(ro)
/protected 172.25.0.0/24(rw,sec=krb5p)
[root@server0 ~]# mkdir /public
[root@server0 ~]# mkdir /protected
[root@server0 ~]# mkdir /protected/project
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 这一栏的步骤有可能考试不需要你操作,但我们要以防万一
[root@server0 ~]# yum install -y krb5* sssd* authconfig*
[root@server0 ~]# cd /etc/openldap/
[root@server0 openldap]# ls
certs ldap.conf schema
[root@server0 openldap]# mkdir cacerts
[root@server0 openldap]# cd cacerts/
[root@server0 cacerts]# wget http://classroom.example.com/pub/example-ca.crt
[root@server0 cacerts]# authconfig-tui
# 过程在考rhcse的时候有描述,这里就不再介绍
[root@server0 cacerts]# su - ldapuser12
su: warning: cannot change directory to /home/guests/ldapuser12: No such file or directory
mkdir: cannot create directory '/home/guests': Permission denied
-bash-4.2$
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@server0 ~]# chown ldapuser12 /protected/project
[root@server0 ~]# wget -O /etc/krb5.keytab http://classroom.example.com/pub/keytabs/server0.keytab
[root@server0 ~]# vim /etc/sysconfig/nfs
RPCNFSDARGS="-V 4.2" # 在第13行,引号里面加入-V 4.2
[root@server0 ~]# systemctl enable nfs-secure nfs-secure-server nfs-server
ln -s '/usr/lib/systemd/system/nfs-secure.service' '/etc/systemd/system/nfs.target.wants/nfs-secure.service'
ln -s '/usr/lib/systemd/system/nfs-secure-server.service' '/etc/systemd/system/nfs.target.wants/nfs-secure-server.service'
ln -s '/usr/lib/systemd/system/nfs-server.service' '/etc/systemd/system/nfs.target.wants/nfs-server.service'
[root@server0 ~]# systemctl start nfs-secure nfs-secure-server nfs-server
[root@server0 ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=172.25.0.0/24 service name=nfs accept' --permanent
success
[root@server0 ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=172.25.0.0/24 service name=rpc-bind accept' --permanent
success
[root@server0 ~]# firewall-cmd --reload
success

2.)
在 desktop 上挂载来自于 server0 的 NFS 共享

/public 挂载在目录/mnt/nfsmount 上

/protected 挂载在目录/mnt/nfssecure,并使用安全的方式,秘钥:

http://classroom.example.com/pub/keytabs/desktop0.keytab

用户 ldapuser12 能在/mnt/nfssecure/project 上创建文件

这些文件系统在系统启动时自动挂载

desktop

1
2
[root@desktop0 ~]# mkdir /mnt/nfsmount
[root@desktop0 ~]# mkdir /mnt/nfssecure
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 这一栏的步骤有可能考试不需要你操作,但我们要以防万一
[root@desktop0 ~]# yum install sssd* krb5* authconfig* -y
[root@desktop0 ~]# cd /etc/openldap/
[root@desktop0 openldap]# ls
certs ldap.conf
[root@desktop0 openldap]# mkdir cacerts
[root@desktop0 openldap]# cd cacerts/
[root@desktop0 cacerts]# wget http://classroom.example.com/pub/example-ca.crt
[root@desktop0 cacerts]# authconfig-tui
# 过程在考rhcse的时候有描述,这里就不再介绍
[root@desktop0 cacerts]# su - ldapuser12
su: warning: cannot change directory to /home/guests/ldapuser12: No such file or directory
mkdir: cannot create directory '/home/guests': Permission denied
-bash-4.2$
1
2
3
4
5
6
7
8
9
10
11
[root@desktop0 ~]# wget -O /etc/krb5.keytab http://classroom.example.com/pub/keytabs/desktop0.keytab
[root@desktop0 ~]# vim /etc/sysconfig/nfs
RPCNFSDARGS="-V 4.2" # 在第13行,引号里面加入-V 4.2
[root@desktop0 ~]# systemctl enable nfs-secure
ln -s '/usr/lib/systemd/system/nfs-secure.service' '/etc/systemd/system/nfs.target.wants/nfs-secure.service'
[root@desktop0 ~]# systemctl start nfs-secure
[root@desktop0 ~]# vim /etc/fstab
[root@desktop0 ~]# tail -n 2 /etc/fstab
172.25.0.11:/public /mnt/nfsmount nfs ro,v4.2 0 0
172.25.0.11:/protected /mnt/nfssecure nfs defaults,v4.2,sec=krb5p 0 0
[root@desktop0 ~]# mount -a

12.在 server 上配置一个 web 站点 http://server.example.com

http://classroom.example.com/pub/example.html 下载文件,

并重命名为 index.html,不要修改文件内容。

将文件 index.html 拷贝到您的 DocumentRoot 目录下

来自于 example.com 的客户端可以访问该 web 服务器

来自于 my133t.org 的客户端的访问会被拒绝

server

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@server0 ~]# yum install httpd -y
[root@server0 ~]# cd /var/www/html/
[root@server0 html]# ls
[root@server0 html]# wget -O index.html http://classroom.example.com/pub/example.html
[root@server0 html]# ls
index.html
[root@server0 html]# systemctl restart httpd
[root@server0 html]# systemctl enable httpd
ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'
[root@server0 html]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=172.25.0.0/24 service name=http accept' --permanent
success
[root@server0 html]# firewall-cmd --reload
success

验证

1
2
3
>[root@server0 html]# curl http://server.example.com
> zheshi yige 在 server 上配置一个 web 站点
>

13.为站点 http://server.example.com 配置 TLS 加密

已签名证书从 http://classroom.example.com/pub/tls/certs/server0.crt 获取

证书的秘钥从 http://classroom.example.com/pub/tls/private/server0.key 获取

证书的签名授权信息从 http://classroom.example.com/pub/tls/certs/www0.crt 获取

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
[root@server0 html]# yum -y install mod_ssl.x86_64
[root@server0 html]# cd /etc/httpd/conf.d/
[root@server0 conf.d]# vim ssl.conf
#到120行左右
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
#SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt

#将这三个的后面的文件名改掉,然后将最后一个的#号去掉,效果如下:
SSLCertificateFile /etc/pki/tls/certs/server0.crt
SSLCertificateKeyFile /etc/pki/tls/private/server0.key
SSLCACertificateFile /etc/pki/tls/certs/www0.crt
# 记住这三个路径之后保存并退出
[root@server0 conf.d]# cd /etc/pki/tls/certs/
[root@server0 certs]# wget http://classroom.example.com/pub/tls/certs/server0.crt
[root@server0 certs]# cd /etc/pki/tls/private/
[root@server0 private]# wget http://classroom.example.com/pub/tls/private/server0.key
[root@server0 private]# cd /etc/pki/tls/certs/
[root@server0 certs]# wget http://classroom.example.com/pub/tls/certs/www0.crt

[root@server0 certs]# systemctl restart httpd.service
[root@server0 certs]# systemctl enable httpd.service
[root@server0 certs]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=172.25.0.0/24 service name=https accept' --permanent
success
[root@server0 certs]# firewall-cmd --reload
success

验证

1
2
3
4
5
> [root@server0 certs]# curl -k https://server.example.com
> zheshi yige 在 server 上配置一个 web 站点
> [root@server0 certs]# curl http://server.example.com
> zheshi yige 在 server 上配置一个 web 站点
>

14.在 server 上扩展您的 WEB 服务器

  1. 为站点 http://www.example.com 创建一个虚拟主机
  2. 设置 DocumentRoot 为/var/www/virtual
  3. http://classroom.example.com/pub/www.html 下载文件,并重命名为 index.html,不要修改文件内容。
  4. 将文件 index.html 拷贝到 DocumentRoot 目录下
  5. 确保 floyd 用户能够在/var/www/virtual 下创建文件

server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@server0 ~]# find / -name *vhosts.conf
/usr/share/doc/httpd-2.4.6/httpd-vhosts.conf
[root@server0 ~]# cp /usr/share/doc/httpd-2.4.6/httpd-vhosts.conf /etc/httpd/conf.d/
[root@server0 ~]# cd /etc/httpd/conf.d/
[root@server0 conf.d]# vim httpd-vhosts.conf
[root@server0 conf.d]# tail -n 8 httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/var/www/html"
ServerName server.example.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/var/www/virtual"
ServerName www.example.com
</VirtualHost>
[root@server0 ~]# mkdir /var/www/virtual
oot@server0 ~]# cd /var/www/virtual/
[root@server0 virtual]# wget -O index.html http://classroom.example.com/pub/www.html
[root@server0 conf.d]# useradd floyd
[root@server0 conf.d]# setfacl -m u:floyd:rwx /var/www/virtual
[root@server0 conf.d]# systemctl restart httpd.service
[root@server0 conf.d]# systemctl enable httpd.service

验证

1
2
3
4
5
6
7
> [root@server0 conf.d]# curl www.example.com 
> zheshi yige 在 server 上扩展您的 WEB 服务器
> [root@server0 conf.d]# curl -k https://server.example.com
> zheshi yige 在 server 上配置一个 web 站点
> [root@server0 conf.d]# curl http://server.example.com
> zheshi yige 在 server 上配置一个 web 站点
>

15.web 访问控制

在您 server 上的 web 服务器的 DocumentRoot 目录下创建一个名为 private 的目录

http://classroom.example.com/pub/private.html 下载文件到这个目录,并重命名为index.html,不要修改文件内容

从 server 上,任何人都可以浏览 private 的内容,但是从其他系统不能访问这个目录的内容

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
[root@server0 conf.d]# cd /var/www/html/
[root@server0 html]# mkdir private
[root@server0 html]# cd private/
[root@server0 private]# wget -O index.html http://classroom.example.com/pub/private.
[root@server0 private]# vim /etc/httpd/conf/httpd.conf
#搜索Requ,复制
<Directory />
AllowOverride none
Require all denied
</Directory>
[root@server0 private]# vim /etc/httpd/conf.d/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/var/www/html"
ServerName server.example.com
#<Directory "/var/www/html/private">
# Require ip 172.25.0.11
#</Directory>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/var/www/virtual"
ServerName www.example.com
</VirtualHost>
# 这里#号表示加在这里三个,不要照着敲,把#号都敲进去了

[root@server0 private]# systemctl restart httpd.service
[root@server0 private]# systemctl enable httpd.service

验证

1
2
3
4
5
6
7
8
9
10
11
12
13
> [root@server0 private]# curl server.example.com/private/ 
> zheshi yige web 访问控制
> # 然后我们用客户端去访问
> root@desktop0 ~]# curl server.example.com/private/
> <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
> <html><head>
> <title>403 Forbidden</title>
> </head><body>
> <h1>Forbidden</h1>
> <p>You don't have permission to access /private/
> on this server.</p>
> </body></html>
>

16.在 server 上实现动态 web 内容

动态内容由名为 alt.example.com 的虚拟主机提供虚拟主机侦听端口为 8909

http://classroom.example.com/pub/webapp.wsgi 下载一个脚本,然后放在适当的位置,不要修改文件内容

客户端访问 http://alt.example.com:8909 时,应该接收到动态生成的 web 页面此 http://alt.example.com:8909 必须能被 example.com 内所有的系统访问

server

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
[root@server0 private]# yum install mod_wsgi.x86_64 -y
[root@server0 private]# cd /var/www/
[root@server0 www]# mkdir wsgi
[root@server0 www]# cd wsgi/
[root@server0 wsgi]# wget http://classroom.example.com/pub/webapp.wsgi
[root@server0 wsgi]# vim /etc/httpd/conf.d/httpd-vhosts.conf
[root@server0 wsgi]# tail -n 5 /etc/httpd/conf.d/httpd-vhosts.conf
Listen 8909
<VirtualHost *:8909>
WSGIScriptAlias / "/var/www/wsgi/webapp.wsgi"
ServerName alt.example.com:8909
</VirtualHost>
[root@server0 wsgi]# firewall-cmd --add-rich-rule 'rule family=ipv4 port port=8909 protocol=tcp accept' --permanent
success
[root@server0 wsgi]# firewall-cmd --reload
success
[root@server0 wsgi]# curl alt.example.com:8909
curl: (7) Failed connect to alt.example.com:8909; Connection refused
[root@server0 wsgi]# semanage port -l | grep http
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
[root@server0 wsgi]# semanage port -a -t http_port_t -p tcp 8909
[root@server0 wsgi]# systemctl restart httpd.service
[root@server0 wsgi]# systemctl enable httpd.service

验证

1
2
3
> [root@server0 wsgi]# curl http://alt.example.com:8909
> Hello World!
>

17.配置 server 提供一个 iSCSI 共享服务

磁盘名为 iqn.2014-09.com.example:server

服务端口为 3260

使用 iscsi_store 作为其后端卷其大小为 3G

此服务只能被 desktop.example.com 访问

server

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
[root@server0 wsgi]# yum install targetcli* -y
[root@server0 wsgi]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 10G 0 disk
└─vda1 253:1 0 10G 0 part /
vdb 253:16 0 10G 0 disk
[root@server0 wsgi]# fdisk /dev/vdb
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-20971519, default 2048):
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): +3G
Command (m for help): w
[root@server0 wsgi]# partprobe
[root@server0 wsgi]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 10G 0 disk
└─vda1 253:1 0 10G 0 part /
vdb 253:16 0 10G 0 disk
└─vdb1 253:17 0 3G 0 part
[root@server0 wsgi]# targetcli
/> ls
o- / ................................................ [...]
o- backstores ..................................... [...]
| o- block ........................................ [Storage Objects: 0]
| o- fileio ....................................... [Storage Objects: 0]
| o- pscsi ........................................ [Storage Objects: 0]
| o- ramdisk ...................................... [Storage Objects: 0]
o- iscsi .......................................... [Targets: 0]
o- loopback ....................................... [Targets: 0]
/> cd /backstores/block
/backstores/block> create iscsi_store /dev/vdb1
Created block storage object iscsi_store using /dev/vdb1.
/backstores/block> cd /iscsi
/iscsi> create iqn.2014-09.com.example:server
Created target iqn.2014-09.com.example:server.
Created TPG 1.
/iscsi> ls
o- iscsi ........................................... [Targets: 1]
o- iqn.2014-09.com.example:server ................ [TPGs: 1]
o- tpg1 ........................................ [no-gen-acls, no-auth]
o- acls ...................................... [ACLs: 0]
o- luns ...................................... [LUNs: 0]
o- portals ................................... [Portals: 0]
/iscsi> cd iqn.2014-09.com.example:server/tpg1/acls
/iscsi/iqn.20...ver/tpg1/acls> create iqn.2014-09.com.example:desktop
Created Node ACL for iqn.2014-09.com.example:desktop
/iscsi/iqn.20...ver/tpg1/acls> cd /iscsi/iqn.2014-09.com.example:server/tpg1/luns
/iscsi/iqn.20...ver/tpg1/luns> create /backstores/block/iscsi_store
Created LUN 0.
Created LUN 0->0 mapping in node ACL iqn.2014-09.com.example:desktop
/iscsi/iqn.20...ver/tpg1/luns> cd /iscsi/iqn.2014-09.com.example:server/tpg1/portals
/iscsi/iqn.20.../tpg1/portals> create 172.25.0.11 3260
Using default IP port 3260
Created network portal 172.25.0.11:3260.
/iscsi/iqn.20.../tpg1/portals> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup.
Configuration saved to /etc/target/saveconfig.json

[root@server0 wsgi]# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="172.25.0.0/24" port port=3260 protocol=tcp accept' --permanent
success
[root@server0 wsgi]# firewall-cmd --reload
success
[root@server0 wsgi]# systemctl restart target
[root@server0 wsgi]# systemctl enable target
ln -s '/usr/lib/systemd/system/target.service' '/etc/systemd/system/multi-user.target.wants/target.service'

这一题的验证是下一题

18.配置 desktop 使其能连接在 server 上提供的 iscsi

iSCSI 设备在系统启动的期间自动加载

块设备 iSCSI 上包含一个大小 1500MiB 的分区,并格式化为 ext4

此分区挂载在/mnt/netdev 上同时在系统启动的期间自动加载

desktop

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
39
40
41
42
43
[root@desktop0 ~]# yum install -y iscsi-init*
[root@desktop0 ~]# mkdir /mnt/netdev
[root@desktop0 ~]# vim /etc/iscsi/initiatorname.iscsi
[root@desktop0 ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2014-09.com.example:desktop
[root@desktop0 ~]# systemctl restart iscsi iscsid
[root@desktop0 ~]# systemctl enable iscsi iscsid
ln -s '/usr/lib/systemd/system/iscsid.service' '/etc/systemd/system/multi-user.target.wants/iscsid.service'
[root@desktop0 ~]# iscsiadm -m discovery -t st -p 172.25.0.11
172.25.0.11:3260,1 iqn.2014-09.com.example:server
[root@desktop0 ~]# iscsiadm -m node -l
Logging in to [iface: default, target: iqn.2014-09.com.example:server, portal: 172.25.0.11,3260] (multiple)
Login to [iface: default, target: iqn.2014-09.com.example:server, portal: 172.25.0.11,3260] successful.
[root@desktop0 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 3G 0 disk
vda 253:0 0 10G 0 disk
└─vda1 253:1 0 10G 0 part /
vdb 253:16 0 10G 0 disk
[root@desktop0 ~]# fdisk /dev/sda
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1):
First sector (8192-6291455, default 8192):
Last sector, +sectors or +size{K,M,G} (8192-6291455, default 6291455): +1500M
Command (m for help): w
[root@desktop0 ~]# partprobe
[root@desktop0 ~]# mkfs.ext4 /dev/sda1
[root@desktop0 ~]# blkid | grep sda
/dev/sda1: UUID="142c6ec3-0d06-4f89-91e3-8201e8186d37" TYPE="ext4"
[root@desktop0 ~]# vim /etc/fstab
[root@desktop0 ~]# tail -n 1 /etc/fstab
UUID="142c6ec3-0d06-4f89-91e3-8201e8186d37" /mnt/netdev ext4 defaults,_netdev 0 0
[root@desktop0 ~]# mount -a
[root@desktop0 ~]# df -h
/dev/vda1 10G 3.1G 7.0G 31% /
devtmpfs 906M 0 906M 0% /dev
tmpfs 921M 80K 921M 1% /dev/shm
.............................
/dev/sda1 1.5G 4.5M 1.4G 1% /mnt/netdev

19.编写一个位于/root/program 的 shell 脚本

当执行/root/program tang 时,终端显示 kai

当执行/root/program kai 时,终端显示 tang

当仅执行/root/program 不加参数,或者加上其他参数时,终端显示标准错误输出/root/program tang|kai

server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@server0 ~]# vim /root/program
[root@server0 ~]# cat /root/program
#!/bin/bash
case $1 in
tang)
echo "kai"
;;
kai)
echo "tang"
;;
*)
echo "/root/program tang|kai"
;;
esac
[root@server0 ~]# chmod +x /root/program
[root@server0 ~]# /root/program tang
kai
[root@server0 ~]# /root/program kai
tang
[root@server0 ~]# /root/program
/root/program tang|kai

20.写一个创建用户的脚本

脚本名为/root/mkuser,脚本执行时需要添加一个参数,

请在 http://classroom.example.com/pub/user 下载下来,这个 user 就是参数

如果没有参数,将提示:Usage:/root/mkuser

如果参数为不存在的文件,则提示:Input file not found

如果存在,则创建用户,用户不需要设置密码,用户的 shell 为/bin/flase

server

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
[root@server0 ~]# vim /root/mkuser
[root@server0 ~]# cat /root/mkuser
#!/bin/bash
if [ $# -eq 0 ];then
echo "Usage:/root/mkuser"
else
if [ -f $1 ];then
for user in $(cat $1);do
useradd -s /bin/flase $user
done
else
echo "Input file not found"
fi
fi
[root@server0 ~]# chmod +x /root/mkuser
[root@server0 ~]# cd /root
[root@server0 ~]# wget http://classroom.example.com/pub/user
[root@server0 ~]# /root/mkuser
Usage:/root/mkuser
[root@server0 ~]# /root/mkuser dfs
Input file not found
[root@server0 ~]# /root/mkuser user
[root@server0 ~]# id user1
uid=1001(user1) gid=1001(user1) groups=1001(user1)
[root@server0 ~]# id user2
uid=1002(user2) gid=1002(user2) groups=1002(user2)
[root@server0 ~]# id user3
uid=1003(user3) gid=1003(user3) groups=1003(user3)
[root@server0 ~]# cat user
user1
user2
user3
user4
user5
[root@server0 ~]#

21.在你的机器上创建一个 mariadb 数据库;

数据库名为 contacts

数据库应该包含来自数据库复制的内容。复制文件的 URL 为
http://classroom.example.com/pub/user.mdb

数据库只能被 localhost 访问

除了 root 用户,此数据库只能被用户 raikon 查询,此用户密码为 redhat

root 用户密码为 redhat,同时不允许空密码登陆

server

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
[root@server0 ~]# yum install mariadb* -y
[root@server0 ~]# systemctl restart mariadb
[root@server0 ~]# systemctl enable mariadb
ln -s '/usr/lib/systemd/system/mariadb.service' '/etc/systemd/system/multi-user.target.wants/mariadb.service'
[root@server0 ~]# mysql_secure_installation
Set root password? [Y/n] y
New password: #redhat
Re-enter new password: #redhat
Password updated successfully!
Remove anonymous users? [Y/n] y
... Success!
Disallow root login remotely? [Y/n] n
... skipping.
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
Reload privilege tables now? [Y/n] y
... Success!
[root@server0 ~]# wget http://classroom.example.com/pub/users.mdb

[root@server0 ~]# mysql -uroot -predhat
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 11
Server version: 5.5.35-MariaDB MariaDB Server

Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database Contacts;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> use Contacts;
Database changed
MariaDB [Contacts]> source /root/user.mdb;
MariaDB [Contacts]> grant select on Contacts .* to 'raikon@localhost' identified by 'redhat';
MariaDB [Contacts]> flush privileges;
MariaDB [Contacts]> exit

24.数据库查询

在 system1 上使用数据库 Contacts ,并使用相应的 SQL 查询以回答下列问题:

密码是fadora 的人的名字是什么?

有多少人的姓名是 John ,同时居住在 Santa Clara ?

system1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@system1 ~]# mysql -u root -predhat

MariaDB [(none)]> use Contacts;

MariaDB [Contacts]> SELECT u_name.firstname FROM u_name, u_passwd WHERE u_name.userid = u_passwd.uid AND u_passwd.password = 'fadora';
+-----------+
| firstname |
+-----------+
| John |
+-----------+
1 row in set (0.00 sec)

MariaDB [Contacts]> SELECT COUNT(*) FROM u_name,u_loc WHERE u_name.userid = u_loc.uid AND u_name.firstname = 'John' AND u_loc.location = 'Santa Clara';
+----------+
| COUNT(*) |
+----------+
| 4 |
+----------+
1 row in set (0.00 sec)

密码是fadora 的人的名字是什么?

John

有多少人的姓名是 John ,同时居住在 Santa Clara ?

4

在这里,考者请切记,查询之后的答案记住一定要填写到所填写的正确地方。

不要忘记填写进去

》》》》》》》》》》》》》》》》》》》》》》

以上就是本次RHCE 7 版本的认证考试参考答案,如有错误请联系博主进行更改,最后祝愿大家RHCE认证取得好成绩!!!!

ISCSI服务

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[toc]

ISCSI技术概述

硬盘的接口类型

  • IDE是一种成熟稳定、价格便宜的并行传输接口。
  • SATA是一种传输速度更快、数据校验更完整的串行传输接口。
  • SCSI是一种用于计算机和硬盘、光驱等设备之间系统级接口的通用标准,具有系统资源占用率低、转速高、传输速度快等优点。

IBM公司开始研发ISCSI技术

​ 这是一种将SCSI接口与以太网技术相结合的新型存储技术,可以用来在网络中传输SCSI接口的命令和数据。

iscsi = internet + scsi硬盘接口

​ 这样,不仅克服了传统SCSI接口设备的物理局限性,实现了跨区域的存储资源共享,还可以在不停机的状态下扩展存储容量。

配置ISCSI服务端

添加硬盘

首先我们提前将虚拟机加入一块硬盘

开机启动

1
2
3
4
5
6
7
8
9
[root@server222 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
sr0 11:0 1 4.2G 0 rom /mnt/cdrom

yum安装ISCSI服务端程序

1
2
3
4
[root@server222 ~]# yum install -y targetd targetcli
[root@server222 ~]# systemctl restart targetd
[root@server222 ~]# systemctl enable targetd
Created symlink from /etc/systemd/system/multi-user.target.wants/targetd.service to /usr/lib/systemd/system/targetd.service.

配置ISCSI服务端共享资源

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
[root@server222 ~]# targetcli
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
targetcli shell version 2.1.fb46
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

/> ls
o- / ..................................................................... [...]
o- backstores .......................................................... [...]
| o- block .............................................. [Storage Objects: 0]
| o- fileio ............................................. [Storage Objects: 0]
| o- pscsi .............................................. [Storage Objects: 0]
| o- ramdisk ............................................ [Storage Objects: 0]
o- iscsi ........................................................ [Targets: 0]
o- loopback ..................................................... [Targets: 0]
/> cd backstores/block
/backstores/block> create disk1 /dev/sdb
Created block storage object disk1 using /dev/sdb.
/backstores/block> cd /
/> ls
o- / ..................................................................... [...]
o- backstores .......................................................... [...]
| o- block .............................................. [Storage Objects: 1]
| | o- disk1 ..................... [/dev/sdb (20.0GiB) write-thru deactivated]
| | o- alua ............................................... [ALUA Groups: 1]
| | o- default_tg_pt_gp ................... [ALUA state: Active/optimized]
| o- fileio ............................................. [Storage Objects: 0]
| o- pscsi .............................................. [Storage Objects: 0]
| o- ramdisk ............................................ [Storage Objects: 0]
o- iscsi ........................................................ [Targets: 0]
o- loopback ..................................................... [Targets: 0]
/>

创建ISCSI target名称以及配置共享资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/> cd iscsi
/iscsi> .
/iscsi> create
Created target iqn.2003-01.org.linux-iscsi.server222.x8664:sn.c0e1179441ab.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/iscsi> cd iqn.2003-01.org.linux-iscsi.server222.x8664:sn.c0e1179441ab/
/iscsi/iqn.20....c0e1179441ab> ls
o- iqn.2003-01.org.linux-iscsi.server222.x8664:sn.c0e1179441ab ....... [TPGs: 1]
o- tpg1 ............................................... [no-gen-acls, no-auth]
o- acls .......................................................... [ACLs: 0]
o- luns .......................................................... [LUNs: 0]
o- portals .................................................... [Portals: 1]
o- 0.0.0.0:3260 ..................................................... [OK]
/iscsi/iqn.20....c0e1179441ab> cd tpg1/luns
/iscsi/iqn.20...1ab/tpg1/luns> create /backstores/block/disk1
Created LUN 0.

设置访问控制列表(ACL)

1
2
3
4
5
6
7
8
9
10
11
12
/iscsi/iqn.20...1ab/tpg1/luns> cd ..
/iscsi/iqn.20...179441ab/tpg1> ls
o- tpg1 ................................................. [no-gen-acls, no-auth]
o- acls ............................................................ [ACLs: 0]
o- luns ............................................................ [LUNs: 1]
| o- lun0 ........................ [block/disk1 (/dev/sdb) (default_tg_pt_gp)]
o- portals ...................................................... [Portals: 1]
o- 0.0.0.0:3260 ....................................................... [OK]
/iscsi/iqn.20...179441ab/tpg1> cd acls
/iscsi/iqn.20...1ab/tpg1/acls> create iqn.2003-01.org.linux-iscsi.server222.x8664:sn.c0e1179441ab:client
Created Node ACL for iqn.2003-01.org.linux-iscsi.server222.x8664:sn.c0e1179441ab:client
Created mapped LUN 0.

设置ISCSI服务端的监听IP地址和端口号

1
2
3
4
5
6
7
8
9
/iscsi/iqn.20...1ab/tpg1/acls> cd ..
/iscsi/iqn.20...179441ab/tpg1> cd portals/
/iscsi/iqn.20.../tpg1/portals> ls
o- portals ........................................................ [Portals: 1]
o- 0.0.0.0:3260 ......................................................... [OK]
/iscsi/iqn.20.../tpg1/portals> create 192.168.176.222
Using default IP port 3260
Created network portal 192.168.176.222:3260.
/iscsi/iqn.20.../tpg1/portals>

此处如果报错 请执行下面一步骤

1
2
3
4
5
6
7
> /iscsi/iqn.20.../tpg1/portals> create 192.168.176.222
> Using default IP port 3260
> Could not create NetworkPortal in configFS
>
> /iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 3260
> Deleted network portal 0.0.0.0:3260
>

检查配置信息

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
iscsi/iqn.20.../tpg1/portals> ls /
o- / ..................................................................... [...]
o- backstores .......................................................... [...]
| o- block .............................................. [Storage Objects: 1]
| | o- disk1 ....................... [/dev/sdb (20.0GiB) write-thru activated]
| | o- alua ............................................... [ALUA Groups: 1]
| | o- default_tg_pt_gp ................... [ALUA state: Active/optimized]
| o- fileio ............................................. [Storage Objects: 0]
| o- pscsi .............................................. [Storage Objects: 0]
| o- ramdisk ............................................ [Storage Objects: 0]
o- iscsi ........................................................ [Targets: 1]
| o- iqn.2003-01.org.linux-iscsi.server222.x8664:sn.c0e1179441ab ... [TPGs: 1]
| o- tpg1 ........................................... [no-gen-acls, no-auth]
| o- acls ...................................................... [ACLs: 1]
| | o- iqn.2003-01.org.linux-iscsi.server222.x8664:sn.c0e1179441ab:client [Mapped LUNs: 1]
| | o- mapped_lun0 ............................. [lun0 block/disk1 (rw)]
| o- luns ...................................................... [LUNs: 1]
| | o- lun0 .................. [block/disk1 (/dev/sdb) (default_tg_pt_gp)]
| o- portals ................................................ [Portals: 1]
| o- 192.168.176.222:3260 ......................................... [OK]
o- loopback ..................................................... [Targets: 0]
/iscsi/iqn.20.../tpg1/portals> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup.
Configuration saved to /etc/target/saveconfig.json

配置防火墙以及重启服务

1
2
3
4
5
6
7
8
[root@server222 ~]# systemctl restart targetd
[root@server222 ~]# systemctl enable targetd

[root@server222 ~]# systemctl stop firewalld
[root@server222 ~]# vim /etc/selinux/config
[root@server222 ~]# setenforce 0
[root@server222 ~]# getenforce
Permissive

配置ISCSI客户端

客户端地址:192.168.176.111

安装ISCSI客户端服务程序initiator

在rhel 7 系统中,ISCSI-initator-utils已经被默认安装了

1
[root@client111 ~]# yum install iscsi-initiator-utils

编辑initiatorname配置文件

1
2
3
4
5
6
7
[root@client111 ~]# vim /etc/iscsi/initiatorname.iscsi
[root@client111 ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2003-01.org.linux-iscsi.server222.x8664:sn.c0e1179441ab:client

[root@client111 ~]# systemctl restart iscsid
[root@client111 ~]# systemctl enable iscsid
Created symlink from /etc/systemd/system/multi-user.target.wants/iscsid.service to /usr/lib/systemd/system/iscsid.service.

登录iSCSI服务端

iscsiadm是用于管理、查询、插入、更新或删除iSCSI数据库配置文件的命令行工具,用户需要先使用这个工具扫描发现远程iSCSI服务端,然后查看找到的服务端上有哪些可用的共享存储资源。

-m discovery参数的目的是扫描并发现可用的存储资源,

-t st参数为执行扫描操作的类型,

-p 192.168.176.222 参数为iSCSI服务端的IP地址

1
2
[root@client111 ~]# iscsiadm -m discovery -t st -p 192.168.176.222
192.168.176.222:3260,1 iqn.2003-01.org.linux-iscsi.server222.x8664:sn.c0e1179441ab

-m node参数为将客户端所在主机作为一台节点服务器,

-T iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.d497c356ad80参数为要使用的存储资源 (直接复制前面命令中扫描发现的结果,以免错误)

-p 192.168.176.222参数依然为服务端iSCSI服务端的IP地址。

–login或-l参数进行登录验证。

1
2
3
[root@client111 ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.server222.x8664:sn.c0e1179441ab -p 192.168.176.222 --login
Logging in to [iface: default, target: iqn.2003-01.org.linux-iscsi.server222.x8664:sn.c0e1179441ab, portal: 192.168.176.222,3260] (multiple)
Login to [iface: default, target: iqn.2003-01.org.linux-iscsi.server222.x8664:sn.c0e1179441ab, portal: 192.168.176.222,3260] successful.

此时我们lsbak看一下

1
2
3
4
5
6
7
8
9
[root@client111 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
sr0 11:0 1 4.2G 0 rom /mnt/cdrom

发现此处多了一个/dev/sdb的设备文件

1
2
[root@client111 ~]# file /dev/sdb
/dev/sdb: block special

挂载设备

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
[root@client111 ~]# file /dev/sdb
/dev/sdb: block special
[root@client111 ~]# mkfs.xfs /dev/sdb
meta-data=/dev/sdb isize=512 agcount=4, agsize=1310720 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5242880, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@client111 ~]# mkdir /iscsi
[root@client111 ~]# mount /dev/sdb /iscsi/
[root@client111 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 17G 4.4G 13G 26% /
devtmpfs devtmpfs 977M 0 977M 0% /dev
tmpfs tmpfs 993M 0 993M 0% /dev/shm
tmpfs tmpfs 993M 9.0M 984M 1% /run
tmpfs tmpfs 993M 0 993M 0% /sys/fs/cgroup
/dev/sr0 iso9660 4.3G 4.3G 0 100% /mnt/cdrom
/dev/sda1 xfs 1014M 161M 854M 16% /boot
tmpfs tmpfs 199M 12K 199M 1% /run/user/42
tmpfs tmpfs 199M 0 199M 0% /run/user/0
/dev/sdb xfs 20G 33M 20G 1% /iscsi

永久挂载

1
2
3
4
5
6
[root@client111 ~]# blkid | grep /dev/sdb
/dev/sdb: UUID="cc4c5965-a701-4534-85ad-60df267cf5d7" TYPE="xfs"
[root@client111 ~]# vim /etc/fstab
[root@client111 ~]# tail -n 1 /etc/fstab
UUID="cc4c5965-a701-4534-85ad-60df267cf5d7" /iscsi xfs defaults,_netdev 0 0
[root@client111 ~]# mount -a

卸载ISCSI共享资源设备

可以用iscsiadm命令的-u参数将其设备卸载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@client111 ~]# umount /iscsi/
[root@client111 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 17G 4.4G 13G 26% /
devtmpfs devtmpfs 977M 0 977M 0% /dev
tmpfs tmpfs 993M 0 993M 0% /dev/shm
tmpfs tmpfs 993M 9.0M 984M 1% /run
tmpfs tmpfs 993M 0 993M 0% /sys/fs/cgroup
/dev/sr0 iso9660 4.3G 4.3G 0 100% /mnt/cdrom
/dev/sda1 xfs 1014M 161M 854M 16% /boot
tmpfs tmpfs 199M 12K 199M 1% /run/user/42
tmpfs tmpfs 199M 0 199M 0% /run/user/0
[root@client111 ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.server222.x8664:sn.c0e1179441ab -u
Logging out of session [sid: 1, target: iqn.2003-01.org.linux-iscsi.server222.x8664:sn.c0e1179441ab, portal: 192.168.176.222,3260]
Logout of [sid: 1, target: iqn.2003-01.org.linux-iscsi.server222.x8664:sn.c0e1179441ab, portal: 192.168.176.222,3260] successful.

练习

1.简述iSCSI存储技术在生产环境中的作用。

2.在Linux系统中,iSCSI服务端和iSCSI客户端所使用的服务程序分别叫什么?

3.在使用targetcli命令配置iSCSI服务端配置文件时,acls与portals参数目录中分别存放什么内容?

4.iSCSI协议占用了服务器哪个协议和端口号?

5.用户在填写fstab设备挂载配置文件时,一般会把远程存储资源的UUID(而非设备的名称)填写到配置文件中。这是为什么?

shell脚本笔记(脚本)

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
# ----------------猜数字-----------------
#!/bin/bash
num=50

read -p "请输入你所猜到的数字:" user_num
if [ $num -eq $user_num ];then
echo "哇瑟!好厉害!"
else
echo "你猜错了,哈哈哈"
fi


#---------------计算年龄-------------------
#!/bin/bash
age=100

read -p "请输入您今年的年龄:" user_age
echo $user_age |egrep '^[0-9]+$' &>/dev/null
if [ $? -ne 0 ];then
echo "您输入的有误,请重新执行并且输入1-100之前任意数值!"
else
if [ $user_age -lt $age ]; then
echo "您还可以活" $[ $age - $user_age ] "岁。"
else
echo "您输入的有误,请重新执行并且输入1-100之前任意数值!"
fi
fi


#--------输入三个数值,自动取出最大值与最小值----------
#!/bin/bash
for i in $(seq 3);do
read -p "请输入一个数字:" num
echo $num |egrep '^[0-9]+$' &>/dev/null
if [ $? -ne 0 ];then
echo "请输入一个整数"
exit
fi

if [ $i -eq 1 ];then
max=$num
min=$num
fi

if [ $num -gt $max ];then
max=$num
fi

if [ $num -lt $min ];then
min=$num
fi
done

echo "最大的数字为: "$max
echo "最小的数字为: "$min


#------成绩:90上优秀、80上良好、70上中等、60上及格、60下差-----------
#!/bin/bash

read -p "请输入您的成绩:" user_chengji
echo $user_chengji |egrep '^[0-9]+$' &>/dev/null
if [ $? -ne 0 ];then
echo "请输入一个整数"
exit
fi
if [ $user_chengji -gt 100 ]; then
echo "请输入0-100以内的数值"
exit
fi
if [ $user_chengji -ge 90 ]; then
echo "您的成绩为优秀"
elif [ $user_chengji -ge 80 ]; then
echo "您的成绩为良好"
elif [ $user_chengji -ge 70 ]; then
echo "您的成绩为中等"
elif [ $user_chengji -ge 60 ]; then
echo "您的成绩为及格"
elif [ $user_chengji -le 60 ]; then
echo "您的成绩为差"
fi


#--------case语法---------
#!/bin/bash
case $1 in
"start"|"Start"|"START")
/usr/local/httpd/apachectl start
;;
"stop"|"STOP")
/usr/local/httpd/apachectl stop
;;
"restart")
/usr/local/httpd/apachectl stop
/usr/local/httpd/apachectl start
;;
"status")
count=$(ps -ef | egrep -v "grep | $0" | grep -c httpd &> /dev/null)
if [ $count -ne 0 ];then
echo "httpd is running."
else
echo "httpd is stopped."
fi
;;
*)
echo "Usage:service httpd
start|stop|restart|status"
;;
esac



cp httpd /etc/init.d/
chmod +x /etc/init.d/httpd


#!/bin/bash
read -p "请输入你的分数:" user_num
echo $user_num | egrep '^[0-9]+$' &>/dev/null
if [ $? -ne 0 ]; then
echo "请正确地输入您的分数!"
exit
fi

case $user_num in
-gt100)
echo "请正确输入您的分数!"
;;
)
echo "您的成绩为优秀!"
;;
*)
;;
esac


#取出/etc/passwd的用户以及UID
#!/bin/bash
Fa=/etc/passwd
for (( i=1;i<=$(cat $Fa | wc -l);i++ ));do
user_name=$(awk -F ':' "NR==$i {print $ 1}" $Fa)
user_UID=$(awk -F ':' "NR==$i {print $ 3}" $Fa)

echo "hello!$user_name,you UID is $user_UID."
done
echo "一共有$(cat $Fa | wc -l)个用户."


#!/bin/bash
man=$1
min=$2
if [ $# -eq 2 ];then
echo "请输入两个或以上数字。"
exit
fi

for i in $* ; do
echo $i | egrep '^[0-9]+$' &> /dev/null
if [ $? -ne 0 ];then
echo "无效,请输入数字,特殊字符以及字母等均无效"
exit
fi
if [ $man -lt $i ];then
man=$i
fi
if [ $min -gt $i ];then
min=$i
fi
done

echo "$man"
echo "$min"


#!/bin/bash
for i in {0..100};do
echo $i
done


#!/bin/bash
man=$1
min=$2
[ $# -eq 2 ] && echo "请输入两个或以上的数字!" && exit
for i in $*;do
echo $i | egrep '^[0-9]+$' &> /dev/null
[ $? -ne 0 ] && echo "请输入数字,字母、特殊字符等均无效!" && exit
[ $man -lt $i ] && man=$i
[ $man -gt $i ] && min=$i
done
echo "$man"
echo "$min"


#!/bin/bash

for i in $(seq 100);do
if [ $[ $i % 2 ] -eq 1 ];then
echo $i
echo ------
fi
done


#!/bin/bash

for i in $(seq 1 2 100);do
echo $i
echo -------
done


#!/bin/bash

for i in $(seq 100);do
if [ $[ $i % 2 ] -ne 2 ];then
echo $i
echo ------
fi
done


#!/bin/bash

for i in $(seq 2 2 100);do
echo $i
echo ------
done


#!/bin/bash

for i in $(seq 1 100);do
if [ $i -lt 50 -o $i -gt 70 ];then
echo $i
echo -----
fi
done


#!/bin/bash

for i in $(seq 1 10);do
if [ $i -gt 5 ];then
echo $i
echo ------
fi
done

break [num]
中止循环
break语句后面的内容不会被执行

continue [num]
提前进入下一轮循环
continue语句后面不会被执行


#!/bin/bash

for i in $(seq 1 100);do
if [ $i -lt 50 -o $i -gt 70 ];then
echo $i
echo ----
fi
done

#!/bin/bash
#变量
name=tom
passwd=123321

#输入用户名以及密码

for (( i=1;i>=1;i++ ));do
read -p "请输入用户名:" user_name
read -p "请输入用户名:" user_passwd
if [ $i -gt 3 ];then
echo "您已三次输入有误,系统默认锁定账户,寻找管理员解锁!”
exit
fi
if [ $user_name != $name ] && [ $passwd != $user_passwd ];then
echo "您的用户名或者密码有误,请重试!"
else
echo "hello $user_name.欢迎来到这里!"
fi
done


# while循环
#!/bin/bash

i=1
while [ $i -le 10 ];do
echo $i
ehco -----
((i++))
done


#!/bin/bash

i=1
while [ $i -le 10 ];do
echo $i
echo ----
((i+=2))
done


#!/bin/bash
i=1

while [ $i -lt 10 ];do
if [ $[ $i % 2 ] -eq 0 ];then
echo $i
fi
((i++))
done


#!/bin/bash

i=0

while [ $i -lt 10 ];do
((i++))
if [ $i -lt 5 -o $i -gt 7 ];then
echo $i
echo ----
fi
done


#!/bin/bash

i=1
while [ $i -lt 10 ];do
((i++))
if [ $i -ge 5 ];then
echo $i
echo ----
fi
done


#!/bin/bash
i=1
while :;do
echo $i
echo -----
((i++))
done


#!/bin/bash

while read line;do
echo $line
echo -------------------------
done < /etc/passwd


#! /bin/bash
Fa=/etc/passwd

while read line;do
user_name=$(echo $line | awk -F ':' 'NR==1 { print $1 }')
user_UID=$(echo $line | awk -F ':' 'NR==1 { print $3 }')
echo “hello! $user_name 您的UID是 $user_UID
echo -------------------------
done < $Fa


#!/bin/bash

i=0
num=$[$RANDOM %100]

while :;do
((i++))
read -p "请输入一个数字" user_num
echo $user_num | egrep '^[0-9]+$' &> /dev/null
if [ $? -ne 0 ];then
echo "您输入的不是数字!请重试!"
exit
fi
if [ $user_num -gt $num ];then
echo "您输入的数字大了!"
elif [ $user_num -lt $num ];then
echo "您输入的数字小了!"
else
ehco "您输入正确!"
echo "您一共回答了$i次."
exit
fi
done

#!/bin/bash
flag=ture
i=3

while $flag;do
if [ $i -le 50 ];then
echo $i
fi
else
flag=false
let i++
done



#用for循环写个九九乘法表

#!/bin/bash

for i in $(seq 9);do
for j in $(seq $i);do
echo -en "${j}x${i}=$[$i * $j]\t"
done
echo
done


until循环猜数字随机


#!/bg=false
i=0
num=$[$RANDOM % 100]

until $flag;do
read -p "请输入所猜的数字:" user_num
((i++))
echo $user_num | egrep '^[0-9]+$' &>/dev/null
if [ $? -ne 0 ];then
echo "您输入的不是数字!"
break
fi
if [ $user_num -gt $num ];then
echo "您输入的数字大了!"
elif [ $user_num -lt $num ];then
echo "您输入的数字小了!"
else
echo "猜对了!"
echo "您一共回答了${i}次!"
flag=true
continue
fi
done

shell脚本进阶

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

bash条件判断

条件测试类型

条件测试分为整数测试字符测试文件测试

条件测试的表达式

1
2
3
[ echoes ]
[[ echoes ]]
test echoes

整数测试(双目)

-eq 测试两个整数是否相等

-ne 测试两个整数是否不等

-gt 测试一个数是否大于另一个数

-lt 测试一个数是否小于另一个数

-ge 大于或小于

-le 小于或等于

字符测试

== 等值比较,检查两边的内容是否一致,切记 == 两边要有空格

!= 检查两边内容是否不一致,不一致为真,一致为假

=~ 左侧字符穿能否被右侧的所匹配到,此表达式应用于双中括号[[]]中

-z “string” 测试指定字符串是否为空,空则为真,不空则为假
-n “string” 测试指定字符串是否不空,不空则为真,空则为假

文件测试

1
2
# 存在性测试
-e 测试文件是否存在
1
2
3
4
5
6
7
8
9
# 存在性及类别测试
-b 测试文件是否为块设备文件
-c 测试文件是否为字符设备文件
-f 测试文件是否为普通文件
-d 测试指定路径是否为目录
-h 测试文件是否为目录
-l 测试文件是否为符号链接文件
-p 测试文件是否为命名管道文件
-s 测试文件是否为套接字文件
1
2
3
4
# 文件权限测试
-r 测试当前用户对指定文件是否有读权限
-w 测试当前用户对指定文件是否有写入权限
-x 测试当前用户对指定文件是否有执行权限
1
2
3
4
# 文件特殊权限测试
-g 测试文件是否有sgid权限
-u 测试文件是否有suid权限
-k 测试文件是否有sticky权限
1
2
# 文件大小测试
-s 测试文件是否非空
1
2
# 文件是否打开测试
-t fd fd表示的文件描述是否已经打开并且与某终端相关
1
2
3
4
# 双目测试
file1 -ef file2 测试文件1与文件2是否为同一文件
file1 -ef file2 测试文件1是否比文件2新
file1 -ef file2 测试文件1是否比文件2旧
1
2
3
4
# 无分类
-N 测试文件自从上一次被录取之后是否被修改过
-O 测试文件是否存在并且被当前用户拥有
-G 测试文件是否存在并且默认组是否为当前用户组

组合测试条件

1
2
3
-a	与关系
-o 或关系
! 非关系

例如

1
2
3
4
5
# 总计个数 大于 1 与 总计个数 小于 3
[ $# -gt 1 -a $# -le 3 ]

# 总计个数 大于 1 后再次统计 总计个数 小于 3
[$# -gt 1 ] && [$# -le 3]

条件判断,控制结构

单分支if语句

1
2
3
4
5
if 判断条件;then
陈述1
陈述2
........
fi

双分支if语句

1
2
3
4
5
6
7
8
9
if 判断条件;then
陈述1
陈述2
.........
else
陈述1
陈述2
.........
fi
if语句小游戏
1
2
3
4
5
6
7
8
9
10
# ----------------猜数字-----------------
#!/bin/bash
num=50

read -p "请输入你所猜到的数字:" user_num
if [ $num -eq $user_num ];then
echo "哇瑟!好厉害!"
else
echo "你猜错了,哈哈哈"
fi

多分支if语句

1
2
3
4
5
6
7
8
9
10
11
12
13
if 判断条件1;then
陈述1
陈述2
.........
elif 判断条件2;then
陈述3
陈述4
.........
else
陈述5
陈述6
.........
fi

分支选择

1
2
3
4
5
6
7
8
9
10
11
12
13
14
case $变量名 in            
value1)
陈述
...
;;
value2)
陈述
...
;;
*)
陈述
...
;;
esac
1
2
3
4
5
另:case支持glob风格的通配符:
* 任意长度任意字符
? 任意单个字符
[] 指字范围内的任意单个字符
abc|bcd abc或bcd

循环语句

循环语句通常需要有一个进入条件和一个退出条件

  • for循环
  • while循环
  • until循环

for循环

for循环当列表不为空时进入循环,否则退出循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for 变量 in 列表; do
循环体
done

for ((expr1;expr2;expr3))
{
循环体
}

for (( expr1 ; expr2 ; expr3 ));do
循环体
done

expr1 //用于指定初始条件,给控制变量一个初始值
expr2 //判定什么时候退出循环
expr3 //修正expr1指定的变量的值

//如何生成列表:
{1..100}
seq [起始数] [步进长度] 结束数

for循环取出/etc/passwd用户

1
2
3
4
5
6
7
8
9
10
#------取出/etc/passwd的用户以及UID---------
#!/bin/bash
Fa=/etc/passwd
for (( i=1;i<=$(cat $Fa | wc -l);i++ ));do
user_name=$(awk -F ':' "NR==$i {print $ 1}" $Fa)
user_UID=$(awk -F ':' "NR==$i {print $ 3}" $Fa)

echo "hello!$user_name,you UID is $user_UID."
done
echo "一共有$(cat $Fa | wc -l)个用户."

while循环

while循环适用于循环次数未知的场景,注意要有退出条件。
条件满足时进入循环,条件不满足了退出循环。

while循环正常用法

1
2
3
4
while 条件; do
陈述
...
done

while循环特殊用法

1
2
3
4
5
6
7
8
9
10
11
12
13
//while循环特殊用法一:死循环
while :;do
陈述
...
done

//这里的冒号可以改成任何非空值

while循环特殊用法二:逐行读取某文件,将值存入line变量中
while read line;do
陈述
...
done < /etc/passwd

#####while循环脚本

1
2
3
4
5
6
7
8
9
10
#-----while特殊用法二取用户-------
#! /bin/bash
Fa=/etc/passwd

while read line;do
user_name=$(echo $line | awk -F ':' 'NR==1 { print $1 }')
user_UID=$(echo $line | awk -F ':' 'NR==1 { print $3 }')
echo “hello! $user_name 您的UID是 $user_UID
echo -------------------------
done < $Fa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#-------用while循环猜数字-------
#!/bin/bash

i=0
num=$[$RANDOM %100]

while :;do
((i++))
read -p "请输入一个数字" user_num
echo $user_num | egrep '^[0-9]+$' &> /dev/null
if [ $? -ne 0 ];then
echo "您输入的不是数字!请重试!"
exit
fi
if [ $user_num -gt $num ];then
echo "您输入的数字大了!"
elif [ $user_num -lt $num ];then
echo "您输入的数字小了!"
else
ehco "您输入正确!"
echo "您一共回答了$i次."
exit
fi
done

until循环

条件不满足时进入循环,条件满足了退出循环。

1
2
3
4
until 条件; do
陈述
...
done

循环语句特殊情况

break [num]:提前退出循环。当循环语句中出现break时,将提前退出循环,不再执行循环后面的语句

continue [num]:提前结束本轮循环而进入下一轮循环。当循环语句执行到continue时,continue后面的语句将不再执行,提前进入下一轮循环

定义脚本退出状态码

1
2
3
4
5
6
7
//exit命令用于定义执行状态结果

exit # //此处的#号是一个数字,其范围可以是0-255

如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即为脚本的退出状态码

注意:脚本中一旦遇到exit命令,脚本会立即终止

shell脚本基础

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

shell脚本基础

变量详解

什么是变量

变量即是可以变化的量

变量的作用

  • 保存表达式运算的结果至内存,方便复用或更改
  • 若无变量而无需复用表达式运算的结果只能重新运算,耗时较长
  • 可以把变量理解为一个存储信息的容器

变量取名以及注意事项

  • 变量名应该做到见名知义

  • 变量名区分大小写

  • 变量名中有多个单词时有两种方式表示

    • 单词间使用下划线分隔(官方推荐)
    • 首单词小写,后面单词的首字母大写
  • 变量名只能是由下划线、数字、字母组成,不能是空格或者特殊字符(#?<.,$!&*^~)

  • 不能以中文做变量名

  • 不能是保留字

    • 1
      break  continue  elif  else  for  global  if  in  is   not  or   while

变量类型

  • 字符型
  • 数值型
    • 整数
    • 浮点数
  • 布尔型

变量操作

  • 设置变量
  • 引用变量
  • 撤销变量

简述三种引号的用法

`反引号 用于命令替换 反引号里面的命令取出来是它们的值

‘ 单引号 取本身,不完成命令替换

“ 双引号 实现命令替换,支持变量

切记单引号取出来是本身,

反引号和双引号取出来是他们的值

bash变量类型

  • 环境变量
  • 本地变量(局部变量)
  • 位置变量
  • 特殊变量(为bash内置,主要用来保存某些特殊数据的变量,也称之为系统变量)

下面介绍两种取除变量以及不取出变量的用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 用法一:取出变量的值
[root@140 ~]# a=5
[root@140 ~]# cat > abc << DOF
> $a
> bb
> cc
> DOF
[root@140 ~]# cat abc
5
bb
cc

# 用法二:不取除变量的值
[root@140 ~]# cat > abc << 'EOF'
> $a
> bb
> cc
> EOF
[root@140 ~]# cat abc
$a
bb
cc

本地变量

1
2
3
4
5
# 本地变量,作为当前shell的进程,对当前shell以外的其他shell进程,包括当前shell的父shell,子shell进程均无效
VAR_NAME=VALUE(值)

# 局部变量,作为当前代码段,多用于函数
local(局部) VAR_NAME=VALUE(值)

环境变量

1
2
# 作用域为当前shell进程及其子进程
export VAR_NAME=VALUE(值)

位置变量

1
2
$1$2$3,....       //用来引用脚本的参数
shift [num] //位置变量使用完以后退出,后面的参数向前推进
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@140 opt]# cat haah.sh 
#!/bin/bash

echo $1
echo ------------
echo $2
echo ------------
echo $3
echo ------------
[root@140 opt]# bash haah.sh 1 2 3
1
------------
2
------------
3
------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@140 opt]# cat huhu.sh 
#!/bin/bash

for i in $*;do
echo $1
echo -----------
shift 2
done
[root@140 opt]# bash huhu.sh 1 2 3 4 5 6
1
-----------
3
-----------
5
-----------

-----------

-----------

-----------

特殊变量

1
2
3
4
5
6
7
$#      //是传给脚本的参数个数
$0 //是脚本本身的名字
$! //是shell最后运行的后台Process的PID
$@ //是传给脚本的所有参数的列表
$* //是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ //是脚本运行的当前进程ID号
$? //是显示上条命令的退出状态,0表示没有错误,其他表示有错误

bash中自带环境变量

  • PATH
1
2
[root@140 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
  • SHELL
1
2
[root@140 ~]# echo $SHELL
/bin/bash
  • UID
1
2
[root@140 ~]# echo $UID
0
  • HISTSIZE
1
2
[root@140 ~]# echo $HISTSIZE
1000
  • HOME
1
2
[root@140 ~]# echo $HOME
/root
  • PWD
1
2
[root@140 ~]# echo $PWD
/root
  • HISTFILE
1
2
[root@140 ~]# echo $HISTFILE
/root/.bash_history
  • PS1
1
2
[root@140 ~]# echo $PS1
[\u@\h \W]\$

只读变量

1
2
# 不能修改值,不能销毁,只能等shell进程终止时随之消亡
readonly(只读) VAR_NAME=VALUE(值)

脚本基础

什么是脚本

​ 脚本(script)是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件。脚本通常可以由应用程序临时调用并执行。

​ 脚本简单地说就是一条条的文字命令,这些文字命令是我们可以看到的(如可以用记事本打开查看、编辑),脚本程序在执行时,是由系统的一个解释器,将其一条条的翻译成机器可识别的指令,并按程序顺序执行。因为脚本在执行时多了一道翻译的过程,所以它比二进制程序执行效率要稍低一些。

程序反回值

程序执行以后有两类返回值:

  • 程序执行的结果
  • 程序状态返回代码(0-255)
    • 0:正确执行
    • 1-255:错误执行,1、2、127系统预留,有特殊意义

脚本测试

1
2
3
4
5
# 检查脚本是否有语法错误
bash -n scriptname

# 单步执行,检查脚本错在哪里(最常用)
bash -x scriptname

例如此处写个错误的脚本

1
2
3
root@140 opt]# bash -x huhu.sh 
huhu.sh:行3: 未预期的符号 `do' 附近有语法错误
huhu.sh:行3: `frr i in $*;do'

写脚本注意事项

  • 禁止将为成功执行的代码直接写入脚本
  • 脚本中的命令一定要用绝对路径

shell算术运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 变量
A=30
B=20

# A加上B
echo $[$A + $B]

# A减去B
echo $[$A - $B]

# A乘以B
echo $[$A * $B]

# A除以B
echo "scale=2;$A/$B"|bc

命令间的逻辑关系

1
2
3
4
# 逻辑与:&&
含义:当前一个命令执行成功后,再次执行后面的命令
# 逻辑非:||
含义:当前一个命令执行失败后,再次执行后面的命令

练习

1.写一个脚本,要求如下:

  • 设定变量Fa的值为/etc/passwd
  • 设定变量line的为$(cat $Fa | wc -l)
  • 依次向/etc/passwd中的每个用户问好,并且说出对方的ID是什么。结果输出如下:
    • Hello,root,your UID is 0.
  • 统计当前系统一个有多少个用户并输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

# 设置变量
Fa=/etc/passwd
line=$(cat $Fa | wc -l)

# 取出用户名以及UID
for ((i=1;i<=$line;i++));do
username=$(awk -F ':' -vi=$i "NR==$i {print $ 1}" $Fa)
user_uid=$(awk -F ':' -vi=$i "NR==$i {print $ 1}" $Fa)

# 给每个用户问好
echo "hello $username , your uid is $user_uid ."
done

# 统计用户
echo "Cuerrent system has $(cat $Fa | wc -l) user."

2.写一个脚本,传递两个整数给此脚本,让脚本分别计算并显示这两个整数的和,差,积,商

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
[root@140 opt]# cat suanfa.sh
#!/bin/bash

# 变量
A=$1
B=$2

# A加上B
echo $A+$B=$[$A + $B]

# A减去B
echo $A-$B=$[$A - $B]

# A乘以B
echo $A*$B=$[$A * $B]

# 设置变量
chuyi=$(echo "scale=2;$A/$B"|bc)

# A除以B
echo $A/$B=$chuyi

[root@140 opt]# bash suanfa.sh 50 20
50+20=70
50-20=30
50*20=1000
50/20=2.50

3.写一个脚本,要求如下:

  • 创建目录/tmp/scripts
  • 切换至此目录中
  • 复制/etc/pam.d目录至当前目录,并重命名为test
  • 将当前目录的test及其里面的文件和子目录的属主改为redhat
  • 将test及其子目录中的文件的其它用户的权限改为没有任何权限
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
[root@140 opt]# cat mulu.sh 
#!/bin/bash

#设置变量
mkdir=/usr/bin/mkdir
cd=/usr/bin/cd
cp=/usr/bin/cp
chown=/usr/bin/chown
chmod=/usr/bin/chmod
useradd=/usr/bin/useradd
# 一条命令解决
mkdir /tmp/scripts && cd /tmp/scripts && cp -rf /etc/pam.d ./test && chown -Rf redhat: test || useradd redhat && chmod -Rf o-rwx test

[root@140 opt]# bash -x mulu.sh
+ mkdir=/usr/bin/mkdir
+ cd=/usr/bin/cd
+ cp=/usr/bin/cp
+ chown=/usr/bin/chown
+ chmod=/usr/bin/chmod
+ useradd=/usr/bin/useradd
+ mkdir /tmp/scripts
+ cd /tmp/scripts
+ cp -rf /etc/pam.d ./test
+ chown -Rf redhat: test
+ chmod -Rf o-rwx test

4.写一个脚本,要求如下:

  • 显示当前系统日期和时间,而后创建目录/tmp/lstest
  • 切换工作目录至/tmp/lstest
  • 创建目录a1d,b56e,6test
  • 创建空文件xy,x2y,732
  • 列出当前目录下以a,x或者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
30
31
32
33
34
35
36
[root@140 opt]# cat shijian.sh 
#!/bin/bash

# 设置变量
date=/usr/bin/date
mkdir=/usr/bin/mkdir
cd=/usr/bin/cd
touch=/usr/bin/touch
ls=/usr/bin/ls


date && mkdir /tmp/lstest && cd /tmp/lstest && mkdir a1d b56e 6test && touch xy x2y 732 && ls a* x* 6* && ls [a-z][0-9]*
[root@140 opt]# bash -x shijian.sh
+ date=/usr/bin/date
+ mkdir=/usr/bin/mkdir
+ cd=/usr/bin/cd
+ touch=/usr/bin/touch
+ ls=/usr/bin/ls
+ date
2019年 05月 21日 星期二 22:11:10 CST
+ mkdir /tmp/lstest
+ cd /tmp/lstest
+ mkdir a1d b56e 6test
+ touch xy x2y 732
+ ls a1d x2y xy 6test
x2y xy

6test:

a1d:
+ ls a1d b56e x2y
x2y

a1d:

b56e:

正则表达式

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

正则表达式分类

正则表达式:REGEXP REGular EXPression

可分为两种:

  • Basic REGEXP (基本正则表达式)
  • Extended REGEXP (扩展正则表达式)

基本正则表达式

  • 元字符
1
2
3
.	任意单个字符
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符
  • 匹配次数(贪婪模式)
1
2
3
4
5
*	匹配其前面的任意单个字符任意次
.* 任意长度的任意字符
\? 匹配其前面的任意单个字符1次或0次
\+ 匹配其前面的任意单个字符至少1次
\{m,n\} 匹配其前面的任意单个字符至少m次,至多n次
  • 位置锚定
1
2
3
4
5
^	锚定行首,此字符后面的任意单个字符必须出现在行首
$ 锚定行尾,此字符前面的任意单个字符必须出现在行尾
^$ 空白行
\<或\b 锚定词首,其后面的任意单个字符必须作为单词首部出现
\>或\b 锚定词尾,其前面的任意单个字符必须作为单词尾部出现
  • 分组
1
2
\(\) 
例如:\(ab\)*
  • 后向引用
1
2
\1	引用第一个左括号以及与之对应的右括号所包括的所有内容
\2 引用第二个左括号以及与之对应的右括号所包括的所有内容

扩展正则表达式

  • 字符匹配
1
2
3
.       //匹配任意单个字符
[] //匹配指定范围内的任意单个字符
[^] //匹配指定范围外的任意单个字符
  • 次数匹配
1
2
3
4
*	匹配其前面的任意单个字符任意次
? 匹配其前面的任意单个字符1次或0次
+ 匹配其前面的任意单个字符至少1次
{m,n} 匹配其前面的任意单个字符至少m次,至多n次
  • 位置锚定
1
2
3
4
5
^	锚定行首,此字符后面的任意单个字符必须出现在行首
$ 锚定行尾,此字符前面的任意单个字符必须出现在行尾
^$ 空白行
\<或\b 锚定词首,其后面的任意单个字符必须作为单词首部出现
\>或\b 锚定词尾,其前面的任意单个字符必须作为单词尾部出现
  • 分组
1
2
3
()	分组
\1,\2,\3,....
例如:(ab)*
  • 后向引用
1
2
\1	引用第一个左括号以及与之对应的右括号所包括的所有内容
\2 引用第二个左括号以及与之对应的右括号所包括的所有内容
  • 或者
1
2
|	or 默认匹配|的整个左侧或者整个右侧的内容
例如:C|cat表示C或者cat,要想表示Cat或者cat则需要使用分组,如(C|c)at

httpd服务

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

httpd简介

Apache HTTP Server(简称Apache或httpd)是Apache软件基金会的一个开放源代码的网页服务器软件,旨在为unix,windows等操作系统中提供开源httpd服务。由于其安全性、高效性及可扩展性,被广泛使用,自1996年4月以来,Apache一直是Internet上最流行的HTTP服务器。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器等编译到httpd的相关模块中。

apache

httpd版本

在CentOS6.X的版本中默认是提供httpd-2.2版本的rpm包

在CentOS7.X的版本中默认师提供httpd-2.4版本的rpm包

本篇博文主要介绍httpd-2.4

httpd的特性

工作模型 工作方式
prefork 多进程模型,预先生成进程,一个请求用一个进程响应 一个主进程负责生成n个子进程,子进程也称为工作进程 每个子进程处理一个用户请求,即使没有用户请求,也会预先生成多个空闲进程,随时等待请求到达 最大不会超过1024个
worker 基于线程工作,一个请求用一个线程响应(启动多个进程,每个进程生成多个线程)
event 基于事件的驱动,一个进程处理多个请求

httpd-2.4新增的模块

  • mod_proxy_fcgi 反向代理时支持apache服务器后端的模块
  • mod_ratelimit 提供速率限制功能的模块
  • mod_remoteip 基于ip的访问控制机制被改变,不再支持使用Order,Deny,Allow来做基于IP的访问控制

httpd基础

httpd自带的工具程序

  • htpasswd basic认证基于文件实现时,用到的帐号密码生成工具

  • htpasswd httpd自带的服务控制脚本,支持start,stop,restart

  • apxs 由httpd-devel包提供的,扩展httpd使用第三方模块的工具

  • rotatelogs 日志滚动工具

  • suexec 访问某些有特殊权限配置的资源时,临时切换至指定用户运行的工具

  • ab apache benchmark,httpd的压力测试工具

rpm包安装httpd程序环境

/var/log/httpd/access.log 访问日志

/var/log/httpd/error_log 错误日志

/var/www/html/ 站点文档目录

/usr/lib64/httpd/modules/ 模块文件路径

/etc/httpd/conf/httpd.conf 主配置文件

/etc/httpd/conf.modules.d/*.conf 模块配置文件

/etc/httpd/conf.d/*.conf 辅助配置文件

web相关的命令

curl

  • curl是基于URL语法在命令行方式下工作的文件传输工具
  • 支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE及LDAP等协议
  • 功能有很多:https认证、http的POST/PUT等方法、ftp上传、kerberos认证、http上传、代理服务器、cookies、用户名/密码认证等
  • 最常用于下载
1
2
3
4
5
6
7
8
9
10
# 查看帮助信息
[root@server222 ~]# curl --help
# -o 把输出写到文件中
[root@server222 ~]# curl -o blog.html https://chineselijie.github.io/
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 13560 100 13560 0 0 15741 0 --:--:-- --:--:-- --:--:-- 15730
[root@server222 ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg 模板 图片 下载 桌面
blog.html 公共 视频 文档 音乐

httpd

1
2
3
4
5
6
7
httpd [options]
-l 查看静态编译的模块,列出核心中编译了哪些模块
-M 输出一个已经启用的模块列表
-v 显示httpd的版本,然后退出
-V 显示httpd和apr/apr-util的版本和编译参数,然后退出
-X 以调试模式运行httpd,ctrl+c退出
-t 检查配置文件是否有语法错误

编译安装httpd-2.4

准备环境

  1. 需yum安装Development Tools
  2. 需yum安装openssl-devel、pcre-devel、expat-devel、libtool
  3. 需编译安装apr-1.4、apr-util-1.4(1.4以上版本)
  4. 编译安装httpd-2.4
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# 安装Development Tools
[root@server222 ~]# yum groups mark install "Development Tools"
# 安装apache系统用户
[root@server222 ~]# useradd -r -M -s /sbin/nologin apache
[root@server222 ~]# id apache
uid=990(apache) gid=985(apache) 组=985(apache)
# 安装openssl-devel、pcre-devel、expat-devel、libtool
[root@server222 ~]# yum -y install openssl-devel pcre-devel expat-devel libtool
# 下载 apr-1.7、apr-util-1.6、httpd-2.4
[root@server222 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-util-1.6.1.tar.bz2 https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-1.7.0.tar.bz2 https://mirrors.tuna.tsinghua.edu.cn/apache/httpd/httpd-2.4.39.tar.bz2
# 解压
[root@server222 ~]# tar -xf apr-util-1.6.1.tar.bz2
[root@server222 ~]# tar -xf apr-1.7.0.tar.bz2
[root@server222 ~]# tar -xf httpd-2.4.39.tar.bz2
# 安装apr
[root@server222 ~]# cd apr-1.7.0/
[root@server222 apr-1.7.0]# vim configure
查找/$cfgfile
# $RM "$cfgfile //将这行注释
保存并退出
[root@server222 apr-1.7.0]# ./configure --prefix=/usr/local/apr
[root@server222 apr-1.7.0]# make && make install
# 安装apr-util
[root@server222 apr-1.7.0]# cd /root/apr-util-1.6.1/
[root@server222 apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@server222 apr-util-1.6.1]# make && make install
# 安装httpd
[root@server222 apr-util-1.6.1]# cd /root/httpd-2.4.39/
[root@server222 httpd-2.4.39]# ./configure --prefix=/usr/local/apache \
> --sysconfdir=/etc/httpd24 \
> --enable-so \
> --enable-ssl \
> --enable-cgi \
> --enable-rewrite \
> --with-zlib \
> --with-pcre \
> --with-apr=/usr/local/apr \
> --with-apr-util=/usr/local/apr-util/ \
> --enable-modules=most \
> --enable-mpms-shared=all \
> --with-mpm=prefork

[root@server222 httpd-2.4.39]# make && make install
# 创建http的控制脚本
[root@server222 httpd-2.4.39]# echo 'export PATH=/usr/local/apache/bin:$PATH' >/etc/profile.d/httpd.sh
[root@server222 httpd-2.4.39]# bash
[root@server222 httpd-2.4.39]# which httpd
/usr/local/apache/bin/httpd
[root@server222 httpd-2.4.39]# /usr/local/apache/bin/apachectl start
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::1bd0:d77:f2c2:6f3%ens33. Set the 'ServerName' directive globally to suppress this message
httpd (pid 104458) already running
# 出现报错 解决
[root@server222 httpd-2.4.39]# vim /etc/httpd24/httpd.conf
查找 /ServerName www.example.com
# ServerName www.example.com:80 //将前面的注释取消掉
保存并退出
[root@server222 httpd-2.4.39]# /usr/local/apache/bin/apachectl start
httpd (pid 104458) already running
[root@server222 httpd-2.4.39]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:111 *:*
LISTEN 0 5 192.168.122.1:53 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:631 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::111 :::*
LISTEN 0 128 :::80 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 ::1:631 :::*
LISTEN 0 100 ::1:25 :::*
# 可以看到80 端口已经启用
# 关闭防护墙和SElinux
[root@server222 httpd-2.4.39]# systemctl stop firewalld.service
[root@server222 httpd-2.4.39]# setenforce 0

打开火狐输入IP地址

简略解释选项含义:

–enable-so 启用动态支持

–with-zlib 使用zlib压缩库,将数据压缩再传输

–enable-modules=most 启用哪些模块

–enable-mpms-shared=all 把哪些模块做成动态共享模块

httpd常用配置

yum安装:/etc/httpd/conf.modules.d/00-mpm.conf:切换使用MPM(工作模型)

  • prefork
  • event
  • worker

源码安装:就在主配置文件中(/etc/httpd/httpd.conf)

  • 模块文件在/usr/local/apache/modules中以.so结尾的文件

查看配置文件/etc/httpd/httpd.conf

1
2
3
4
5
6
7
8
9
10
11
12
# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule mpm_event_module modules/mod_mpm_event.so
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbd_module modules/mod_authn_dbd.so
#LoadModule authn_socache_module modules/mod_authn_socache.so
LoadModule authn_core_module modules/mod_authn_core.so

访问控制法则

  • 可针对全局设置,也可针对某个目录做访问控制
法则 功能
Require all granted 允许所有主机访问
Require all denied 拒绝所有主机访问
Require ip IPADDR 授权指定来源地址的主机访问
Require not ip IPADDR 拒绝指定来源地址的主机访问
Require host HOSTNAME 授权指定来源主机名的主机访问
Require not host HOSTNAME 拒绝指定来源主机名的主机访问
IPADDR的类型 HOSTNAME的类型
IP:192.168.1.1 Network/mask:192.168.1.0/255.255.255.0 Network/Length:192.168.1.0/24 Net:192.168 FQDN:特定主机的全名 DOMAIN:指定域内的所有主机
  • 注意:httpd-2.4版本默认是拒绝所有主机访问的,所以安装以后必须做显示授权访问

禁止特殊IP访问

1
2
3
4
5
6
7
8
9
10
11
12
[root@server222 ~]# vim /etc/httpd/httpd.conf
#在最后面加上
<VirtualHost 192.168.176.222:80>
DocumentRoot "/usr/local/apache/htdocs"
<Directory /usr/local/apache/htdocs>
<RequireAll>
Require all granted
Require not ip 192.168.176.111
</RequireAll>
</Directory>
</VirtualHost>
[root@server222 ~]# /usr/local/apache/bin/apachectl restart

在本地主机访问:

虚拟主机有三类:

1
2
3
4
5
6
7
8
[root@server222 ~]# yum install httpd -y
[root@server222 ~]# vim /etc/httpd/conf/httpd.conf
119 DocumentRoot "/home/wwwroot"
120
121 #
122 # Relax access to content within /var/www.
123 #
124 <Directory "/home/wwwroot">
  • 相同IP不同端口
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
[root@server222 ~]# mkdir -p /home/wwwroot/80
[root@server222 ~]# mkdir -p /home/wwwroot/81
[root@server222 ~]# echo "port:80" > /home/wwwroot/80/index.html
[root@server222 ~]# echo "port:81" > /home/wwwroot/81/index.html
[root@server222 ~]# vim /etc/httpd/conf/httpd.conf
#找到Listen 80,在下一行加上Listen 81
Listen 80
Listen 81
[root@server222 ~]# vim /etc/httpd/conf/httpd.conf
[root@server222 ~]# tail -n 16 /etc/httpd/conf/httpd.conf
<VirtualHost 192.168.176.222:80>
DocumentRoot "/home/wwwroot/80"
ServerName "www.123.com"
<Directory "/home/wwwroot/80">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.176.222:81>
DocumentRoot "/home/wwwroot/81"
ServerName "www.abc.com"
<Directory "/home/wwwroot/81">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
[root@server222 ~]# setenforce 0
[root@server222 ~]# systemctl restart httpd
  • 不同IP相同端口
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
39
40
41
42
43
44
45
46
47
[root@server222 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@server222 ~]# tail -n 7 /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR0=192.168.176.222
IPADDR1=192.168.176.223
IPADDR2=192.168.176.224
PREFIX=24
GATEWAY=192.168.176.2
DNS1=192.168.176.2
IPV6_PRIVACY=no
[root@server222 ~]# systemctl restart network
[root@server222 ~]# ping 192.168.176.222
[root@server222 ~]# ping 192.168.176.223
[root@server222 ~]# ping 192.168.176.224
[root@server222 ~]# mkdir -p /home/wwwroot/10
[root@server222 ~]# mkdir -p /home/wwwroot/20
[root@server222 ~]# mkdir -p /home/wwwroot/30
[root@server222 ~]# echo "IP:192.168.176.222" > /home/wwwroot/10/index.html
[root@server222 ~]# echo "IP:192.168.176.223" > /home/wwwroot/20/index.html
[root@server222 ~]# echo "IP:192.168.176.224" > /home/wwwroot/30/index.html
[root@server222 ~]# vim /etc/httpd/conf/httpd.conf
[root@server222 ~]# tail -n 24 /etc/httpd/conf/httpd.conf
<VirtualHost 192.168.176.222>
DocumentRoot /home/wwwroot/10
ServerName www.123.com
<Directory /home/wwwroot/10 >
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.176.223>
DocumentRoot /home/wwwroot/20
ServerName www.456.com
<Directory /home/wwwroot/20 >
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.176.224>
DocumentRoot /home/wwwroot/30
ServerName www.789.com
<Directory /home/wwwroot/30 >
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
[root@server222 ~]# setenforce 0
[root@server222 ~]# systemctl restart httpd
  • 相同IP相同端口不同域名(常用)
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
[root@server222 ~]# tail -n 1 /etc/hosts
192.168.176.222 www.123.com www.abc.com
[root@server222 ~]# ping www.123.com
[root@server222 ~]# ping www.abc.com
[root@server222 ~]# mkdir -p /home/wwwroot/123
[root@server222 ~]# mkdir -p /home/wwwroot/abc
[root@server222 ~]# echo "WWW.123.com" > /home/wwwroot/123/index.html
[root@server222 ~]# echo "WWW.abc.com" > /home/wwwroot/abc/index.html
[root@server222 ~]# vim /etc/httpd/conf/httpd.conf
[root@server222 ~]# tail -n 16 /etc/httpd/conf/httpd.conf
<VirtualHost 192.168.176.222>
DocumentRoot "/home/wwwroot/123"
ServerName "www.123.com"
<Directory "/home/wwwroot/123">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.176.222>
DocumentRoot "/home/wwwroot/abc"
ServerName "www.abc.com"
<Directory "/home/wwwroot/abc">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
[root@server222 ~]# setenforce 0
[root@server222 ~]# systemctl restart httpd

练习

1.编译安装httpd-2.4

2.配置三种不同风格的虚拟主机

3.写博客,要写明环境背景、配置步骤,要有验证截图

MariaDB数据库

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[toc]

MariaDB数据库

​ 开发MariaDB数据库的开发人员以前是从事开发MySQL,但是MySQL被Oracle公司收购了,从开源软件转变为闭源软件,之后MySQL的开发者们就离开了公司,再次创建了一个名为MariaDB的数据库,可以说,MariaDB和MySQL在性能上基本保持一致,两者的操作命令也十分相似。从务实的角度来讲,在掌握了MariaDB数据库的命令和基本操作之后,在今后的工作中即使遇到MySQL数据库,也可以快速上手。

MariaDB-百度百科

MariaDB

​ 当前,谷歌、维基百科等技术领域决定将MySQL数据库上的业务转移到MariaDB数据库,Linux开源系统的领袖红帽公司也决定在RHEL 7、CentOS 7以及最新的Fedora系统中,将MariaDB作为默认的数据库管理系统,而且红帽公司更是首次将数据库知识加入到了RHCE认证的考试内容中。随后,还有数十个常见的Linux系统(如openSUSE、Slackware等)也作出了同样的表态。

初始化MariaDB服务

​ 相较于MySQL,MariaDB数据库管理系统有了很多新鲜的扩展特性,例如对微秒级别的支持、线程池、子查询优化、进程报告等。在配置妥当Yum软件仓库后,即可安装部署MariaDB数据库主程序及服务端程序了。

1
2
3
[root@server222 ~]# tail -n 1 /etc/fstab
/dev/cdrom /mnt/cdrom iso9660 defaults 0 0
[root@server222 ~]# mount -a
1
[root@server222 ~]# yum install -y mariadb mariadb-server

安装完成后加入到开机启动项

1
2
[root@server222 ~]# systemctl restart mariadb
[root@server222 ~]# systemctl enable mariadb

初始化5步骤

  1. 设置root管理员在数据库中的密码值(注意,该密码并非root管理员在系统中的密码,这里的密码值默认应该为空,可直接按回车键)。
  2. 设置root管理员在数据库中的专有密码。
  3. 随后删除匿名账户,并使用root管理员从远程登录数据库,以确保数据库上运行的业务的安全性。
  4. 删除默认的测试数据库,取消测试数据库的一系列访问权限。
  5. 刷新授权列表,让初始化的设定立即生效。
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
[root@server222 ~]# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): #当前数据库密码为空,直接回车
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y
New password: # 设置创建数据库管理员密码
Re-enter new password: #再次输入密码
Password updated successfully!
Reloading privilege tables..
... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y #删除匿名账户
... Success!

Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y # 禁止root管理员从远程登陆
... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y #删除text数据库并取消对它的访问权限
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y # 刷新授权表,让初始化后的设定立即生效
... Success!

Cleaning up...

All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
[root@server222 ~]#

之后我们还要设置防火墙,使其放行对数据库服务程序的访问请求,数据库服务程序默认会占用3306端口,在防火墙策略中服务名称统一叫作mysql

1
2
3
4
[root@server222 ~]# firewall-cmd --permanent --add-service=mysql
success
[root@server222 ~]# firewall-cmd --reload
success

最后,我们可以开始首次登陆MariaDB数据库

-u 指定哪一位用户登陆

-p 验证该用户在数据库中的密码值

1
2
3
4
5
6
7
8
9
10
11
[root@server222 ~]# mysql -u root -p
Enter password: #此处输入您刚才设置的密码
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 12
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

在登陆MariaDB数据库执行命令时候,每一次都要在命令结尾以分号(;)结尾

1
2
3
4
5
6
7
8
9
MariaDB [(none)]> SHOW databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

使用数据库命令更改密码

1
2
3
4
5
6
7
8
9
10
MariaDB [(none)]> SET password = PASSWORD('abccba');
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> exit
Bye
[root@server222 ~]# mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
[root@server222 ~]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.

管理用户以及授权

创建专用的数据库管理账户

1
2
MariaDB [mysql]> CREATE USER abc@localhost IDENTIFIED BY '123321';
Query OK, 0 rows affected (0.00 sec)

查询账户

1
2
3
4
5
6
7
8
9
10
11
MariaDB [(none)]> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

MariaDB [mysql]> SELECT HOST,USER,PASSWORD FROM user WHERE USER="abc";
+-----------+------+-------------------------------------------+
| HOST | USER | PASSWORD |
+-----------+------+-------------------------------------------+
| localhost | abc | *437F1809645E0A92DAB553503D2FE21DB91270FD |
+-----------+------+-------------------------------------------+
1 row in set (0.00 sec)

授权:grant

命令 作用
GRANT 权限 ON 数据库.表单名称 TO 用户名@主机名 对某个特定数据库中的特定表单给予授权
GRANT 权限 ON 数据库.* TO 用户名@主机名 对某个特定数据库中的所有表单给予授权
GRANT 权限 ON . TO 用户名@主机名 对所有数据库及所有表单给予授权
GRANT 权限1,权限2 ON 数据库.* TO 用户名@主机名 对某个数据库中的所有表单给予多个授权
GRANT ALL PRIVILEGES ON . TO 用户名@主机名 对所有数据库及所有表单给予全部授权(需谨慎操作)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> GRANT SELECT,UPDATE,DELETE,INSERT ON mysql.user TO abc@localhost;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> SHOW GRANTS FOR abc@localhost; +------------------------------------------------------------------------------------------------------------+
| Grants for abc@localhost |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'abc'@'localhost' IDENTIFIED BY PASSWORD '*437F1809645E0A92DAB553503D2FE21DB91270FD' |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `mysql`.`user` TO 'abc'@'localhost' |
+------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

经过一系列的操作,我们再切入到abc用户

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
[root@server222 ~]# mysql -u abc -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 22
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show database;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'database' at line 1
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
+--------------------+
2 rows in set (0.00 sec)

MariaDB [(none)]> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> show tables;
+-----------------+
| Tables_in_mysql |
+-----------------+
| user |
+-----------------+
1 row in set (0.00 sec)

收回权限命令:revoke

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
[root@server222 ~]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 24
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> REVOKE SE
SECOND SELECT SERIALIZABLE
SECOND_MICROSECOND SENSITIVE SESSION
SECURITY SEPARATOR SESSION_USER
SEC_TO_TIME SERIAL SET
MariaDB [mysql]> REVOKE SELECT
Display all 1116 possibilities? (y or n)
MariaDB [mysql]> REVOKE SELECT,UPDATE,DELETE,INSERT ON mysql.user FROM abc@localhost;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> SHOW GRANTS FOR abc@localhost;
+------------------------------------------------------------------------------------------------------------+
| Grants for abc@localhost |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'abc'@'localhost' IDENTIFIED BY PASSWORD '*437F1809645E0A92DAB553503D2FE21DB91270FD' |
+------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

创建数据库与表单

自定义数据库表结构

用法 作用
CREATE database 数据库名称。 创建新的数据库
DESCRIBE 表单名称; 描述表单
UPDATE 表单名称 SET attribute=新值 WHERE attribute > 原始值; 更新表单中的数据
USE 数据库名称; 指定使用的数据库
SHOW databases; 显示当前已有的数据库
SHOW tables; 显示当前数据库中的表单
SELECT * FROM 表单名称; 从表单中选中某个记录值
DELETE FROM 表单名 WHERE attribute=值; 从表单中删除某个记录值

现在我们创建一个名为tom的数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
MariaDB [(none)]> CREATE DATABASE tom;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> SHOW databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| tom |
+--------------------+
4 rows in set (0.00 sec)

想要创建数据表单,首先需要切换到指定的数据库中,我们现在在tom数据库中创建表单mybook。然后进行表单的初始化,即定义存储数据内容的结构。我们分别定义3个字段项,其中,长度为15个字符的字符型字段name用来存放图书名称,整型字段price和pages分别存储图书的价格和页数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
MariaDB [(none)]> use tom;
Database changed
MariaDB [tom]> CREATE TABLE mybook (name char(15),price int,pages int);
Query OK, 0 rows affected (0.00 sec)

MariaDB [tom]> DESCRIBE mybook;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(15) | YES | | NULL | |
| price | int(11) | YES | | NULL | |
| pages | int(11) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)

MariaDB [tom]>

管理表单及数据

​ 接下来向mybook数据表单中插一条图书信息。为此需要使用INSERT命令,并在命令中写清表单名称以及对应的字段项。执行该命令之后即可完成图书写入信息。下面我们使用该命令插入一条图书信息,其中书名为gelintonghua,价格和页数分别是60元和518页。在命令执行后也就意味着图书信息已经成功写入到数据表单中,然后就可以查询表单中的内容了。我们在使用select命令查询表单内容时,需要加上想要查询的字段。

1
2
MariaDB [tom]> INSERT INTO mybook(name,price,pages) VALUES('gelintonghua','60', '518');
Query OK, 1 row affected (0.00 sec)

如果想查看表单中的所有内容,则可以使用星号(*)通配符来显示

1
2
3
4
5
6
7
MariaDB [tom]> select * from mybook;
+--------------+-------+-------+
| name | price | pages |
+--------------+-------+-------+
| gelintonghua | 60 | 518 |
+--------------+-------+-------+
1 row in set (0.00 sec)

更改图书的价格

1
2
3
4
5
6
7
8
9
10
11
12
13
MariaDB [tom]> UPDATE mybook SET price=55 ;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

MariaDB [tom]> SELECT name,price FROM mybook;
+--------------+-------+
| name | price |
+--------------+-------+
| gelintonghua | 55 |
+--------------+-------+
1 row in set (0.00 sec)

MariaDB [tom]>

删除命令:delete

1
2
3
4
5
MariaDB [tom]> DELETE FROM mybook;
Query OK, 1 row affected (0.00 sec)

MariaDB [tom]> SELECT * FROM mybook;
Empty set (0.00 sec)

查询大于某一个数值的信息

首先我们插入四条数据

1
2
3
4
5
6
7
8
9
10
MariaDB [tom]> INSERT INTO mybook(name,price,pages) VALUES('123','30','518');   Query OK, 1 row affected (0.00 sec)

MariaDB [tom]> INSERT INTO mybook(name,price,pages) VALUES('456','50','518');
Query OK, 1 row affected (0.00 sec)

MariaDB [tom]> INSERT INTO mybook(name,price,pages) VALUES('789','80','518');
Query OK, 1 row affected (0.00 sec)

MariaDB [tom]> INSERT INTO mybook(name,price,pages) VALUES('101','100','518');
Query OK, 1 row affected (0.00 sec)

命令where

参数 作用
= 相等
<>或!= 不相等
> 大于
< 小于
>= 大于或等于
<= 小于或等于
BETWEEN 在某个范围内
LIKE 搜索一个例子
IN 在列中搜索多个值

在mybook表单中查找出价格大于75元或价格不等于80元的图书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
MariaDB [tom]> SELECT * FROM mybook WHERE price>75;
+------+-------+-------+
| name | price | pages |
+------+-------+-------+
| 789 | 80 | 518 |
| 101 | 100 | 518 |
+------+-------+-------+
2 rows in set (0.00 sec)

MariaDB [tom]> SELECT * FROM mybook WHERE price!=80;
+------+-------+-------+
| name | price | pages |
+------+-------+-------+
| 123 | 30 | 518 |
| 456 | 50 | 518 |
| 101 | 100 | 518 |
+------+-------+-------+
3 rows in set (0.00 sec)

数据库的备份及恢复

命令mysqldump

​ mysqldump命令用于备份数据库数据,格式为“mysqldump [参数] [数据库名称]”。其中参数与mysql命令大致相同,-u参数用于定义登录数据库的账户名称,-p参数代表密码提示符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

MariaDB [(none)]> exit
Bye
[root@server222 ~]# mysqldump -u root -p mysql > /root/mysql.dump
Enter password:
[root@server222 ~]# ls
anaconda-ks.cfg mysql.dump 模板 图片 下载 桌面
initial-setup-ks.cfg 公共 视频 文档 音乐

进入MariaDB数据库管理系统,删除mysql数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@server222 ~]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 45
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> DROP DATABASE mysql;
Query OK, 24 rows affected, 2 warnings (0.00 sec)

MariaDB [(none)]> SHOW databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
+--------------------+
2 rows in set (0.00 sec)

MariaDB [(none)]> CREATE DATABASE mysql;
Query OK, 1 row affected (0.00 sec)

恢复数据库mysql

1
2
3
[root@server222 ~]# mysql -u root -p mysql > /root/mysql.dump
Enter password:
[root@server222 ~]#

练习

1.搭建mysql服务
2.创建一个以你名字为名的数据库,并创建一张表student,该表包含三个字段(id,name,age),表结构如下:

1
2
3
4
5
6
7
8
9
mysql> desc student;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(100) | NO | | NULL | |
| age | tinyint(4) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

3.查看下该新建的表有无内容(用select语句)
4.往新建的student表中插入数据(用insert语句),结果应如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+----+-------------+------+
| id | name | age |
+----+-------------+------+
| 1 | tom | 20 |
| 2 | jerry | 23 |
| 3 | wangqing | 25 |
| 4 | sean | 28 |
| 5 | zhangshan | 26 |
| 6 | zhangshan | 20 |
| 7 | lisi | NULL |
| 8 | chenshuo | 10 |
| 9 | wangwu | 3 |
| 10 | qiuyi | 15 |
| 11 | qiuxiaotian | 20 |
+----+-------------+------+

5.修改lisi的年龄为50
6.以age字段降序排序
7.查询student表中年龄最小的3位同学
8.查询student表中年龄最大的4位同学
9.查询student表中名字叫zhangshan的记录
10.查询student表中名字叫zhangshan且年龄大于20岁的记录
11.查询student表中年龄在23到30之间的记录
12.修改wangwu的年龄为100
13.删除student中名字叫zhangshan且年龄小于等于20的记录

  • © 2019-2020 Li Jie
  • Powered by Hexo Theme Ayer
    • PV:
    • UV:

喜欢就打赏吧~

支付宝
微信