Linux学习笔记
目录
- 前言
- 1 Linux简介
- 2 linux系统安装
- 3 linux常用命令
-
- 3.1 Linux背景
- 3.2 文件和目录相关命令
- 3.3 vim编辑器
- 4 进程相关命令
- 5 辅助命令(选学)
- 6 字符串处理命令:选学
- 7 linux系统的管理与维护
- 8 服务器端应用程序安装
前言
本文将会从Linux系统的如何安装和如何进行一些基本的操作以及java中常用的服务器部署操作为主要内容。
基于尚硅谷2021.10月结课面授班视频教程笔记。
下面是将会用到的一些账户和密码。
普通用户账户名:yanzuwu
普通用户密码:atguigu123456
root密码:123456
mysql连接时使用的账户和密码:
username=root
password=atguigu
1 Linux简介
Linus和他的虚拟团队的工作仅仅是开发了Linux内核以及附带的一些工具,尚不能作为一个完整的可以交给终端用户使用的操作系统。为了方便用户使用,很多的商业公司或非营利团体,就将Linux 内核(包括工具)与可运行的软件整合起来,再加上系统的安装工具。这个『内核+软件+工具』的完全可安装的整体,我们称之为Linux distribution,这就是Linux的发行版,港台腔叫发行套件。这是Linux这样的开放式系统和Windows、Mac等这些封闭式系统的一个显著差别。
初学Linux通常会选择CentOS,这其实是RedHat收费后去掉收费功能而发布的一个免费的社区版。
主要的Linux发行版有:
①RedHat
http://www.redhat.com
②Fedora
http://fedoraproject.org
③Debian
http://www.debian.org
④Ubuntu
http://www.ubuntu.com
⑤CentOS
CentOS是RedHat的社区版
http://www.centos.org
我们可以从网易开源镜像站获取CentOS系统的镜像文件。
http://mirrors.163.com
2 linux系统安装
2.1 基本思路
基本思路是使用VMWare这样的虚拟机软件创建一个“虚拟计算机”,在虚拟机上安装Linux系统。
2.2 在VM中创建虚拟机
图解具体步骤:
2.3 自定义安装centos系统
上面设置的只是一个普通用户,初学时我们建议使用的是root用户。所以我们进行注销登录之后重新设置root用户。
2.4 远程连接工具—xfshell和xftp
我们下载这两个工具之后并进行连接设置既可使用,过程简单,此处不再叙述。
3 linux常用命令
3.1 Linux背景
①文件系统
Linux系统环境下的文件系统与Windows有很大区别。 在Windows中,每一个盘符下是一个独立的文件系统,硬盘有多少个分区就有多少个文件系统。
而在Linux系统中不管创建了多少个硬盘分区都只有一个文件系统。整个文件系统的根目录是“/”,从“/”出发可以找到Linux系统中的所有目录和文件。
②路径
绝对路径:从“/”根目录开始逐层查找文件和目录。
/etc/sysconfig/network-scripts
/tmp/vmware-root/vmware-db.pl.2267
相对路径:以当前目录或上一级目录为基准逐层查找文件和目录
当前目录:“./” 当前目录的上一级目录:“…/”
“./”可以省略不写,也同样表示当前目录。
“/”这个是linux系统最上层目录。
比如:创建一个名为tom的用户,它的家目录就是/home/tom
可以使用“~”代表用户的家目录。
特殊的是作为系统的超级管理员,root用户的家目录是/root目录。
这个是用户家目录。每一个用户都有自己的家目录。
目录名 | 是否重要 | 作用 |
---|---|---|
/bin | bin是binary的缩写,这个目录存放着最经常使用的命令。 | |
/boot | 这里存放的是启动Linux时用到的引导程序文件。 | |
/dev | device(设备)的缩写,该目录下存放的是Linux的外部设备。 | |
/etc | √ | 存放系统和第三方应用程序的配置文件。 |
/home | √ | 存放普通用户家目录。 |
/lib和/lib64 | 系统开机所需要最基本的动态连接共享库。 | |
/media | 挂载Linux系统会自动识别的设备,例如U盘、光驱等。 | |
/mnt | mnt是mount(挂载)的缩写,这个目录专门用于挂载操作的目录。 | |
/opt | √ | 存放安装第三方应用程序时使用的压缩包文件。 |
/proc | 这个目录是一个虚拟的目录,它是系统内存的映射。 | |
/root | √ | 超级管理员root用户的家目录。 |
/run | 存放进程产生的临时文件,关机重启后会消失。 | |
/sbin | s是Super User的意思,这里存放的是系统管理员使用的系统管理程序。 | |
/srv | service缩写,该目录存放一些服务启动之后需要提取的数据。 | |
/sys | 该目录下安装了2.6内核中新出现的一个文件系统sysfs。 | |
/tmp | 存放临时文件。 | |
/usr | √ | 应用程序的默认安装目录,类似于Windows下的program files目录。 |
/var | √ | 存放经常变化的内容,例如日志文件。 |
3.2 文件和目录相关命令
①快捷键
按键 | 作用 |
---|---|
Ctrl+l | 清屏 |
Ctrl+c | 强制终止程序 |
Ctrl+Insert | 复制 |
Shift+Insert | 粘贴 |
Ctrl+s | 锁屏 |
Ctrl+q | 解除锁屏 |
tab | 自动补全 |
② 创建目录命令:mkdir directory
对应单词:make directory
作用:创建目录
格式:mkdir [OPTION]… DIRECTORY…
创建单层目录:mkdir 新目录的路径
单层目录说明:
mkdir aaa/bbb/ccc
其中aaa/bbb是存在的目录,要创建的仅仅是ccc
创建多层目录:mkdir -p 新目录的路径
多层目录说明:
mkdir -p aaa/bbb/ccc/ddd
其中bbb/ccc/ddd都不存在,现在想一次性把这些目录都建出来
③ 进入目录 : cd 目标目录路径
命令:cd
对应单词:change directory
作用:切换当前目录
格式: cd 目标目录路径
用法1:使用绝对路径
用法2:使用相对路径
用法3:使用~回到家目录
④列出目录内容 :ls (常用:ll)
命令:ls
对应单词:list
作用:列出目录中的内容,这里所说的目录可以是当前目录也可以是其他目录(需要指定路径)。
格式:ls [OPTION]… [FILE]…
常用参数
参数 | 说明 |
---|---|
-A | 显示目录内容时把隐藏资源也显示出来 |
-l | 以详细信息形式显示资源 |
-R | 递归查看目录内容 |
命令的参数既可以单独使用也可以组合使用。同时ls -l可以简写为ll。
⑤ 打印当前所在目录 : pwd
命令:pwd
对应单词:print work directory
作用:打印当前所在的目录
⑥ 新建文件: touch
命令:touch
作用:创建空文件
格式:touch 新建文件的路径
⑦ 复制 : cp
命令:cp
对应单词:copy
作用:复制文件或目录
- 复制文件:cp 被复制的文件的路径 目标目录的路径
- 复制目录:cp -r 被复制的目录的路径 目标目录的路径
⑧ 移动 :mv
命令:mv
对应单词:move
作用:移动文件或目录
格式:mv 被移动的文件或目录的路径 目标目录
特殊效果:将目录或文件在当前位置移动可以起到重命名的作用
⑨ 删除 : rm
命令:rm
对应单词:remove
作用:删除目录或文件
删除文件:rm 被删除的文件的路径
- 强制删除文件:rm -f 被删除的文件的路径
- 递归删除目录:rm -r 被删除的目录的路径
- 强制删除目录:rm -rf 被删除的目录的路径
⑩ 显示文件全部内容:cat
命令:cat
作用:显示文件全部内容
适用场景:较短小的文件
⑪ 分屏查看文件内容: less
命令:less
作用:分屏查看文件内容
[root@localhost ~]# less long
按键 | 效果 |
---|---|
空格 | 向下滚动一屏 |
b | 向上滚动一屏 |
回车 | 向下滚动一行 |
q | 退出 |
/关键词 | 搜索 n向下找 N向上找 |
= | 显示详细的文件信息 |
⑫显示文件末尾的部分内容:tail
命令:tail
效果:显示文件末尾的部分内容
- 查看文件末尾5行的内容:tail -n 5 文件名
- 使用-F参数实时查看文件末尾新增的内容: tail -F 文件名
- 使用Ctrl+c 退出监控
⑭查找文件或目录:find
命令:find
作用:查找文件或目录
用法:find 查找范围 参数 表达式
⑮基于索引查询文件或者目录:locate
原理:
系统启动时把每一个目录、每一个文件的完整路径保存到索引库中。使用locate命令搜索关键词时,就使用关键词查询索引库,把匹配的路径字符串返回。
而新建的文件或目录不会被系统吧路径存入索引库,那么使用locate命令就搜索不到。此时使用updatedb命令更新一下索引库就行了。
⑯将文件内容中匹配的行返回:grep
命令:grep
作用:将文件内容中匹配的行返回
用法:grep 参数 查找内容 源文件
补充:grep命令的关键词匹配和vim中的关键词搜索的区别
- vim需要打开文件进入到vim命令自己的界面中而grep命令不需要
- grep命令显示搜索结果时可以将匹配行抽取出来显示,而vim是在全部文件内容中把关键词高亮显示
- grep命令可以同时搜索多个文件
返回不匹配的行并显示行号
- 返回匹配的行并显示行号:grep -n 文件名
- 返回不匹配的行并显示行号: grep -nv 文件名
⑰管道:|
管道不是命令,而是一个符号:“|”。它的用法是:命令A | 命令B。作用是把命令A的输出作为命令B的输入。
举例
1、需求
显示当前目录下的所有文件。如果使用“ll”命令那么文件和目录都会显示出来。
2、文件和目录的特征
在显示的详细信息中,文件是以“-”开头的,目录是以“d”开头的。
3、按照特征编写正则表达式
匹配以“-“开头的行:^-
4、完整的命令
5、工作机制解析
6、管道可以多重使用
⑱ 解压: tar
解压命令:
tar -zxvf tar包路径
默认解压到当前目录下,如果当前目录下有同名的目录或文件会被直接覆盖,没有任何提示,这一点请大家注意。
参数名称 | 作用 |
---|---|
-z | 用 gzip 对存档压缩或解压 |
-x | 解压 |
-v | 详细显示处理的文件 |
-f | 指定存档或设备 (缺省为 /dev/rmt0) |
3.3 vim编辑器
① 三种模式
一般模式:通过按键控制VIM工作
编辑模式:可以自由输入
指令模式:通过执行指令完成一些特殊操作
② 基本操作
1、打开一个文件
[root@localhost ~]# vim content.txt
即使这个文件不存在也没关系,vim知道我们打算新建一个文件。
2、进入编辑模式
进入编辑模式有很多种方法,现在我们先使用其中一种方法:按一下i键。进入编辑模式,然后再按Esc键回到一般模式。
3、 显示行号:set nu
4、保存已修改的内容 :w
当:set nu这个指令执行完成后,vim就又回到了一般模式。此时我们使用:w指令就可以保存文件。
5、退出 :q
使用:q指令就可以退出vim了
通常我们使用组合命令:wq
6、保存退出 :wq
:w是保存,:q是退出,:wq就是保存退出
7、不保存退出 : q!
③ 光标移动快捷键
1、方法一:方向键
很容易上手的操作方式,但是距离基准键位较远,熟练使用之后敲击键盘的速度大幅度提升,要移动这么远的举例还是非常不便的。
2、方法二:右手基准键
就在基准键位上,非常方便。
④ 前往指定行
1、 第一行 :gg
输入gg,将光标定位到第一行开头的位置。此时屏幕上并不会显示你输入了什么,需要你自己心里面知道。
2、 最后一行:G
输入G,将光标定位到最后一行开头的位置。
3、 指定行号:数字+G组合使用
假设我们要去第12行,那么依次输入“1”、“2”、“G”即可。这些也不会在屏幕上的任何地方显示,所以还是要我们自己心里清楚。
⑤ 改:一般模式下
这里我们说的是在一般模式下通过按键来编辑文件,并不是进入编辑模式。
按键 | 效果 |
---|---|
dd | 删除光标所在的行 |
d5d | 从光标所在行开始,向下连续删除5行(包括光标所在行) |
u | 撤销刚才的操作 |
Ctrl+r | 重做刚才撤销的操作 |
yy | 复制光标所在的行 |
p | 将当前复制的行粘贴到光标所在位置的下一行 |
y5y | 从光标所在行开始,向下连续复制5行(包括光标所在行) |
r | 替换光标所在位置的一个字符 第一步:按一下r键 第二步:输入新的字符 |
⑥ 进入编辑模式: i I(i大写) A a o(小写)
这次我们要看看有哪些方法可以进入编辑模式
按键 | 大小写说明 | 光标动作 |
---|---|---|
i | 小写 | 不动,就在当前位置,开始输入 |
I | 大写 | 移动到行的开头,开始输入 |
a | 小写 | 光标向后移动一格,然后开始输入 |
A | 大写 | 光标移动到行的末尾,然后开始输入 |
o | 小写 | 先在光标所在行的下面插入空行 然后把光标移动到空行的开头,再开始输入 |
⑦ 搜索
1、初始状态
2、进入指令模式:/
输入“/”,进入专门用于搜索关键词的指令模式。
3、输入关键词
4、回车执行搜索
关键词匹配到的内容会被高亮显示,区分大小写:
5、遍历匹配内容:n 或者N
在匹配到搜索结果后,可以逐个遍历各个匹配内容:
- 输入n向下找
- 输入N向上找
6、取消高亮显示:noh
使用:noh指令即可取消高亮
回车执行后的效果如下图所示:
⑧ 替换
1、新建文件
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?
2、执行替换
将to替换为TO
关键词替换指令格式解析:
3、效果
这时我们看到每一行只有第一个匹配的内容被替换了,后面的没有被替换。这是因为对正则表达式来说,它是以行为单位查找匹配的内容。每一行只要找到第一个匹配那么就可以判断这一行就是匹配的,没有必要继续向后查找了。如果我们需要将一行中的每一个匹配都替换,可以在指令后加/g
4、重新替换
先按u键撤销刚才的替换
重新运行替换指令:
效果:
⑨ 常见问题
1、屏幕被锁:Ctrl+q解锁
在Windows环境下大家已经习惯了使用Ctrl+s保存文档,但是在Linux环境下Ctrl+s是锁屏。如果是因为Ctrl+s锁屏那么可以使用Ctrl+q解锁,然后继续操作。
2、系统中没有vim命令
如果发现Linux系统中没有vim命令,那通常是因为这个Linux系统选择了最小安装。此时通常有vi命令可以使用。
如果当前Linux系统中能够连接外网,那么可以在线安装vim:
yum install -y vim
yum install这个命令会自动从yum库中下载安装包,而且安装包所依赖的其它包也会被自动下载,然后自动安装。
-y参数表示安装过程中,所有问我们yes、no的地方都按照yes处理,达到无人值守的安装效果。
为了确认当前Linux系统是否能够连外网,可以使用ping命令测试:
ping -c 5 www.baidu.com
-c参数指定ping的次数,如果不指定则持续ping。
4 进程相关命令
4.1 查看当前正在运行的进程 :ps(常用ps -ef)
①简介
命令:ps
对应单词:process status
作用:查看当前正在运行的进程
常用参数组合:ps -ef
-e参数:对应单词entire,表示全部。具体指显示系统中全部的进程信息。
-f参数:对应单词full-formate,表示完整格式。
② 进程信息中各列数据说明
列名 | 含义 |
---|---|
UID | 进程的用户信息 |
PID | 进程id。由系统分配,不会重复。 |
PPID | 父进程的id。父进程和子进程的关系是:父进程启动了子进程。 |
CMD | 当前进程所对应的程序。 |
C | 用整数表示的CPU使用率 |
STIME | 进程启动时间 |
TTY | 进程所在终端。所谓终端就是用户输入命令的操作界面。 |
TIME | 进程所占用的CPU时间 |
③ 父进程和子进程之间的关系
简单来说,父进程和子进程的关系是:父进程启动了子进程。我们可以使用pstree命令查看整个进程树。
④ 和其他命令配合
1、 分屏查看进程信息
全部进程的信息太多了,一屏无法全部显示,所以我们希望可以分屏显示并由我们来控制翻页。为了达到这个目标,我们可以使用管道符号将ps -ef命令的输出数据传送给less命令。
ps -ef | less
2、精确查询一个具体进程信息
我们通过Xshell远程连接Linux系统,靠的是sshd这个服务。这个服务如果正在运行中,那么一定会有这个服务对应的进程。所以下面我们来查询一下sshd这个命令的进程。
我们看到这里返回了3条结果,其中前两条都是和sshd服务相关的结果,但是最后一条不是。
root 72826 3456 0 20:06 pts/0 00:00:00 grep --color=auto sshd
仔细观察一下就能发现,这其实是grep命令本身。因为grep命令运行过程中本身也是一个进程,“grep sshd”正好也匹配sshd,所以就被选中了。但是这是一个干扰项,并不是我们真正要查询的内容,所以需要把它从查询结果中排除。
再用一层管道,使用grep命令的-v参数把匹配grep的行排除,返回不匹配的结果,这就是我们最终想要的。
4.2 杀死进程:kill
① 简介
命令:kill
作用:杀死进程
说明:kill命令本质上是给进程发送信号。
② 举例
1、打开火狐浏览器
在Linux系统中打开Linux系统自带的火狐浏览器。
2、查看火狐浏览器的进程id
另外一个是浏览器插件,不用管。
3、使用kill命令结束火狐浏览器进程
kill -s kill 3325
另一种写法是
kill -9 3325
上面两种写法本质上都是发送kill信号给火狐浏览器进程。
4.3 实时查看系统运行情况和健康状态 :top
① 细节
1、命令与参数
命令名 | 更新时间间隔(秒) | 不显示任何闲置或者僵死进程 | 通过进程id监控单一进程 |
---|---|---|---|
top | -d 间隔秒数 | -i | -p 进程id |
2、操作控制
按键 | 功能 |
---|---|
P | 默认值,根据CPU使用率排序 |
M | 以内存的使用率排序 |
N | 以PID排序 |
d | 设置数据刷新的时间间隔,单位是秒 |
q | 退出 |
在top命令模式下按h键会显示如下的帮助信息:
3、查询结果字段解释
[1]第一行信息为任务队列信息
内容举例 | 说明 |
---|---|
12:26:49 | 系统当前时间 |
up 1 day, 13:32 | 系统的运行时间,前面例子表示本机已经运行1天13小时32分钟 |
2 users | 当前登录了2个用户 |
load average:0.00, 0.00, 0.00 | 系统在之前1分钟,5分钟,15分钟的平均负载。 一般认为小于1时,负载较小。如果大于1,系统已经超出负荷。 |
[2]第二行为进程信息
内容举例 | 说明 |
---|---|
Tasks: 95 total | 系统中的进程总数 |
1 running | 正在运行的进程数 |
94 sleeping | 睡眠的进程 |
0 stopped | 正在停止的进程 |
0 zombie | 僵尸进程。如果不是0,需要手工检查僵尸进程 |
[3]第三行为CPU信息
内容举例 | 说明 |
---|---|
Cpu(s):0.1%us | 用户空间占用的CPU百分比,us对应user |
0.1%sy | 内核空间占用的CPU百分比,sy对应system |
0.0%ni | 改变过优先级的进程占用的CPU百分比,ni对应niced |
99.7%id | 空闲CPU的CPU百分比 |
0.1%wa | 等待输入/输出的进程的占用CPU百分比,wa对应IO wait |
0.0%hi | 硬中断请求服务占用的CPU百分比,hi对应hardware IRQ |
0.1%si | 软中断请求服务占用的CPU百分比,si对应software IRQ |
0.0%st | st(Steal time)虚拟时间百分比,也叫被hypervisor偷走的时间。 就是当有虚拟机时,虚拟CPU等待实际CPU的时间百分比。 |
[4]第四行为物理内存信息
内容举例 | 说明 |
---|---|
2031912 total | 物理内存的总量,单位KB |
70496 free | 空闲的物理内存数量 |
1780676 used | 已经使用的物理内存数量 |
174864 buff/cache | 作为缓冲的内存数量 |
使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是还未纳入内核管控范围的数量。
纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存还给free,因此Linux系统运行过程中free内存会越来越少,但不影响系统运行。因为这表示更多的空闲内存被内核管理了。
[5]第五行为交换分区(swap)信息
内容举例 | 说明 |
---|---|
2097148 total | 交换分区(虚拟内存)的总大小 |
1137824 free | 空闲交换分区的大小 |
959324 used | 已经使用的交互分区的大小 |
58640 avail Mem | 在不交换的情况下,对启动新应用程序可用内存的估计 |
交换分区是一个非常值得关注的地方,如果swap区的used数值持续发生变化那么说明在内核和交换分区之间正在持续发生数据交换,这表示内存不够用了——必须不断把内存中的数据保存到硬盘上。
4.4 查看网络状态:netstat(常用:netstat -anp)
①简介
命令:netstat
对应单词:net status
作用:查看网络状态
常用参数:netstat -anp
参数名 | 作用 |
---|---|
-a | 显示所有正在或不在侦听的套接字。 |
-n | 显示数字形式地址而不是去解析主机、端口或用户名。 |
-p | 显示套接字所属进程的PID和名称。 |
② 说明
netstat命令显示的网络状态信息包含两部分内容:
- 本机和外部的连接状态信息
- 本机系统内部进程间通信信息
1、网络连接信息
字段含义说明:
2、进程间通信信息
我们重点关注的是网络连接信息。
③ 使用技巧
1、分屏查看
netstat -anp | less
2、根据进程名称查看网络状态
netstat -anp | grep sshd
3、根据端口号查看网络状态
netstat -anp | grep :22
这里需要注意一下,端口号本身就是一串数字,进程id也是一串数字。那么根据端口号匹配时,很多无关的进程id也会被匹配到,造成大量不必要的干扰。此时给端口号数字前加上冒号就好多了。
5 辅助命令(选学)
① 查看命令历史:history
将命令的运行结果写入文件:
- 覆盖写:命令 > 文件路径
- 追加写:命令 >> 文件路径
这里给大家介绍一个非常有意思的文件:/dev/null。它被称为Linux系统的黑洞,因为不管写入多少数据到这个文件,数据都会被销毁。
②将数据输出到standard output(标准输出):echo
- standard output
如果我们说把一条数据打印到标准输出,那么我们就是在说:打印到命令行窗口。 - 在Linux系统中通过『$』来引用环境变量,例如:PATH
③ 帮助命令 :man 和 info
而man命令和info命令都可以调出一个命令对应的文档。区别在于man命令阅读体验略好,info命令文档内容更完整。
[1] man命令
命令:man
对应单词:manual
格式:man [要查询的命令]
控制方式:
按键 | 说明 |
---|---|
空格 | 向下滚动一屏 |
回车 | 向下滚动一行 |
b | 向上滚动一屏 |
q | 退出 |
/关键词 | 搜索关键词 n向下找 N向上找 |
[2] info命令
命令:info
对应单词:information
格式:info [要查询的命令]
控制方式:
按键 | 说明 |
---|---|
方向键:上 | 控制光标向上移动 |
方向键:下 | 控制光标向下移动 |
delete键 | 向上翻页 |
空格 | 向下翻页 |
PgUp | 向上翻页 |
PgDn | 向下翻页 |
q | 退出 |
其实info命令每次进入的都是同一个文档,只是不同被查询命令进入的是这个文档的不同位置而已。
[3] --help 命令
④服务器关机命令:shutdown
命令 | 作用 |
---|---|
sync | 将内存数据保存到硬盘上 |
poweroff | 关机 |
reboot | 重启 |
⑤ backslash
符号:\
作用:如果一个命令特别长,那么可以使用反斜杠表示到下一行继续输入
示例:
./configure \
–prefix=/usr/local/nginx \
–pid-path=/var/run/nginx/nginx.pid \
–lock-path=/var/lock/nginx.lock \
–error-log-path=/var/log/nginx/error.log \
–http-log-path=/var/log/nginx/access.log \
–with-http_gzip_static_module \
–http-client-body-temp-path=/var/temp/nginx/client \
–http-proxy-temp-path=/var/temp/nginx/proxy \
–http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
–http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
–http-scgi-temp-path=/var/temp/nginx/scgi
⑥ 通过命令给服务器发送请求:crul
官方文档说明节选:
curl is a tool to transfer data from or to a server, using one of the supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP). The command is designed to work without user interaction.
从文档中我们可以看到curl命令支持的通信协议非常丰富,其中我们最常用的还是HTTP协议。如果有需要curl可以通过参数详细设置请求消息头。
通过-X参数可以指定请求方式:
curl -X POST [资源的URL地址]
注意:X是大写的。
⑦ 下载文件:wegt
使用 -P 参数可以指定目标目录,例如:
wget -P /root https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-10/v10.0.8/bin/apache-tomcat-10.0.8.tar.gz
6 字符串处理命令:选学
① 正则表达式说明
符号 | 含义 |
---|---|
^ | 匹配字符串开始位置的字符 |
$ | 匹配字符串结束位置的字符 |
. | 匹配任何一个字符 |
* | 匹配前面的字符出现0~n次 |
[a,m,u] | 匹配字符a或m或u |
[a-z] | 匹配所有小写字母 |
[A-Z] | 匹配所有大写字母 |
[a-zA-Z] | 匹配所有字母 |
[0-9] | 匹配所有数字 |
|特殊符号转义 |
② 返回路径字符串中的资源部分:basename
返回路径字符串中的资源(文件或目录本身)部分
[root@apple w]# basename /aa/bb/cc/dd
dd
如果指定了后缀,basename会帮我们把后缀部分也去掉
[root@apple workspace]# basename /aa/bb/cc/dd.txt .txt
dd
③ 返回路径字符串中的目录部分:dirname
返回路径字符串中的目录部分
[root@apple w]# dirname /aa/bb/cc/dd
/aa/bb/cc
④ 字符串拆分:cut
根据指定符号拆分字符串并提取。默认根据 \t 拆分。
- -f 参数:指定要提取的列
- -d 参数:指定拆分依据的字符
准备测试数据:
[root@hadoop101 datas]$ touch cut.txt
[root@hadoop101 datas]$ vim cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
切割提取第一列:
[root@hadoop101 datas]$ cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le
切割提取第二、第三列:
[root@apple w]# cut -d " " -f 2,3 cut.txt
shen
zhen
wo
lai
la
在cut.txt中切出guan
[root@hadoop101 datas]$ cat cut.txt | grep "guan" | cut -d " " -f 1
guan
选取系统 PATH 变量值,第2个 “:” 开始后的所有路径:
命令中的横线表示列数的区间范围。3-表示从第三列开始的所有列;3-5表示第三列到第五列。
[root@hadoop101 datas]$ echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/atguigu/bin
[root@hadoop101 datas]$ echo $PATH | cut -d : -f 3-
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/atguigu/bin
切割ifconfig 后打印的IP地址:
[root@apple w]# ifconfig | grep "netmask" | cut -d "i" -f 2 | cut -d " " -f 2
192.168.41.100
127.0.0.1
192.168.122.1
另一种做法:
[root@apple workspace]# ifconfig | grep netmask | cut -d " " -f 10
192.168.41.100
127.0.0.1
192.168.122.1
⑤ awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
1、基本用法
awk [选项参数] ‘pattern1{action1} pattern2{action2}…’ filename
pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
使用-F参数指定分隔符。
awk命令的内置变量包括:
变量名 | 说明 |
---|---|
FILENAME | 文件名 |
NR | 已读取的记录 |
NF | 浏览记录的域的个数(切割后,列的个数) |
2、测试
# 准备数据
[root@hadoop101 datas]$ sudo cp /etc/passwd ./
# 搜索passwd文件以root关键字开头的所有行,并输出该行的第7列。
[root@hadoop101 datas]$ awk -F ':' '/root/{print $7}' passwd
/bin/bash
/sbin/nologin
# 搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以“,”号分割。
[root@hadoop101 datas]$ /bin/bash
/sbin/nologin
root,/bin/bash
# 只显示/etc/passwd的第一列和第七列,以逗号分割,且在第一行显示列名user和shell。在最后一行添加"dahaige,/bin/zuishuai"。
[root@hadoop101 datas]$ awk -F ':' 'BEGIN{print "user\tshell"} /root/{print $1"\t"$7} END{print "pig\t/hello/aaa"}' passwd
user shell
root /bin/bash
operator /sbin/nologin
pig /hello/aaa
# 输出两列数据。第一列:用户id,第二列用户id+1的结果
[root@rich datas]# awk -F ':' '{print $3" "$3+1}' passwd
0 1
1 2
2 3
3 4
4 5
5 6
# 统计 passwd 文件名,每行的行号,每行的列数
[root@rich workspace]# awk -F ':' '/root/{print FILENAME" "$1" "NR" "NF}' passwd
passwd root 1 7
passwd operator 10 7
# 切割IP
[root@apple workspace]# ifconfig | awk -F " " '/netmask/{print $2}'
192.168.41.100
127.0.0.1
192.168.122.1
# 查询sed.txt中空行所在的行号(需要先准备文件,其中包括空行)
[root@hadoop101 datas]$ awk '/^$/{print NR}' sed.txt
5
⑥ 排序:sort
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。
参数名 | 作用 |
---|---|
-n | 依照数值大小排序 |
-r | 相反顺序排序 |
-t | 设置排序时使用的分隔字符 |
-k | 指定需要排序的列 |
# 准备数据
[root@hadoop101 datas]$ touch sort.sh
[root@hadoop101 datas]$ vim sort.sh
bb:40:5.4
bd:20:4.2
xz:50:2.3
cls:10:3.5
ss:30:1.6
# 根据冒号切分,根据第2列排序。列的索引从1开始。
[root@rich workspace]# sort -t ':' -k 2 sort.txt
cls:10:3.5
bd:20:4.2
ss:30:1.6
bb:40:5.4
xz:50:2.3
# 在上例基础上反向排序
[root@rich workspace]# sort -t ':' -rk 2 sort.txt
xz:50:2.3
bb:40:5.4
ss:30:1.6
bd:20:4.2
cls:10:3.5
是否根据数值排序的区别:
# 修改测试数据
bb:40:5.4
uu:2:6.8
bd:20:4.2
xz:50:2.3
cls:10:3.5
ss:30:1.6
# 不使用 -n 参数,根据字符排序
# 只比较第一个字符,1 比 2 小
[root@rich workspace]# sort -t ':' -k 2 sort.txt
cls:10:3.5
bd:20:4.2
uu:2:6.8
ss:30:1.6
bb:40:5.4
xz:50:2.3
# 使用 -n 参数,根据数值排序
# 2 比 10 小
[root@rich workspace]# sort -t ':' -nk 2 sort.txt
uu:2:6.8
cls:10:3.5
bd:20:4.2
ss:30:1.6
bb:40:5.4
xz:50:2.3
⑦ xargs
xargs命令的作用:将管道符号提供的stdin数据转换为后面命令的命令行参数。
basename、dirname命令也不接受标准输入,如果我们希望动态处理路径字符串,需要通过xargs进行转换。
# 希望处理的路径字符串由pwd命令动态获取的
[root@rich workspace]# pwd
/root/workspace
# 把pwd命令的结果通过管道直接输入给basename命令,不接受
[root@rich workspace]# pwd | basename
basename: 缺少操作数
Try 'basename --help' for more information.
# 通过xargs命令转换之后,就可以解析了
[root@rich workspace]# pwd | xargs basename
workspace
7 linux系统的管理与维护
7.1 权限控制
①基础命令
命令 | 作用 |
---|---|
groupadd 组名 | 创建用户组 |
id 用户名 | 返回用户信息,检查用户是否存在 |
useradd -g 组名 用户名 | 创建用户,同时指定所属用户组 |
passwd 用户名 | 给用户账号设置密码 |
② 权限信息
权限信息共分三组,每组三位:
下面介绍rwx-分别是什么意思:
- r:读(read)
-
读文件:查看文件内容
例如:cat、less、tail等命令
-
读目录:查看目录内容
例如:使用ll命令查看目录内容
-
- w:写(write)
-
写文件:向文件中写入新内容
-
写目录:在目录里面增删内容
例如:在目录内新建文件、删除文件、新建目录、删除目录给目录重命名
-
- x:执行(execute)
- 执行文件:把文件当作可执行程序来运行
- 执行目录:使用cd命令进入目录
- -:无权限
由于每一位要么有权限要么没有权限,所以天然可以使用二进制来表示权限信息:
- 1:有
- 0:无
权限的符号表示 | 权限的二进制表示 | 权限的十进制表示 |
---|---|---|
rwx r-x r-x | 111 101 101 | 7 5 5 |
rw- r-- r– | 110 100 100 | 6 4 4 |
③ chxxx命令
命令名 | 作用 |
---|---|
chmod | 修改权限信息 |
chown | 修改文件或目录的所属主 |
chgrp | 修改文件或目录的所属组 |
增加执行权限:
移除执行权限:
④ 普通用户提升权限
在公司参与开发的过程中,通常我们不会拿到服务器系统的 root 权限,而是普通用户权限。但是普通用户很多操作无法执行。比如在 /opt 目录下新建目录:
# /opt目录下没有aaa目录
[luozhixiang@hadoop001 opt]$ ll
总用量 4
drwxr-xr-x. 2 root root 4096 9月 7 2017 rh
# 用普通用户在/opt下创建aaa目录权限不够
[luozhixiang@hadoop001 opt]$ mkdir aaa
mkdir: 无法创建目录"aaa": 权限不够
# 使用sudo命令临时提权被提示不在sudoers文件中
[luozhixiang@hadoop001 opt]$ sudo mkdir aaa
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] luozhixiang 的密码:
luozhixiang 不在 sudoers 文件中。此事将被报告。
# 目录没有创建成功
[luozhixiang@hadoop001 opt]$ ll
总用量 4
drwxr-xr-x. 2 root root 4096 9月 7 2017 rh
将需要提权的普通用户加入到/etc/sudoers文件中
91 ## Allow root to run any commands anywhere
92 root ALL=(ALL) ALL
93 luozhixiang ALL=(ALL) ALL
不需要重启系统,我们再次测试提权:
# 操作可以成功,需要密码
[luozhixiang@hadoop001 opt]$ sudo mkdir aaa
[sudo] luozhixiang 的密码:
[luozhixiang@hadoop001 opt]$ ll
总用量 8
drwxr-xr-x. 2 root root 4096 7月 11 04:08 aaa
drwxr-xr-x. 2 root root 4096 9月 7 2017 rh
再修改/etc/sudoers文件
93 luozhixiang ALL=(ALL) NOPASSWD:ALL
这样再使用sudo命令就不需要输入密码了
Connecting to 192.168.41.100:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last login: Sat Jul 11 04:10:14 2020 from 192.168.41.1
[luozhixiang@hadoop001 ~]$ cd /opt
[luozhixiang@hadoop001 opt]$ sudo mkdir aaa
[luozhixiang@hadoop001 opt]$ ll
总用量 8
drwxr-xr-x. 2 root root 4096 7月 11 04:12 aaa
drwxr-xr-x. 2 root root 4096 9月 7 2017 rh
这里有两点需要注意:
- 在同一次登录中,即使不加NOPASSWD也只需要输入一次密码,所以NOPASSWD是否生效需要退出登录后再重新登录来测试。
- 使用sudo提权后创建的目录仍然是root root权限,如果有需要那就还要使用chown或chgrp来修改。
7.2 服务管理
① centos6命令
1、service命令
启动服务:service 服务名 start
停止服务:service 服务名 stop
重启服务:service 服务名 restart
重新加载服务:service 服务名 reload
查看服务状态:service 服务名 status
2、chkconfig命令
查看服务列表:chkconfig [–list]
设置具体服务开机自动启动状态:chkconfig 服务名 on/off
3、运行级别
vim /etc/inittab查看系统配置。CentOS6系统使用0~6这7个数字来控制Linux系统的启动方式。
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS),没有网络服务
运行级别3:完全的多用户状态(有NFS),登录后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11表示控制台,进入图形界面
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
常用的是3或5。
chkconfig 命令使用 --level 参数和一个数值可以控制一个服务在某个运行级别的是否自动启动。
4、防火墙
防火墙默认会阻止绝大部分端口号的访问,在实际生产环境下,运维工程师需要为服务器设置详细的访问规则。在练习过程中,我们为了方便建议把防火墙直接关闭。由于防火墙服务默认开机自动启动,所以除了停止服务,还要设置为开机不自动启动。
服务名:iptables
停止防火墙:service iptables stop
设置开机不自动启动:chkconfig iptables off
②CentOS7服务
1、systemctl命令
启动服务:systemctl start 服务名(xxxx.service)
重启服务:systemctl restart 服务名(xxxx.service)
停止服务:systemctl stop 服务名(xxxx.service)
重新加载服务:systemctl reload 服务名(xxxx.service)
查看服务状态:systemctl status 服务名(xxxx.service)
2、systemctl命令代替chkconfig命令
查看服务状态:systemctl list-unit-files
设置或取消服务开机自动启动:
3、CentOS7简化了运行级别
cat /etc/inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
4、关闭防火墙
systemctl disable firewalld.service
systemctl stop firewalld.service
请大家记住:斩草要除根。
7.3 shell编程(选学)
①简述
Shell是一个命令行解释器,它接收应用程序或用户的命令,然后调用操作系统内核。
linux系统中提供的shell解析器最常用的是/bin/bash(默认) 和/bin/sh,其中sh是bash的软链接。
② 编写与运行
编写:
第一行指定当前脚本的解析器:
#!/bin/bash
实现具体功能:
echo "hello world"
在Shell脚本中,#开头的都是注释。#!/bin/bash相当于就是注释形式出现的一个固定格式,告诉Linux系统,当前使用/bin/bash解析器。
运行:
命令名 | 在当前进程运行脚本 | 新建子进程运行脚本 |
---|---|---|
source | √ | |
. | √ | |
sh | √ | |
bash | √ | |
chmod +x后直接运行 | √ |
其中“.”是source的另一种写法。在当前进程中发布的全局变量可以在当前进程的其他脚本中继续沿用,也可以在子进程中使用;但是子进程export发布的变量仅限于子进程内部使用。
③ 变量的定义、引用、声明、撤销
常用系统变量包括: U S E R 、 USER、 USER、HOME、 P W D 、 PWD、 PWD、SHELL等,可以使用echo命令输出它们的值。
语法规则:
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
- 等号两侧不能有空格,衍生规则就是变量声明时必须初始化
- 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
- 变量的值如果有空格,需要使用双引号或单引号括起来。
- 变量名区分大小写。
定义变量
USER_NAME=tom
引用变量
#!/bin/bash
# 声明变量的同时赋值
MR_FENG=shuai
# 打印变量,使用$变量名方式来引用
echo $MR_FENG
# 引用未声明、未初始化的变量,没有任何打印的内容。没有报错
echo $GOOD
撤销变量
unset 变量名
[root@apple ~]# USER_NAME=tom
[root@apple ~]# echo $USER_NAME
tom
[root@apple ~]# unset USER_NAME
[root@apple ~]# echo $USER_NAME
声明常量(只读)
[root@apple ~]# readonly COMPANY_NAME=atguigu
[root@apple ~]# echo $COMPANY_NAME
atguigu
[root@apple ~]# COMPANY_NAME=uuu
-bash: COMPANY_NAME: 只读变量
[root@apple ~]# unset COMPANY_NAME
-bash: unset: COMPANY_NAME: 无法反设定: 只读 variable
不能修改,不能撤销
特殊变量
$n
n是数字,$0代表当前脚本名称。从 1 开 始 表 示 脚 本 接 收 到 的 第 n 个 参 数 。 从 1开始表示脚本接收到的第n个参数。从 1开始表示脚本接收到的第n个参数。从{10}开始数字需要使用{}括起来。
[root@hadoop101 datas]$ touch parameter.sh
[root@hadoop101 datas]$ vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
[root@hadoop101 datas]$ chmod 777 parameter.sh
[root@hadoop101 datas]$ ./parameter.sh cls xz
./parameter.sh cls xz
$#
返回输入参数的个数
[root@hadoop101 datas]$ vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
echo $#
[root@hadoop101 datas]$ chmod 777 parameter.sh
[root@hadoop101 datas]$ ./parameter.sh cls xz
parameter.sh cls xz
2
∗ 和 *和 ∗和@
都能够返回全部参数,只有在循环中且放在引号中能够体现出它们的区别。
[root@hadoop101 datas]$ vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
echo $#
echo $*
echo $@
[root@hadoop101 datas]$ bash parameter.sh 1 2 3
parameter.sh 1 2
3
1 2 3
1 2 3
$?
返回上一条命令的执行结果。
- 条件判断语句
- 返回 0 表示 true
- 返回 1 表示 false
- 普通语句
- 返回 0 表示成功
- 返回非 0 数表示失败
#!/bin/bash
# 把运行当前脚本的程序名称输出
echo "运行当脚本的程序名称:$0"
# 把运行当前脚本时传入的参数输出
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "第三个参数:$3"
# 数字是两位数时需要带上大括号
echo "第十个参数:${10}"
# 输出传入参数的个数
echo "传入参数的个数:$#"
# 输出全部参数
echo "全部参数列表:$*"
echo "全部参数列表:$@"
# 输出上一条命令执行的结果
echo "上一步操作:$?"
# 人为制造一个问题
shuai
echo "上一步操作:$?"
④ ( ( 表 达 式 ) ) 或 ((表达式))或 ((表达式))或[表达式]
[root@apple ~]# echo $((20+30))
50
[root@apple ~]# echo $(((15+15)*2))
60
[root@apple ~]# echo $[(15+15)*2]
60
⑤ 条件判断
数据类型 | 写法 | 单词 | 含义 |
---|---|---|---|
数值 | -lt | less than | 小于 |
数值 | -le | less equal | 小于等于 |
数值 | -eq | equal | 等于 |
数值 | -gt | greater than | 大于 |
数值 | -ge | greater equal | 大于等于 |
数值 | -ne | not equal | 不等于 |
文件 | -r | read | 判断当前用户是否可以读取该文件 |
文件 | -w | write | 判断当前用户是否可以修改该文件 |
文件 | -x | execute | 判断当前用户对该文件是否有执行权限 |
文件 | -f | file | 判断当前文件是否存在并且是一个常规的文件 |
文件 | -e | existence | 判断文件是否存在 |
文件 | -d | directory | 判断是否存在并且是一个目录 |
#!/bin/bash
# 条件判断表达式写法一:test
test 10 -gt 7
# 使用$?获取上一条语句的执行结果
echo $?
# 使用$?获取上一条语句的执行结果
test 10 -lt 7
echo $?
# 条件判断表达式写法二:[ condition ]
# 注意:condition两边要有空格
[ 10 -gt 7 ]
echo $?
[ 10 -lt 7 ]
echo $?
# 专门针对文件进行操作的运算符
[ -e aaa.txt ]
echo $?
[ -r aaa.txt ]
echo $?
[ -w aaa.txt ]
echo $?
⑥ 流程控制
三目运算符
[root@apple w]# [ 10 -gt 5 ] && echo "10大于5" || echo "10小于5"
10大于5
if判断
注意:if后面有空格
单if
if [ 10 -gt 5 ]
then
echo "10大于5"
fi
if…else
if [ 10 -gt 5 ]
then
echo "10大于5"
else
echo "10小于5"
fi
if…elif
if [ 10 -gt 5 ]
then
echo "10大于5"
elif [ 10 -lt 5 ]
then
echo "10小于5"
else
echo "10等于5"
fi
case判断
AGE=10
case $AGE in
"10")
echo 10
;;
"20")
echo 20
;;
*)
echo other
;;
esac
for循环
常规用法
for (( i=1;i<=10;i++ ))
do
echo $i
done
遍历外部数据
#!/bin/bash
# 如果需要使用外部数据,则需要把外部数据赋值给一个变量,不能在for语句中直接使用
len=$1
for (( i=1;i<=len;i++ ))
# 从do关键字开始是循环体开始
do
echo $i;
# 到done关键字为止是循环体结束
done
for…in循环
for i in $*
do
echo $i
done
没有引号的时候 ∗ 和 *和 ∗和@一样,加了引号就有区别
for i in "$*"
do
echo $i
done
上面代码输出的结果是:
[root@apple w]# sh shell42.sh a b c d e
a b c d e
“ ∗ ” 没 有 换 行 , “ *”没有换行,“ ∗”没有换行,“@”有换行
while循环
s=0
i=1
while [ $i -le 100 ]
do
s=$[$s+$i]
i=$[$i+1]
done
echo $s
⑦ 函数
概述
Shell 编程中的函数和我们以前熟悉的函数最大的区别是:Shell 编程中要求函数的返回值只能是整数。并且只能通过 $? 方式获得。可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)。
# 声明函数
function sum() {
echo $[$1+$2]
}
# 调用函数
sum 10 20
在函数体中,$1、$2等是对函数参数的引用。
#!/bin/bash
# 声明函数
function sum(){
# 使用$1、$2引用函数传入的参数
return $[$1+$2]
}
# 调用函数,传入参数
sum 10 20
# 使用$?获取函数执行结果
echo "sum 10 20执行的结果是$?"
获取外部数据
获取参数
这个前面说过了,通过$1、 2 等 方 式 获 取 函 数 参 数 , 2等方式获取函数参数, 2等方式获取函数参数,{10}开始需要使用大括号。
使用read读取用户输入
read命令有两个常用参数
- -t用于指定输入等待时间,单位是秒
- -p用于指定提示文字
read -t 10 -p "please enter:" NAME
echo $NAME
小练习
#!/bin/bash
# 用户输入数字,判断是否为7的倍数
# 初步读取用户是否继续玩的指令
read -t 10 -p "请输入数字指令(0代表继续玩,1代表退出):" code
# 循环询问用户是否继续玩
while [ $code -ne 1 ]
# 进入循环体
do
# 读取用户输入的数据
read -t 10 -p "请输入数字:" number
# 判断数据是否为7的整数倍
if [ $[$number%7] -eq 0 ]
# 进入if分支
then
# 执行if分支
echo "$number是7的倍数。"
# 进入else分支
else
# 执行else分支
echo "$number不是7的倍数。"
# 结束if结构
fi
# 再次读取用户是否继续玩的指令
read -t 10 -p "请输入数字指令(0代表继续玩,1代表退出):" code
# 结束循环体
done
8 服务器端应用程序安装
①快照
在进行安装操作之前最好先拍摄快照,避免因为一些原因导致安装失败。
② 安装JDK
[1]rpm 命令
rpm 是 Redhat package management 的缩写,实质上来说,通过 rpm 可以管理 Linux 环境下的安装包。
参数名 | 作用 |
---|---|
-qa | 查询系统中已经安装的程序,通常配合管道,使用 grep 精确匹配想要查询的包 |
-ivh | 执行 rpm 包安装操作 |
-e | 卸载 rpm 包 |
–nodeps | 在卸载过程中忽略依赖关系 |
注:Linux 系统中命令的参数往往有这样的特点:
- 参数如果是一个或多个完整的单词那么前面是两个“-”
- 参数如果是单词的缩写,是一个字母,那么前面是一个“-”
[2]卸载系统预装的 JDK
查询系统中已经安装的 JDK
[root@apple ~]# rpm -qa | grep openjdk
java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
java-1.7.0-openjdk-1.7.0.171-2.6.13.2.el7.x86_64
java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64
java-1.7.0-openjdk-headless-1.7.0.171-2.6.13.2.el7.x86_64
执行卸载,卸载过程中使用 --nodeps 忽略依赖关系
[root@apple ~]# rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
[root@apple ~]# rpm -e --nodeps java-1.7.0-openjdk-1.7.0.171-2.6.13.2.el7.x86_64
[root@apple ~]# rpm -e --nodeps java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64
[root@apple ~]# rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.171-2.6.13.2.el7.x86_64
重启系统生效
[root@atguigu java]# reboot
[3]解压 JDK 的 tar 包配置环境变量
1、解压 JDK 的 tar 包
cd /opt
tar -zxvf /opt/jdk-8u121-linux-x64.tar.gz
2、配置 JDK 相关环境变量
配置环境变量的配置文件:/etc/profile
为了避免配置错误导致运行失败,提前复制一份/etc/profile
cp /etc/profile /etc/profile.bak
编辑 /etc/profile 文件(下面内容添加到文件末尾):
# 声明 JAVA_HOME 环境变量,等号两边不能有空格
JAVA_HOME=/opt/jdk1.8.0_121
# 给 PATH 环境变量附加 $JAVA_HOME/bin 部分
# $PATH 表示引用 PATH 环境变量以前的旧值
# 使用英文冒号连接
# $JAVA_HOME 表示对 JAVA_HOME 变量的引用
# $JAVA_HOME/bin 表示指向可执行文件
PATH=$JAVA_HOME/bin:$PATH
# 发布
# 发布是发布变量名,不是引用变量的值,所以前面不写 $ 符号
export JAVA_HOME PATH
保存退出vim后,使用source命令执行/etc/profile脚本,让脚本中发布的环境变量生效。但是仅限于当前进程,如果想让新环境变量全局生效,可以reboot。
source /etc/profile
验证一下:
[root@apple jdk1.8.0_121]# echo $JAVA_HOME
/opt/jdk1.8.0_121
[root@apple jdk1.8.0_121]# echo $PATH
/opt/jdk1.8.0_121/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@apple jdk1.8.0_121]# java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
③ 安装tomcat
[1]解压
tar -zxvf /opt/apache-tomcat-7.0.75.tar.gz
[2]操控
启动 Tomcat
/opt/apache-tomcat-7.0.75/bin/startup.sh
停止 Tomcat
/opt/apache-tomcat-7.0.75/bin/shutdown.sh
查看日志
tail -F /opt/apache-tomcat-7.0.75/logs/catalina.out
部署 war 包放在 webapps 目录下
/opt/apache-tomcat-7.0.75/webapps
[3]访问
- 在 Linux 系统本地使用火狐浏览器访问可以使用 localhost
- 在 Windows 系统访问 Linux 服务器端的 Tomcat 需要使用 LInux 的 IP 地址
④安装Mysql
myql通过yum 安装,需要我们自己去官网下载。
链接:https://downloads.mysql.com/archives/community/
在这里插入图片描述
[1]卸载系统预装 mariadb
rpm -e --nodeps mariadb-libs-1:5.5.56-2.el7.x86_64
注:MySQL 被 Oracle 收购,社区担心将来 MySQL 被 Oracle 关闭开源模式,和 Oracle 数据库一样变成商业化运作。所以社区开发了一个 MySQL 的社区版,内部和 MySQL 一样,只是名字不同,这就是 mariadb。但是我们当前在 Linux 系统中已经预装的 mariadb 只是一个残片,不能直接使用。所以还是要先卸载。
[2]安装服务器端程序
rpm -ivh /opt/MySQL-server-5.5.52-1.el6.x86_64.rpm
验证
[root@apple opt]# id mysql
uid=988(mysql) gid=982(mysql) 组=982(mysql)
[3]安装客户端程序
rpm -ivh /opt/MySQL-client-5.5.52-1.el6.x86_64.rpm
[4]启动 MySQL 服务
systemctl start mysql.service
[5]设置 root 用户密码
注意:这里的 root 用户是 MySQL 的 root 用户,不是 Linux 的 root 用户
[root@apple opt]# mysqladmin -u root password
New password:
Confirm new password:
[6]登录MySQL
[root@apple opt]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.52 MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
[7]客户端登录 MySQL 服务器
1、被防火墙拦截的错误提示
通过关闭防火墙服务器解决
systemctl stop firewalld.service
systemctl disable firewalld.service
2、被MySQL自己拒绝连接
3、在 MySQL 服务器端设置允许任何主机地址访问
执行SQL语句
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'atguigu' WITH GRANT OPTION;
重启 MySQL 服务。下面是执行操作的参考:
[root@apple opt]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.5.52 MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> 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
mysql> select host,user,password from user;
+-----------+------+-------------------------------------------+
| host | user | password |
+-----------+------+-------------------------------------------+
| localhost | root | *453FDE92DF58E2DE1A51D27869CF3F1A69984B1B |
| apple | root | |
| 127.0.0.1 | root | |
| ::1 | root | |
| localhost | | |
| apple | | |
+-----------+------+-------------------------------------------+
6 rows in set (0.01 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'atguigu' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
mysql> select host,user,password,select_priv,update_priv from user;
+-----------+------+-------------------------------------------+-------------+-------------+
| host | user | password | select_priv | update_priv |
+-----------+------+-------------------------------------------+-------------+-------------+
| localhost | root | *453FDE92DF58E2DE1A51D27869CF3F1A69984B1B | Y | Y |
| apple | root | | Y | Y |
| 127.0.0.1 | root | | Y | Y |
| ::1 | root | | Y | Y |
| localhost | | | N | N |
| apple | | | N | N |
| % | root | *453FDE92DF58E2DE1A51D27869CF3F1A69984B1B | Y | Y |
+-----------+------+-------------------------------------------+-------------+-------------+
7 rows in set (0.00 sec)
重启MySQL服务
systemctl restart mysql.service
[8]解决字符乱码问题
1 、查看字符相关变量
mysql> show variables like "%char%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
2、准备MySQL配置文件
cp /usr/share/mysql/my-small.cnf /etc/my.cnf
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
skip-external-locking
key_buffer_size = 16K
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K
character-set-server=utf8
在[mysqld]部分的配置的最后添加 character-set-server=utf8
注意:别在 vim 的一般模式下直接粘贴!一定要进入编辑模式!
重启MySQL服务
systemctl restart mysql.service
查看字符集相关变量
mysql> show variables like "%char%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
重新创建数据库、创建数据库表、插入中文字符数据验证。
⑤进行服务器部署
-
将ssm整合的数据库文件导出,在连接linux虚拟机连接中导入执行SQL脚本。
-
注意我们要修改数据源汇总的ip地址,因为是要将其放到linux系统中去执行。
-
使用IDEA进行打包。先使用clean进行清理,然后使用package进行打包。在打包的过程中我们发现出现以下问题。
暂时解决办法:将SSMTest这个文件修改为后缀为bak的文件。
-
重新进行clean和package操作。
打包成功。我们将成功后的war包放到linux虚拟机中/opt目录下。 -
因为名字太长,我们将其修改为demo.war。因为这个到时候名字是上下文路径。
-
将demo.war放到tomcat/webapps目录下。
-
自动解压
-
通过地址访问
失败,原因是在需要在linux系统中将jdbc.properties修改为localhost。
- 重新启动tomcat
- 重新访问试试
还是无法访问,等下次解决吧。