[TOC]
Linux
1、Linux 介绍
1、概述
linux 是一个开源、免费的操作系统,其稳定性、安全性、处理多并发已经得到业界的认可,目前很多企业级的项目(c/c++/php/python/java/go)都会部署到Linux/unix 系统上。
常见的操作系统:windows、IOS、Android、MacOS、Linux、Unix
Linux 吉祥物:一只叫做tux的企鹅
Linus Torvalds
- Linux 之父(最初的Linux,即看inux0.01 版源码是使用C语言写的,不到1w 行)
- Git 创作者
- 世界著名黑客
Linux 主要的发行版:
- Ubuntu(乌班图)**、RedHat(红帽)、CentOS**、Debain[蝶变]、Fedora、SuSE、OpenSUSE
2、Linux 的应用领域
1、个人桌面领域的应用
此领域是传统linux 应用薄弱的环节,近些年来随着ubuntu、fedora [fɪˈdɔ:rə] 等优秀桌面环境的兴起,linux 在个人桌面领域的占有率在逐渐的提高。
2、服务器领域
- linux 在服务器领域的应用是最强的。
- linux 免费、稳定、高效等特点在这里得到了很好的体现,尤其在一些高端领域尤为广泛(c/c++/php/java/python/go)。
3、嵌入式领域
- linux 运行稳定、对网络的良好支持性、低成本,且可以根据需要进行软件裁剪,内核最小可以达到几百KB 等特点,使其近些年来在嵌入式领域的应用得到非常大的提高
- 主要应用:机顶盒、数字电视、网络电话、程控交换机、手机、PDA、智能家居、智能硬件等都是其应用领域。以后在物联网中应用会更加广泛。
3、Linux的目录结构
1、基本介绍
- linux 的文件系统是采用级层式的树状目录结构,在此结构中的最上层是
根目录"/"
,然后在此目录下再创建其他的目录。 - 深刻理解linux 树状文件目录是非常重要的
- 记住一句经典的话:在Linux 世界里,一切皆文件
2、具体的目录结构
/bin
[常用] (/usr/bin
、/usr/local/bi
n):是Binary 的缩写,这个目录存放着最经常使用的命令。如cd
、ll
、clear
等等/sbin
(/usr/sbin
、/usr/local/sbin
):s 就是Super User 的意思,这里存放的是系统管理员使用的系统管理程序。/home
[常用]:存放普通用户的主目录,在Linux 中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名。/root
[常用]:该目录为系统管理员,也称作超级权限者的用户主目录/lib
:系统开机所需要最基本的动态连接共享库,其作用类似于Windows 里的DLL 文件。几乎所有的应用程序都需要用到这些共享库/lost+found
:这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件- 这个目录一般是隐藏起来的。可以通过命令:
ls
进行查看
- 这个目录一般是隐藏起来的。可以通过命令:
/etc
[常用]:所有的系统管理所需要的配置文件和子目录,比如安装mysql 数据库my.conf/usr
[常用]:这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与windows 下的program files 目录。/boot
[常用]:存放的是启动Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件/proc
[不能动]:这个目录是一个虚拟的目录,它是系统内存的映射,访问这个目录来获取系统信息/srv
[不能动]:service 缩写,该目录存放一些服务启动之后需要提取的数据/sys
[不能动]:这是linux2.6 内核的一个很大的变化。该目录下安装了2.6 内核中新出现的一个文件系统sysfs- 以上三个文件最后不去改动它们,因为一不小心就有可能损坏Linux,让Linux不能正常启动
/tmp
:这个目录是用来存放一些临时文件的/dev
:类似于windows 的设备管理器,把所有的硬件用文件的形式存储- 因为在Linux上,一切皆文件。所以Linux把所有的硬件都抽象成一个文件。在这个文件的那种,你可以看到 cpu 等文件夹
/media
[常用]:linux 系统会自动识别一些设备,例如U 盘、光驱等等,当识别后,linux 会把识别的设备当成一个文件挂载到这个目录下/mnt
[常用]:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂载在/mnt/上,然后进入该目录就可以查看里的内容了。- 这里的文件系统可以是一个共享文件夹,也可以是一个一块新的硬盘等等。
/opt
:这是给主机额外安装软件所存放的目录。如安装ORACLE 数据库就可放到该目录下。默认为空/usr/local
[常用]:这是另一个给主机额外安装软件所安装的目录。一般是通过编译源码方式安装的程序/var
[常用]:这个目录中存放着在不断扩充着的东西,习惯将经常被修改的目录放在这个目录下。包括各种日志文件/selinux
[security-enhanced linux]:SELinux是一种安全子系统,它能控制程序只能访问特定文件,有三种工作模式,可以自行设置- 一般也是看不到这个文件的,只有在你启动了之后才会出现
4、远程登录到Linux 服务器
1、为什么需要远程登录Linux
说明:公司开发时候, 具体的应用场景是这样的:
- linux 服务器是开发小组共享
- 正式上线的项目是运行在公网
- 所谓公网就是:具有公网IP可以访问互联网的网络;
- 公网就是一个对外的IP。
- 因此程序员需要远程登录到Linux 进行项目管理或者开发
- 远程登录客户端有Xshell6、Xftp6,我们学习使用Xshell 和Xftp6,其它的远程工具大同小异
2、远程登录Linux——Xshell6
1、介绍
说明:
- Xshell 是目前最好的远程登录到Linux 操作的软件,流畅的速度并且完美解决了中文乱码的问题, 是目前程序员首选的软件。
- Xshell 是一个强大的安全终端模拟软件,它支持SSH1、SSH2、以及Microsoft Windows 平台的 TELNET 协议。
- Xshell 可以在Windows 界面下用来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的。
2、下载、安装、配置和使用
下载 free-for-home-school 版本,地址
3、远程上传下载文件——Xftp6
1、介绍
是一个基于windows 平台的功能强大的SFTP、FTP 文件传输软件。
使用了Xftp 以后,windows 用户能安全地在UNIX/Linux 和Windows PC 之间传输文件
2、Xftp6 安装配置和使用
3、如何处理Xftp 中文乱码问题
2、Linux Vi 和Vim 编辑器
1、vi 和 vim 的基本介绍
- Linux 系统会内置vi 文本编辑器
- Vim 具有程序编辑的能力,可以看做是Vi 的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
2、vi 和 vim 常用的三种模式
1、正常模式
以 vim 打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用『上下左右』按键来
移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容,也可以使用『复制、粘贴』来处理你的文件数据。
2、插入模式
按下 i,、I、o、O、a、A、r、R
等任何一个字母之后才会进入编辑模式,一般来说按 i
即可。
3、命令行模式
esc 再输入:
在这个模式当中, 可以提供你相关指令,完成读取、存盘、替换、离开vim 、显示行号等的动作则是在此模式中达成的!
eg:
1
2在进行编辑之后保存并退出
:wq:
——表示进入命令行模式w
——表示写入保存q
——退出wq
——保存并退出
3、各种模式的相互切换
在普通模式:
:q
:如果不保存的话就不让进行:q!
:退出之后不保存
4、vi 和 vim 快捷键
1、快捷键的使用
yy
:拷贝当前行5yy
:拷贝当前行向下的 5 行
p
:粘贴dd
:删除当前行5dd
:删除当前行向下的5行
/关键字
:在命令行模式下,在文件中查找某个单词,回车查找,输入n
就是查找下一个- 查找的关键字区分大小写
set nu
:在命令行模式下,设置文件的行号set nonu
:在命令行模式下,取消文件的行号- [
G
]:在一般模式下,使用 vim 编辑/etc/profile 文件,使用快捷键到文件的最末行 - [
gg
]:在一般模式下,使用 vim 编辑/etc/profile 文件,使用快捷键到文件的最首行 u
:在一般模式下,撤销前一个动作。相当于windows的 ctrl + z20+shift+g
:在一般模式下,编辑/etc/profile 文件,把光标移动到第20行
更多的看整理的文档
2、快捷键的键盘对应图
1、vim基础键盘图中文
2、vim进阶键盘图
3、Linux 开机、重启和用户登录注销
1、关机&重启命令
1、基本介绍
立该进行关机
1
2# -h:halt:停止
shutdown –h now权限:root
“hello, 1 分钟后会关机了”
1
shudown -h 1
直接输入
shutdown
默认执行的就是以上命令现在重新启动计算机
1
2# -r:reboot:重启
shutdown –r now关机,作用和上面一样
1
halt
关机,作用和上面一样
1
poweroff
关机,作用和上面一样
1
init 0
现在重新启动计算机
1
init 6
重新启动计算机,作用和上面一样
1
reboot
把内存的数据同步到磁盘
1
sync
2、注意细节
- 不管是重启系统还是关闭系统,首先要运行sync 命令,把内存中的数据写到磁盘中
- 目前的
shutdown
/reboot
/halt
等命令均已经在关机前进行了sync,但是:小心驶得万年船!
3、几个关机重启命令介绍
1、shutdown命令
我们较常使用的是shutdown这个命令,这个命令可以安全地关闭或重启Linux系统。
它在系统关闭之前给系统上的所有登录用户提示一条警告信息。
该命令还允许用户指定一个时间参数,可以是一个精确的时间,也可以是从现在开始的一个时间段。
精确时间的格式是hh:mm,表示小时和分钟,时间段由时钟数和分钟数表示。
系统执行该命令后会自动进行数据同步的工作。
需要特别说明的是该命令只能由超级用户使用。
- 因为该命令在sbin目录下
shutdown可以达成如下的工作:
- 可以自由选择关机模式:是要关机、重新启动或进入单人操作模式均可;
- 可以配置关机时间:可以配置成现在立刻关机,也可以配置某一个特定的时间才关机。
- 可以自定义关机信息:在关机之前,可以将自己配置的信息传送给在线user 。
- 可以仅发出警告信息:有时有可能你要进行一些测试,而不想让其他的使用者干扰,或者是明白的告诉使用者某段时间要注意一下!这个时候可以使用 shutdown 来吓一吓使用者,但却不是真的要关机!
- 可以选择是否要fsck检查文件系统。
可以用man命令来查看其用法,用法如下:
1 | [root@www ~]# /sbin/shutdown [-t 秒] [-arkhncfF] 时间 [警告信息] |
2、reboot,halt与poweroff
这三个命令可以进行重新启动与关机的任务,其实这三个命令调用的函式库都差不多,所以当你使用『man reboot』时,会同时出现三个命令的用法给你看,如下图所示:
3、init 0
init所有进程的祖先,进程号永远为1,linux系统操作中不可缺少的程序之一,所有发送TERM信号给init会终止所有用户进程、守护进程等。init定义了8个运行级别,这里相关的主要是0关机,6重启。
4、几个关机重启命令的区别
几个命令的作用都是用来关机,但是又有细微区别:
halt:halt被称为最简单的关机命令,它会
- 通知硬件停止所有的CPU功能;
- 执行时会杀死进程;
- 执行sync系统调用文件系统写操作;
- 完成后就会停止内核。
1
2
3
4
5
6
7
8# 相当于poweroff
halt -p
# 强制关机
halt -f
# 关机或重启前关闭所有网络接口
halt -ipoweroff:关机同时关闭电源,会发送一个ACPI信号通知系统关机,在多用户方式下(run level3)下不建议使用。
1
2# 强制关机
poweroff -fshutdown:关机同时关闭电源
只有拥有root权限的用户才可以执行(普通用户需要root授权);
发送信号给init,使之改变运行级别(run level)来实现关机,关机或重启实质上就是运行级别的调整,所以也可以直接使用# init 0来关机,#init 6来重启。
shutdown可设置广播信息来通知已登录的用户将关机,且会创建/run/nologin文件,禁止新用户登录。
也就给了一定时间给给进程进行保存操作,被视为安全的关机命令。
加参数时为如下意义:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# 重启
shutdown -r
# 相当于poweroff
shutdown -P
# 相当于hatl
shutdown -H
# 不关机但是发送警告给用户
shutdown -k
# shutdown 加时间,可以在指定时间关机
# 但是此指令没有-f强制参数
shutdown now
shutdown 22:22
# 在关机前,也可以取消关机。
shutdown -c
init:所有进程的祖先,进程号永远为1,linux系统操作中不可缺少的程序之一,所有发送TERM信号给init会终止所有用户进程、守护进程等。init定义了8个运行级别,这里相关的主要是0关机,6重启。
init一共分为7个级别,这7个级别的所代表的含义如下
- 0:停机或者关机(千万不能将initdefault设置为0)
- 1:单用户模式,只root用户进行维护
- 2:多用户模式,不能使用NFS(Net File System)
- 3:完全多用户模式(标准的运行级别)
- 4:安全模式
- 5:图形化(即图形界面)
- 6:重启(千万不要把initdefault设置为6)
2、用户登录和注销
1、基本介绍
- 登录时尽量少用root 帐号登录,因为它是系统管理员,最大的权限,避免操作失误。
- 可以利用普通用户登录,登录后再用
su - 用户名
命令来切换成系统管理员身份。 - 在提示符下输入
logout
即可注销用户
2、使用细节
- logout 注销指令在图形运行级别无效,在运行级别3 下有效。
- 如果一开始登陆就是普通用户,当执行su - root 来切换成系统管理员身份后,再执行logout会回到普通用户,再一次查询logout才会退出系统。
4、Linux 用户管理
1、基本介绍
Linux 系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。不同的用户的权限可能不同。
2、添加用户
1、基本语法
1 | useradd 用户名 |
2、细节说明
- 当创建用户成功后,会自动的创建和用户同名的家目录
- 也可以通过useradd -d 指定目录新的用户名,给新创建的用户指定家目录
- 直接创建用户没有对其分组的话,该用户会自成一个组,组的名字就是该用户的名字,组的成员只有他一个
3、指定/修改密码
1、基本语法
1 | passwd 用户名 |
2、细节说明
- 在指定/修改密码的时候注意应定在后面要加上要指定的用户名,不然默认给当前用户修改密码
- 一不注意的话可能出现大麻烦
4、删除用户
1、基本语法
1 | # userdel命令在sbin目录下,表示只有拥有root权限才能执行 |
2、删除用户的两种方式
1、删除用户,但是保存他的家目录(推荐)
1 | userdel 用户名 |
2、删除用户,同时删除他的家目录(慎用)
1 | userdel -r 用户名 |
一般我们会选择仅仅删除该用户但是不删除他的家目录
- 因为删除该用户的话,就可以让该用户登陆不能Linux系统了。但是之前改用户在Linux上操作的文件或代码还是可以获取的
- 但是如果连该用户的加目录也一起删除了,就获取不到该用户在Linux系统留下的文件或代码了
5、查询用户信息指令
1、基本语法
1 | id 用户名 |
当用户不存在时,返回无此用户
2、展示的相关信息
- uid:用户id
- gid:组id
- root的组id为0
- 组:用户当前所在的组
6、切换用户
1、介绍
在操作Linux 中,如果当前用户的权限不够,可以通过su - 指令,切换到高权限用户,比如root.
当然切换为别的用户也可以。
2、基本语法
1 | su - 切换用户名 |
3、细节说明
- 从权限高的用户切换到权限低的用户,不需要输入密码,反之需要。
- 当需要返回到原来用户时,使用
exit/logout
指令
7、查看当前用户/登录用户
基本语法
1 | # 以下两种方法 |
8、用户组
1、介绍
类似于角色,系统可以对有共性(有一样的权限的)的多个用户进行统一的管理
2、新增组
1 | groupadd 组名 |
注意:如果直接添加用户,没有指定组。那么会生成一个与当前用户名称相同的一个组并且将该用户加入该组
3、删除组
1 | groupdel 组名 |
4、修改用户的组
1 | usermod –g 用户组 用户名 |
5、用户和组相关文件
1、/etc/passwd 文件
用户(user)的配置文件,记录用户的各种信息
每行的含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
- 用户名:用户名
- 口令:一般为x或者空格
- 用户标识号:用户id
- 组标识号:组id
- 注释性描述:对该用户的注释说明,没有就为空
- 主目录:用户对应的家目录
- 登录Shell:用户登陆的指令通过shell解释之后得到
- Linux的内核并不能直接运行我们输入的命令
- 在输入命令之后,需要通过Shell解释器将命令解释成Linux可以运行的语言
- 常用的Shell解释器有:Bash、tcsh、csh等等
2、/etc/shadow 文件
口令的配置文件
每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
- 登录名:用户名
- 加密口令:用户密码,如果没有设置用户密码,则显示为
!!
,如果设置了用户密码的话,显示的就是加密之后的密码 - 最后一次修改时间:最后一次修改用户的时间,单位s
- 最小时间间隔:0
- 最大时间间隔:99999
- 警告时间:7
- 不活动时间:失效时间:标志:都为空
3、/etc/group 文件
组(group)的配置文件,记录Linux 包含的组的信息
每行含义:组名:口令:组标识号:组内用户列表
- 组名:组的名字
- 如果添加用户的时候没有为其添加组,他自己会自成一个组
- 口令:一般为x或者空格
- 组标识号:组id
- 组内用户列表:组内成员用户的列表
- 一般隐藏起来了,看不见的
5、Linux 实用指令
1、指定运行级别
1、基本介绍
运行级别说明:
- 0:关机
- 1:单用户【找回丢失密码】
- 2:多用户状态没有网络服务
- Linux最大的优势就是它的网络服务
- 用的非常少
- 3:多用户状态有网络服务
- 4:系统未使用保留给用户
- 用的非常少
- 5:图形界面
- 6:系统重启
常用运行级别是3 和5 ,也可以指定默认运行级别。
2、相关命令
1、执行对应的init命令
1 | init 0/1/2/3/4/5/6 |
2、查看当前的默认运行级别
1 | systemctl get-default |
3、设置 默认的运行级别
1 | systemctl set-default TARGET.target |
3、CentOS7 后运行级别说明
在centos7以前,是在文件/etc/inittab当中进行修改,在里面的一行配置runlevel中指定一个数字,代表默认启动的级别
在centos7以后进行了简化,如下:
1 | # multi-user.target 相当于 entos7以前的 runlevel 3 |
2、找回 root 密码
首先,启动系统,进入开机界面,在界面中按 “e” 进入编辑界面
- 速度要快,只有5s。超过5s就进入登陆页面了
进入编辑界面,使用键盘上的上下键把光标往下移动,找到以“Linux16”开头内容所在的行数”,在行的最后面输入:
init=/bin/sh
接着,输入完成后,直接按快捷键:
Ctrl+x
进入单用户模式。接着,在光标闪烁的位置中输入:
mount -o remount,rw /
(注意:各个单词间有空格),完成后按键盘的回车键(Enter)。在新的一行最后面输入:passwd, 完成后按键盘的回车键(Enter)。输入密码,然后再次确认密码即可
- (密码长度最好8位以上,但不是必须的)
密码修改成功后,会显示passwd…..的样式,说明密码修改成功
接着,在鼠标闪烁的位置中(最后一行中)输入:
touch /.autorelabel
(注意:touch与 /后面有一个空格),完成后按键盘的回车键(Enter)继续在光标闪烁的位置中,输入:
exec /sbin/init
(注意:exec与 /后面有一个空格),完成后按键盘的回车键(Enter),等待系统自动修改密码(这个过程时间可能有点长,耐心等待),完成后,系统会自动重启,新的密码生效了
3、帮助指令
1、man 获得帮助信息
基本语法:(功能描述:获得帮助信息)
1 | man [命令或配置文件] |
2、help 指令
基本语法:(功能描述:获得 shell 内置命令的帮助信息)
1 | help 命令 |
4、文件目录类
1、pwd 指令
功能描述:显示当前工作目录的绝对路径
1 | pwd |
2、ls 指令
1 | ls [选项] [目录或是文件] |
常用选项:
- -a:显示当前目录所有的文件和目录,包括隐藏的。
- -l:以列表的方式显示信息
- -h:展示更加人性化,如把字节转化为兆等等
3、cd 指令
功能描述:切换到指定目录
1 | cd [参数] |
理解:绝对路径和相对路径
- 绝对路径:从根目录下往下寻找——/home/tom
- 相对路径:从当前目录上寻找
1 | # 回到自己的家目录, 比如你是root , cd ~ 到/root |
应用实例:
1 | # 使用绝对路径切换到 root 目录 |
4、mkdir 指令
功能描述:用于创建目录
1 | mkdir [选项] 要创建的目录 |
选项:
- -p:创建多级目录
应用实例:
1 | # 创建一个目录/home/dog |
注意:
- mkdir 默认创建以及目录
- 如果要创建多级目录,需要加上-p
5、rmdir 指令
功能描述:删除空目录
1 | rmdir [选项] 要删除的空目录 |
使用细节
- rmdir 删除的是空目录,如果目录下有内容时无法删除的。
- 提示:如果需要删除非空目录,需要使用rm -rf 要删除的目录
- -f:不需要提示
- -r:递归删除
6、touch 指令
功能描述:用于创建空文件
1 | touch 文件名称 |
7、cp 指令
功能描述:拷贝文件到指定目录
1 | cp [选项] source dest |
常用选项
- -r :递归复制整个文件夹
使用细节
强制覆盖不提示的方法:\cp
1
\cp -r /home/bbb /opt
8、rm 指令
功能描述:移除文件或目录
1 | rm [选项] 要删除的文件或目录 |
常用选项
- -r:递归删除整个文件夹
- -f: 强制删除不提示
使用细节:
- 强制删除不提示的方法:带上-f 参数即可
9、mv 指令
功能描述:移动文件与目录或重命名
1 | # 功能描述:重命名 |
使用细节:
- 如果mv的两个文件或者目录在同一个目录下,那么mv的功能就是重命名
- 如果mv的两个文件或者目录在不在同一个目录下,那么mv的功能就是移动
- 如果想要移动并且重命名的话,两个文件或者目录在不在同一个目录下,并且在移动之后添加重命名后的文件名称
- 注意:
- 在Linux中,如果一个文件后面有加上
/
,那么该文件代表的就是一个目录 - 如果没有加上
/
,那么就是一个文件
- 在Linux中,如果一个文件后面有加上
10、cat 指令
功能描述:查看文件内容
1 | cat [选项] 要查看的文件 |
选项:
- -n :显示行号
使用细节:
- cat 只能浏览文件,而不能修改文件,为了浏览方便,一般会带上管道命令
| more
- cat -n /etc/profile | more [进行交互]
11、more 指令
more 指令是一个基于VI 编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。
more 指令中内置了若干快捷键(交互的指令)。
1 | more 要查看的文件 |
快捷键说明:
操作 | 功能说明 |
---|---|
空格键(space) | 代表向下翻一页 |
Enter | 代表向下翻一行 |
q | 代表立即离开more,不再显示该文件的内容 |
ctrl + F | 向下滚动一屏 |
ctrl + B | 返回上一屏 |
= | 输出当前行的行号 |
:f | 输出当前文件名和当前行的行号 |
12、less 指令
less 指令用来分屏查看文件内容,它的功能与more 指令类似,但是比more 指令更加强大,支持各种显示终端。
less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。(懒加载)
1 | less 要查看的文件 |
快捷键说明:
操作 | 功能说明 |
---|---|
空格键(space) | 代表向下翻一页 |
[pagedown] | 代表向下翻一页 |
[pageup] | 代表向上翻一页 |
q | 代表立即离开less,不再显示该文件的内容 |
/字串 | 向下搜索[字串]的功能;n:向下查找;N:向上查找 |
?字串 | 向上搜索[字串]的功能;n:向上查找;N:向下查找 |
13、echo 指令
功能描述:输出内容到控制台
1 | echo [选项] [输出内容] |
14、head 指令
功能描述:显示文件的开头部分内容,默认情况下head 指令显示文件的前10 行内容
1 | # 功能描述:查看文件头10行内容 |
15、tail 指令
功能描述:输出文件中尾部的内容,默认情况下tail 指令显示文件的最后10 行内容。
1 | # 功能描述:查看文件尾10行内容 |
16、> 指令和 >> 指令
功能描述:> 输出重定向 和 >> 追加
1 | # 功能描述:文件的列表的内容写入文件a.txt 中(覆盖写) |
使用细节
>
输出重定向是覆盖写>>
追加是在文件后面追加内容
17、ln 指令
功能描述:给原文件创建一个软链接
软链接也称为符号链接,类似于windows 里的快捷方式,主要存放了链接其他文件的路径。
1 | # 给原文件创建一个软链接 |
细节说明:
- 当我们使用pwd 指令查看目录时,仍然看到的是软链接所在目录。
- 在/home/myroot目录下ls和创建新文件等同在/root下操作
18、history 指令
功能描述:查看已经执行过历史命令,也可以执行历史指令
1 | # 查看已经执行过历史命令 |
5、时间日期类
1、date 指令——显示当前日期
1 | # 功能描述:显示当前时间 |
2、date 指令——设置日期
1 | date -s 字符串时间 |
3、cal 指令
查看当前日历
1 | # 功能描述:不加选项,显示本月日历 |
6、搜索查找类
1、find 指令
功能描述:从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端。
1 | find [搜索范围] [选项] |
选项 | 功能 |
---|---|
-name<查询方式> | 按照指定的文件名查找模式查找文件 |
-user<用户名> | 查找属于指定用户的所有文件 |
-size<文件大小> | 按照指定文件的大小查找文件 |
应用实例:
1 | # 按文件名:根据名称查找/home 目录下的hello.txt 文件 |
2、locate 指令
locate 指令可以快速定位文件路径。
locate 指令利用事先建立的系统中所有文件名称及路径的locate 数据库实现快速定位给定的文件。
Locate 指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新locate 数据库
1 | locate 搜索文件 |
特别说明:
- 由于locate 指令基于数据库进行查询,所以第一次运行前,必须使用updatedb 指令创建locate 数据库。
3、which 指令
功能描述:可以查看某个指令在哪个目录下
1 | which 指令名称 |
4、grep 指令和管道符号|
grep 过滤查找, 管道符,“|”,表示将前一个命令的处理结果输出传递给后面的命令处理
1 | grep [选项] 查找内容源文件 |
常用选项:
选项 | 功能 |
---|---|
-n | 显示匹配行以及行号 |
-i | 忽略字母大小写 |
-v | 反向匹配(匹配当前不存在的结果) |
应用实例:
1 | # 请在hello.txt 文件中,查找"yes" 所在行,并且显示行号 |
7、压缩和解压类
1、gzip/gunzip 指令
功能描述:gzip 用于压缩文件, gunzip 用于解压的
1 | # 功能描述:压缩文件,只能将文件压缩为*.gz 文件 |
2、zip/unzip 指令
功能描述:zip 用于压缩文件, unzip 用于解压的,这个在项目打包发布中很有用的
1 | # 功能描述:压缩文件和目录的命令 |
zip 常用选项:
- -r:递归压缩,即压缩目录
unzip 的常用选项:
- -d<目录> :指定解压后文件的存放目录
应用实例
1 | # 将/home 下的所有文件/文件夹进行压缩成myhome.zip |
3、tar 指令
功能描述:tar 指令是打包指令,最后打包后的文件是.tar.gz 的文件。
1 | # 功能描述:打包目录,压缩后的文件格式.tar.gz |
选项说明:
选项 | 功能 |
---|---|
-c | 产生.tar打包文件 |
-v | 显示详细信息 |
-f | 指定压缩后的文件名 |
-z | 用gzip对文档(是否同时具有 gzip 的属性)进行压缩或解压 |
-x | 解包.tar文件 |
应用实例:
1 | # 压缩多个文件,将/home/pig.txt 和/home/cat.txt 压缩成pc.tar.gz |
细节说明:
- -C::-C<目的目录>或–directory=<目的目录> 切换到指定的目录。
6、Linux 组管理和权限管理
1、Linux 组基本介绍
在linux 中的每个用户必须属于一个组,不能独立于组外。在linux 中每个文件有所有者、所在组、其它组的概念。
- 所有者
- 所在组
- 其它组
- 改变用户所在的组
小a是属于A组的,小a创建的文件1就是A组所在的文件,A部门其他用户有一定的权限,而组B、组C对于文件1来说就是其他组,其他组对文件1有另外的权限。
小a也可以改变组,小a去了B组后,小a的文件所在组也就更改为组B,而组A、组C对文件1来说就更改为其他组
文件1也可以更改所有者
2、文件/目录所有者
一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者。
1、查看文件的所有者
1 | ls –ahl |
2、修改文件所有者
1 | chown 用户名文件名 |
3、组的创建
1、基本指令
1 | groupadd 组名 |
2、应用实例
- 创建一个组monster
- 创建一个用户fox ,并放入到monster 组中
1 | groupadd monster |
4、文件/目录所在组
当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组(默认)。
1、查看文件/目录所在组
1、基本指令
1 | ls –ahl |
2、应用实例
使用fox 来创建一个文件,看看该文件属于哪个组?
1 | ls –ahl |
2、修改文件/目录所在的组
1、基本指令
1 | chgrp 组名文件名 |
2、应用实例
使用root 用户创建文件orange.txt ,看看当前这个文件属于哪个组,然后将这个文件所在组,修改到fruit 组。
1 | # 创建fruit组 |
5、其它组
除文件的所有者和所在组的用户外,系统的其它用户都是文件的其它组
改变用户所在组
在添加用户时,可以指定将该用户添加到哪个组中,同样的用root 的管理权限可以改变某个用户所在的组。
改变用户所在组
1 | # 改变用户所在组 |
6、权限的基本介绍
ls -l 中显示的内容如下:
1 | -rwxrw-r-- 1 root root 1213 Feb 2 09:39 abc |
-rwxrw-r--
这10位数,0-9 位说明:
- 第 0 位确定文件类型(
d
,-
,l
,c
,b
) l
是链接,相当于windows 的快捷方式d
是目录,相当于windows 的文件夹c
是字符设备文件,鼠标,键盘b
是块设备,比如硬盘-
是普通文件- 第1-3 位
rwx
确定所有者(该文件的所有者)拥有该文件的权限。—User - 第4-6 位
rw-
确定所属组(同用户组的)拥有该文件的权限,—Group - 第7-9 位
r--
确定其他用户拥有该文件的权限—Other
7、rwx 权限详解
1、rwx 作用到文件
- [ r ]:代表可读(read),可以读取、查看
- [ w ]:代表可写(write),可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的==目录==有写权限,才能删除该文件。
- [ x ]:代表可执行(execute),可以被执行
2、rwx 作用到目录
- [ r ]:代表可读(read),可以读取,ls 查看目录内容
- [ w ]:代表可写(write),可以修改,对目录内创建文件+删除文件+重命名目录
- [ x ]:代表可执行(execute),可以进入该目录(cd),并且可以对里面的文件进行修改,但是不能使用ls查看目录内容
8、文件及目录权限实际案例
ls -l 中显示的内容如下
1 | -rwxrw-r-- 1 root root 1213 Feb 2 09:39 abc |
-rwxrw-r--
这10 个字符确定不同用户能对文件干什么- 第一个字符代表文件类型: -、l、d、c、b
- 其余字符每3 个一组(rwx) 读(r) 写(w) 执行(x)
- 第一组rwx : 文件拥有者的权限是读、写和执行——即root用户对该文件具有读写执行的权限
- 第二组rw- : 与文件拥有者同一组的用户的权限是读、写但不能执行——即root组对该文件具有读写的权限
- 第三组r– : 不与文件拥有者同组的其他用户的权限是读不能写和执行
- 可用数字表示为: r=4,w=2,x=1 因此rwx=4+2+1=7 , 数字可以进行组合
- 其它说明
- 1:文件的硬连接数
- 如果当前是一个文件,则为1
- 如果不是一个文件,而是一个目录,则为子目录数 + 文件数
- 第一个root:用户
- 第二个root:组
- 1213:文件大小(字节),如果是文件夹,显示4096 字节
- Feb 2 09:39:最后修改日期
- abc:文件名
- 1:文件的硬连接数
9、修改权限——chmod
1、基本说明
通过chmod 指令,可以修改文件或者目录的权限。
2、第一种方式:+ 、-、= 变更权限
u:所有者、g:所在组、o:其他人、a:所有人 (u、g、o 的总和)
# 给文件所有者读写执行的权限,给文件所在组读执行权限,给文件的其他人执行的权限 chmod u=rwx,g=rx,o=x 文件/目录名
1
2
3
4
- ```sh
# 给文件的其他用户赋予写的权限
chmod o+w 文件/目录名# 去掉所有人对该文件的执行权限 chmod a-x 文件/目录名
1
2
3
4
5
6
7
- 案例演示
1. 给abc 文件的所有者读写执行的权限,给所在组读执行权限,给其它组读执行权限。
```sh
chmod u=rwx,g=rx,o=rx abc
给abc 文件的所有者除去执行的权限,增加组写的权限
1
chmod u-x,g+w abc
给abc 文件的所有用户添加读的权限
1
chmod a+r abc
3、第二种方式:通过数字变更权限
r=4 w=2 x=1 《==》 rwx=4+2+1=7
1 | chmod u=rwx,g=rx,o=x 文件/目录名 |
案例演示:
1 | # 将/home/abc.txt 文件的权限修改成rwxr-xr-x, 使用给数字的方式实现 |
10、修改文件/目录所有者——chown
基本使用:
1 | # 修改文件/目录所有者 |
11、修改文件/目录所在组——chgrp
基本使用:
1 | # 修改文件/目录所在组 |
7、Linux 定时任务调度
1、crond 任务调度
1 | crontab 进行定时任务的设置 |
1、概述
- 任务调度:是指系统在某个时间执行的特定的命令或程序。
- 任务调度分类:
- 系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等
- 个别用户工作:个别用户可能希望执行某些程序,比如对mysql 数据库的备份。
2、基本语法
1 | crontab [选项] |
3、常用选项
选项 | 功能 |
---|---|
-e | 编辑crontab定时任务 |
-l | 查询crontab定时任务 |
-r | 删除当前用户所有的crontab定时任务 |
4、快速入门
1 | # 设置任务调度文件:/etc/crontab |
参数细节说明:5 个占位符的说明
项目 | 含义 | 范围 |
---|---|---|
第一个 “*” | 一小时当中的第几分钟 | 0 - 59 |
第二个 “*” | 一天当中的第几小时 | 0 - 23 |
第三个 “*” | 一个月当中的第几天 | 1 - 31 |
第四个 “*” | 一年当中的第几月 | 1 - 12 |
第五个 “*” | 一周当中的星期几 | 0 - 7(0和7都代表星期日) |
特殊符号的说明:
特殊符号 | 含义 |
---|---|
* | 代表任何时间。比如第一个”*” 就代表一小时当中的每分钟都执行一次的意思 |
, | 代表不连续的时间。比如”0 8,12,16 * * * 命令”,就代表在每天的8点0分,12点0分,16点0分都执行一次命令 |
- | 代表连续的时间范围。比如”0 5 * * 1-6 命令”,代表在周一到周六的凌晨5点0分执行一次命令 |
*/n | 癌变每隔多久执行一次。比如”/10 * * * * 命令”,代表每隔10分钟就执行一次 |
特殊时间执行案例:
时间 | 含义 |
---|---|
45 22 * * * 命令 | 在22点45分执行命令 |
0 17 * * 1 命令 | 每周一的17点0分执行命令 |
0 5 1,15 * * 命令 | 在每月的1号和15号的凌晨5点0分执行命令 |
40 4 * * 1-5 命令 | 在每周的周一到周五的凌晨4点40分执行命令 |
*/10 4 * * * 命令 | 每天的凌晨4点,每隔10分钟执行一次命令 |
0 0 1,15 * 1 命令 | 每月的1号和15号,每周1的0点0分都会执行命令。注意:星期几和几号最好不要同时出现,因为他们定义的都是天。非常容易让管理员混乱。 |
5、应用实例
1 | # 执行crontab –e 命令。 |
6、crond 相关指令
1 | # 终止任务调度 |
2、at 定时任务
1、基本介绍
at 命令是==一次性==定时计划任务,at 的守护进程
atd
会以后台模式运行,检查作业队列来运行。默认情况下,atd 守护进程
每60 秒
检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业。at 命令是一次性定时计划任务,执行完一个任务后不再执行此任务了
在使用at 命令的时候,一定要保证atd 进程的启动,可以使用相关指令来查看
1
2# 检测atd是否在运行
ps -ef | grep atd
2、at 命令格式
1 | at [选项] [时间] |
3、at 命令选项
选项 | 含义 |
---|---|
-m | 当指定任务被完成后,将给用户发送邮件,即使没有标准输出 |
-I | atq的别名 |
-d | atrm的别名 |
-v | 显示任务将被执行的时间 |
-c | 打印任务的内容到标准输出 |
-V | 显示版本信息 |
-q<队列> | 使用指定的任务队列 |
-f<文件> | 从指定文件读入任务而不是从标准输入读入 |
-t<数据参数> | 以时间参数的形式提交要运行的任务 |
4、at 时间定义
at 指定时间的方法:
- 接受在当天的 hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。
- 例如:04:00(凌晨用户较少)
- 使用 midnight(深夜),noon(中午),teatime(饮茶时间(西方),一般是下午4 点)等比较模糊的词语来指定时间。
- 采用12 小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。
- 例如:12pm
- 指定命令执行的具体日期,指定格式为 month day(月日)或 mm/dd/yy(月/日/年)或 dd.mm.yy(日.月.年),指定的日期必须跟在指定时间的后面。
- 例如:04:00 2021-03-1
- 使用相对计时法。指定格式为:
now + count time-units
- now 就是当前时间
- time-units 是时间单位
- 这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。
- count 是时间的数量,几天,几小时。
- 例如:now + 5 minutes
- 直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。
5、应用实例
2天后的下午5点执行/bin/ls /home
如果输入错误可通过
ctrl+backspace
进行删除atq 命令来查看系统中没有执行的工作任务
明天17 点钟,输出时间到指定文件内比如/root/date100.log
2 分钟后,输出时间到指定文件内比如/root/date200.log
删除已经设置的任务:atrm 任务编号
1
2# 表示将job 队列,编号为4 的job 删除.
atrm 4
8、Linux 磁盘分区、挂载
1、Linux 分区
1、原理介绍
- Linux 来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构, Linux中每个分区都是用来组成整个文件系统的一部分。
- Linux 采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得。
2、硬盘说明
- Linux 硬盘分 IDE 硬盘和 SCSI 硬盘,目前基本上是SCSI 硬盘
- 对于IDE 硬盘,驱动器标识符为“
hdx~
”,其中“hd”表明分区所在设备的类型,这里是指IDE 硬盘了。
- “x”为盘号(a 为基本盘,b 为基本从属盘,c 为辅助主盘,d 为辅助从属盘);
- “~”代表分区,前四个分区用数字1到4表示,它们是主分区或扩展分区,从5 开始就是逻辑分区。例:
- hda3 表示为第一个IDE 硬盘上的第三个主分区或扩展分区
- hdb2 表示为第二个IDE 硬盘上的第二个主分区或扩展分区。
- 对于SCSI 硬盘则标识为“
sdx~
”,SCSI 硬盘是用“sd”来表示分区所在设备的类型的,其余则和IDE 硬盘的表示方法一样
3、查看所有设备挂载情况
1 | lsblk |
2、挂载的经典案例
1、说明
下面我们以增加一块硬盘为例来熟悉下磁盘的相关指令和深入理解磁盘分区、挂载、卸载的概念
2、如何增加一块硬盘
- 虚拟机添加硬盘
- 分区
- 格式化
- 挂载
- 设置可以自动挂载
3、虚拟机增加硬盘步骤1——添加硬盘
在【虚拟机】菜单中,选择【设置】,然后设备列表里添加硬盘,然后一路【下一步】,中间只有选择磁盘大小的地方需要修改,至到完成。然后重启系统(才能识别)!
4、虚拟机增加硬盘步骤2——分区
分区命令:
1 | fdisk /dev/sdb |
开始对/sdb 分区:
- m:显示命令列表
- p:显示磁盘分区同fdisk –l
- n:新增分区
- d:删除分区
- w:写入并退出
说明: 开始分区后输入n,新增分区,然后选择p ,分区类型为主分区。两次回车默认剩余全部空间。最后输入w写入分区并退出,若不保存退出输入q。
5、虚拟机增加硬盘步骤3——格式化磁盘
分区命令:
1 | mkfs -t ext4 /dev/sdb1 |
其中ext4 是分区类型。
在未格式化磁盘之前,刚分完区的分区是没有唯一的UUID的
在格式化磁盘之后,给对应分区分配了唯一的UUID
6、虚拟机增加硬盘步骤4——挂载
挂载:将一个分区与一个目录联系起来
1 | mount 设备名称挂载目录 |
卸载:解除一个分区与一个目录之间的联系
1 | umount 设备名称或挂载目录 |
细节:
- 不要在设备名称文件或者挂载目录下进行卸载操作,否则会显示正在忙状态
- 卸载后里面的文件依然在分区中,重新挂载一个目录就能够读取了。
分配UUID的分区是没有挂载在任何目录下的
为分区和目录联系起来之后,也就是挂载之后。在挂载点会显示挂载的目录
挂载后的Linux文件与硬盘存储的关系:
7、虚拟机增加硬盘步骤5——自动挂载
用命令行挂载的分区和目录,重启后会失效。即:命令行的挂载只是临时的
永久挂载:通过修改/etc/fstab
实现挂载,添加完成后执行mount –a
即刻生效或者重启之后也可以生效
永久挂载时由于书写错误导致进入紧急模式的解决方法:重启后输入root密码回车,去到root终端,然后vim /etc/fstab
,修改回正确的,然后reboot即可。
3、磁盘情况查询
1、查询系统整体磁盘使用情况
1、基本语法
1 | df -h |
2、应用实例
查询系统整体磁盘使用情况
注意:当已用占比达到80%以上,就需要适当清理分区或者增加分区的容量,以防出现分区容量不够导致运行出错。
2、查询指定目录的磁盘占用情况
1、基本语法
1 | du -h 目录名称 |
细节:查询指定目录的磁盘占用情况,默认为当前目录(没写的时候)
2、相关选项
-s
:指定目录占用大小汇总-h
:带计量单位-a
:含文件--max-depth=1
:子目录深度-c
:列出明细的同时,增加汇总值
3、应用实例
查询/opt 目录的磁盘占用情况,深度为1
4、磁盘情况——工作实用指令
统计/opt 文件夹下文件的个数
1
ls -l /opt | grep "^-" | wc -l
"^-"
:正则表达式:表示文件| grep "^-"
:过滤出文件夹里面的文件wc -l
:把过滤后的结果进行计数(wc命令)
统计/opt 文件夹下目录的个数
1
ls -l /opt | grep "^d" | wc -l
"^d"
:正则表达式:表示目录
统计/opt 文件夹下文件的个数,包括子文件夹里的
1
ls -lR /opt | grep "^-" | wc -l
-R
:表示递归
统计/opt 文件夹下目录的个数,包括子文件夹里的
1
ls -lR /opt | grep "^d" | wc -l
以树状显示目录结构tree 目录, 注意,如果没有tree,则使用yum install tree 安装
9、Linux 网络配置
1、Linux 网络配置原理图
2、查看网络IP 和网关
1、查看虚拟网络编辑器和修改IP 地址
2、查看网关
3、查看windows 环境的中VMnet8 网络配置
1、方式一:ipconfig 指令
2、方式二:网络和共享中心
在Windows当中的 控制面板
=> 所有控制面板项
=> 网络和共享中心
=> 更改适配器设置
=> VMnet8(右键属性)
=> Internet 协议版本 4(TCP/IPv4)(属性)
4、查看linux 的网络配置ifconfig
5、ping 测试主机之间网络连通性
1、基本语法
功能描述:测试当前服务器是否可以连接目的主机:
1 | ping 目的主机 |
2、应用实例
测试当前服务器是否可以连接百度:
1 | ping www.baidu.com |
6、linux 网络环境配置
1、第一种方法(自动获取)
说明:登陆后,通过界面的来设置自动获取ip。
优缺点:
- 优点:linux 启动后会自动获取IP,可以有效的防止IP冲突问题
- 缺点:每次自动获取的ip 地址可能不一样,不能作为线上的服务器
2、第二种方法(指定ip)
说明:直接修改配置文件来指定IP,并可以连接到外网(程序员推荐)
编辑:
1 | vim /etc/sysconfig/network-scripts/ifcfg-ens33 |
要求:将ip 地址配置的静态的
比如:ip 地址为192.168.200.130
ifcfg-ens33 文件说明:
1 | # 接口名(设备,网卡) |
重启网络服务或者重启系统生效:
1 | service network restart |
3、设置主机名和hosts 映射
1、设置主机名
- 为了方便记忆,可以给 linux 系统设置主机名,也可以根据需要修改主机名
- 指令hostname:查看主机名
- 修改文件在
/etc/hostname
指定 - 修改后,重启生效
2、设置hosts 映射
思考:如何通过主机名能够找到(比如ping) 某个linux 系统?
- Windows
- 在C:\Windows\System32\drivers\etc\hosts 文件指定即可
- 案例:192.168.200.130 hspedu100
- Linux
- 在/etc/hosts 文件指定
- 案例:192.168.200.1 ThinkPad-PC
- IP:192.168.200.1
- 主机名:ThinkPad-PC(可以在
控制面板
的所有控制面板
的系统
查看Windows的主机名)
4、主机名解析过程分析(Hosts、DNS)
1、Hosts 是什么
一个文本文件,用来记录IP 和Hostname(主机名)的映射关系
2、DNS
DNS,就是 Domain Name System 的缩写,翻译过来就是域名系统
是互联网上作为域名和IP 地址相互映射的一个分布式数据库。
3、应用实例
用户在浏览器输入了www.baidu.com
浏览器先检查浏览器缓存中有没有该域名解析IP 地址,有就先调用这个IP 完成解析;如果没有,就检查DNS解析器缓存,如果有直接返回IP 完成解析。这两个缓存,可以理解为本地解析器缓存
一般来说,当电脑第一次成功访问某一网站后,在一定时间内,浏览器或操作系统会缓存他的IP 地址(DNS 解析记录).如在cmd 窗口中输入
1
2
3
4
5# DNS 域名解析缓存
ipconfig /displaydns
# 手动清理dns 缓存
ipconfig /flushdns如果本地解析器缓存没有找到对应映射,检查系统中hosts 文件中有没有配置对应的域名IP 映射,如果有,则完成解析并返回。
如果本地DNS 解析器缓存和hosts 文件中均没有找到对应的IP,则到域名服务DNS 进行解析域
注意:DNS域名劫持问题——运营商劫持,往里面注入一些广告之类的东西
10、Linux 进程管理
1、基本介绍
- 在LINUX 中,每个执行的程序都称为一个进程。每一个进程都分配一个ID 号(pid,进程号)。
- 每个进程都可能以两种方式存在的。前台与后台,所谓前台进程就是用户目前的屏幕上可以进行操作的。后台进程则是实际在操作,但由于屏幕上无法看到的进程,通常使用后台方式执行。
- 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中。直到关机才结束。
2、显示系统执行的进程
1、基本介绍
ps 命令是用来查看目前系统中,有哪些正在执行,以及它们执行的状况。可以不加任何参数。
只是不带参数能够才查看的信息有限。
2、ps 详解
指令:
1 | ps –aux | grep xxx |
指令说明:
System V 展示风格
USER
:用户名称PID
:进程号%CPU
:进程占用CPU 的百分比%MEM
:进程占用物理内存的百分比VSZ
:进程占用的虚拟内存大小(单位:KB)RSS
:进程占用的物理内存大小(单位:KB)TTY
:终端名称,缩写.STAT
:进程状态,其中:S
:睡眠s
:表示该进程是会话的先导进程N
:表示进程拥有比普通优先级更低的优先级R
:正在运行D
:短期等待Z
:僵死进程T
:被跟踪或者被停止等等
STARTED
:进程的启动时间TIME
:CPU 时间,即进程使用CPU 的总时间COMMAND
:启动进程所用的命令和参数,如果过长会被截断显示
3、应用实例
要求:以全格式显示当前所有的进程,查看进程的父进程。查看sshd 的父进程信息
ps -ef 是以全格式显示当前所有的进程
- -e:显示所有进程
- -f:全格式
1 | ps -ef|grep sshd |
是BSD 风格:
UID
:用户IDPID
:进程IDPPID
:父进程IDC
:CPU 用于计算执行优先级的因子。数值越大,表明进程是CPU 密集型运算,执行优先级会降低;数值越小,表明进程是I/O 密集型运算,执行优先级会提高STIME
:进程启动的时间TTY
:完整的终端名称TIME
:CPU 时间CMD
:启动进程所用的命令和参数
3、终止进程kill 和killall
1、介绍
若是某个进程执行一半需要停止时,或是已消了很大的系统资源时,此时可以考虑停止该进程。使用kill 命令来完
成此项任务。
2、基本语法
1 | # 通过进程号杀死/终止进程 |
3、常用选项
-9
:表示强迫进程立即停止
4、最佳实践
1 | # 踢掉某个非法登录用户,kill 进程号 |
4、查看进程树pstree
1、基本语法
1 | # 可以更加直观的来看进程信息 |
注:如果没有安装pstree,可以使用yum -y install psmisc 安装pstree
2、常用选项
-p
:显示进程的PID-u
:显示进程的所属用户
3、应用实例
1 | # 请你树状的形式显示进程的pid |
5、服务(service)管理
1、介绍
服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysqld , sshd防火墙等),因此我们又称为守护进程,是Linux 中非常重要的知识点。
注:在Linux当中,在一个服务后面加上一个’d’表示当前服务是在后台运行的,’d’表示该进程是守护进程(daemon)
- 如:mysqld、sshd
2、service 管理指令
service 服务名[start | stop | restart | reload | status]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2. 在CentOS7.0 后很多服务不再使用service,而是`systemctl`
3. service 指令管理的服务在/etc/init.d 查看
![image-20210917135951061](Linux/image-20210917135951061.png)
#### 3、service 管理指令案例
请使用service 指令,查看,关闭,启动network [注意:在虚拟系统演示,因为网络连接会关闭]。
相关指令:
```sh
# 查看network的状态
service network status
# 停止network服务
service network stop
# 开启network服务
service network start
4、查看服务名
1、方式一:使用setup -> 系统服务就可以看到全部
1 | setup |
注:按下空格可以进行开启或关闭
2、方式二:/etc/init.d 看到service 指令管理的服务
1 | ls -l /etc/init.d |
5、服务的运行级别(runlevel)
1、Linux 系统的7 种运行级别(runlevel)
Linux 系统有7 种运行级别(runlevel):常用的是级别3 和5
- 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
- 运行级别1:单用户工作状态,root 权限,用于系统维护,禁止远程登陆
- 运行级别2:多用户状态(没有NFS),不支持网络
- 运行级别3:完全的多用户状态(有NFS),无界面,登陆后进入控制台命令行模式
- 运行级别4:系统未使用,保留
- 运行级别5:X11 控制台,登陆后进入图形GUI 模式
- 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
开机的流程说明:
2、CentOS7 后运行级别说明
1 | # 在/etc/initab进行了简化,如下: |
6、chkconfig 指令
1、介绍
- 通过chkconfig 命令可以给服务的各个运行级别设置自启动/关闭
- chkconfig 指令管理的服务在/etc/init.d 查看
- 注意:Centos7.0 后,很多服务使用
systemctl
管理
2、chkconfig 基本语法
1 | # 查看服务 |
3、案例演示
对network 服务进行各种操作,把network 在3 运行级别,关闭自启动
1 | chkconfig --level 3 network off |
4、使用细节
chkconfig 重新设置服务后自启动或关闭,需要重启机器reboot 生效。
7、systemctl 管理指令
1、基本语法
1 | systemctl [start | stop | restart | status] 服务名 |
systemctl 指令管理的服务在/usr/lib/systemd/system
查看
2、systemctl 设置服务的自启动状态
1 | # 查看服务开机启动状态, grep 可以进行过滤 |
3、应用案例
查看当前防火墙的状况,关闭防火墙和重启防火墙
怎么查看防火墙服务:(其他服务类似)
1
ls -l /usr/lib/systemd/system/ | grep fire
查看当前防火墙的状况
1
systemctl status firewalld
关闭防火墙和重启防火墙
1
2
3systemctl stop firewalld
systemctl start firewalld
4、细节讨论
- 关闭或者启用防火墙后,立即生效。[telnet 测试某个端口即可]
- 这种方式只是临时生效,当重启系统后,还是回归以前对服务的设置。
- 如果希望设置某个服务自启动或关闭永久生效,要使用
systemctl [enable|disable] 服务名
systemctl enable/disable
是设置服务是否自启动,对服务永久生效;systemctl stop/start
是设置当前服务的状态,重启后服务的状态会被重置
在关闭防火墙之后,查询发现还是防火墙还是开机自启动的
只有使用systemctl [enable|disable] 服务名
设置了以后,才能设置防火墙开机自启动关闭永久生效
5、关于防火墙
防火墙就是在外界申请的请求进入Linux系统之前进行拦截一道“城墙”,可以防止外界无脑对Linux服务进行访问。只对防护墙中开放的端口的服务才能进行访问,那些关闭的端口,外界并不能得到Linux的对应服务。
那么怎么得到关闭端口的对应的Linux的相关服务呢?
- 方法1:关闭防火墙服务
- 方法2:开放关闭的端口
8、打开或者关闭指定端口
1、简介
在真正的生产环境,往往需要将防火墙打开,但问题来了,如果我们把防火墙打开,那么外部请求数据包就不能跟
服务器监听端口通讯。这时,需要打开指定的端口。比如80、22、8080 等,这个又怎么做呢?
2、firewall 指令
1 | # 打开端口 |
对于协议的查看:
1 | nestat -anp | more |
3、应用案例
启用防火墙, 测试111 端口是否能telnet——不行
开放111 端口,测试111 端口是否能telnet——行
1
2
3
4
5# 开放111 端口
firewall-cmd --permanent --add-port=111/tcp
# 重新载入,才能生效
firewall-cmd --reload再次关闭111 端口,测试111 端口是否能telnet——不行
1
2
3
4
5# 关闭111 端口
firewall-cmd --permanent --remove-port=111/tcp
# 重新载入,才能生效
firewall-cmd --reload
9、动态监控进程
1、介绍
top 与ps 命令很相似。它们都用来显示正在执行的进程。
top 与ps 最大的不同之处,在于top 在执行一段时间可以更新正在运行的的进程。
2、基本语法
1 | top [选项] |
20:10:57
:当前时间4:47
:系统运行时间2 users
:用户数量load average: 0.00, 0.01, 0.05
:负载值- 这是负载均衡的三个平均负载值,分别代表着系统在1、5、15分钟的负载值
- 要是这三个负载值求平均值后数值超过0.7,就清除当前的系统的负载比较大了,就需要对它的性能进行提升
Tasks: 185 total
:当前总任务数1 running,184 sleeping,0 stopped,0 zombie
:1 running
:1个进程正在运行184 sleeping
:184个进程正在休眠0 stopped
:0个进程停止0 zombie
:0个僵尸进程- 注意:僵尸进程指定是那些已经执行结束但是却没有被系统回收的进程
- 出现大量僵尸进程要十分小心,因为系统不能回收那些执行结束的进程,僵尸进程会占用系统的空间而且是无效的,这样会对系统产生影响。
- 需要检查哪里出现了问题
%Cpu(s)
:CPU的占用情况(单位:s)1.3 us,5.1 sy,0.0 ni,93.6 id,0.0 wa,0.0 hi,0.0 si,0.0 st
:1.3 us
:用户占用时间5.1 sy
:系统占用时间0.0 ni
:ni(Niceness),用户进程空间内改变过优先级的进程占用CPU百分比93.6 id
:id(idle),CPU空闲
KiB Mem
:内存占用情况(单位:kb)2028116 total,1550960 free,191704 used,285452 buff/cache
:2028116 total
:总内存1550960 free
:空闲内存191704 used
:已用内存285452 buff/cache
:缓存内存
KiB Swap
:交换分区的占用情况(单位:kb)2097148 total,2097148 free,0 used,1631792 avail Mem
:2097148 total
:总内存2097148 free
:空闲内存0 used
:已用内存1631792 avail Mem
:可获取的内存
注意:主要观察的就是CPU占用情况、内存占用情况和僵尸进程的数量
- 要是CPU占用或内存占用超过70%或80%,则需要查看当前是否存在内存泄露或者提升一下系统的性能
3、选项说明
选项 | 功能 |
---|---|
-d 秒数 | 指定top每隔几秒更新。默认是3s。修改:top -d 10 |
-i | 使top不显示任何闲置或僵尸进程 |
-p | 通过指定监控进程ID来仅仅监控某个进程的状态 |
4、交互操作说明
操作 | 功能 |
---|---|
P | 以CPU使用率排序,默认就是此项 |
M | 以内存的使用率排序 |
N | 以PID排序 |
q | 退出top |
5、应用实例
1 | # 监视特定用户, 比如我们监控tom 用户 |
10、监控网络状态
1、查看系统网络情况——netstat
1、基本语法
1 | netstat [选项] |
2、选项说明
-an
:按一定顺序排列输出-p
:显示哪个进程在调用
3、应用案例
请查看服务名为sshd 的服务的信息。
1 | netstat -anp | grep sshd |
4、原理说明
1 | nestat -anp | more |
原理图:
当tom用户logout之后,当前的连接状态不会立即消失,而是进入TINE_WAIT状态
注:这是tcp协议防止客户端方面因为网络不好而暂时断开连接,会立即断开与客户端的连接,而是会进入一个30s或者一分钟的TINE_WAIT(不同操作系统不一样)。超过TINE_WAIT时间后才会真正消失
2、检测主机连接命令——ping
是一种网络检测工具,它主要是用检测远程主机是否正常,或是两部主机间的网线或网卡故障。
1 | ping 对方ip 地址 |
11、RPM 与 YUM
1、rpm 包的管理
1、介绍
rpm 用于互联网下载包的打包及安装工具,它包含在某些Linux 分发版中。它生成具有.RPM 扩展名的文件。RPM
是RedHat Package Manager(RedHat 软件包管理工具)的缩写,类似windows 的setup.exe,这一文件格式名称虽然打上了RedHat 的标志,但理念是通用的。
Linux 的分发版本都有采用(suse,redhat, centos 等等),可以算是公认的行业标准了。
2、rpm 包的简单查询指令
查询已安装的rpm 列表
1 | rpm –qa | grep xx |
3、rpm 包名基本格式
一个rpm 包名:firefox-60.2.2-1.el7.centos.x86_64
- 名称:firefox
- 版本号:60.2.2-1
- 适用操作系统:el7.centos.x86_64
- 表示centos7.x 的64 位系统
- 如果是i686、i386 表示32 位系统
- noarch 表示通用
4、rpm 包的其它查询指令
1 | # 查询所安装的所有rpm 软件包 |
5、卸载rpm 包
1、基本语法
1 | # -e:erase擦除 |
2、细节讨论
如果其它软件包依赖于您要卸载的软件包,卸载时则会产生错误信息。
1 | rpm -e foo |
1 | removing these packages would break dependencies:foo is needed by bar-1.0-1 |
如果我们就是要删除 foo 这个rpm 包,可以增加参数 --nodeps
,就可以强制删除,但是一般不推荐这样做,因为依赖于该软件包的程序可能无法运行
1 | rpm -e --nodeps foo |
6、安装rpm 包
1、基本语法
1 | rpm -ivh RPM 包全路径名称 |
2、参数说明
- i=install:安装
- v=verbose:提示
- h=hash:进度条
3、应用实例
1 | # 演示卸载和安装firefox 浏览器 |
2、yum
1、介绍
Yum 是一个 Shell 前端软件包管理器。基于RPM 包管理,能够从指定的服务器自动下载RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。
与Maven有点像
2、yum 的基本指令
查询 yum 服务器是否有需要安装的软件
1 | yum list|grep xx 软件列表 |
3、安装指定的yum 包
1 | yum install xxx 下载安装 |
4、yum 应用实例
请使用yum 的方式来安装firefox
1 | # 先卸载firefox |
12、Linux 搭建 JavaEE 环境
1、概述
如果需要在Linux 下进行JavaEE 的开发,我们需要安装如下软件
2、安装JDK
1、安装步骤
# 把JDK下载到opt目录下 mkdir /opt/jdk
1
2
3
4
5
6
2. 通过xftp6 上传到/opt/jdk 下
3. ```sh
# 进入该目录
cd /opt/jdk# 解压传入的JDK的tar.gz包 tar -zxvf jdk-8u261-linux-x64.tar.gz
1
2
3
4
5. ```sh
# 把解压的tar.gz在usr目录的local目录下
mkdir /usr/local/java# 把解压的tar.gz移动到已经创建好的目录下 mv /opt/jdk/jdk1.8.0_261 /usr/local/java
只有配置了环境变量,才能在任何目录下启动java服务 Linux查找服务的过程: 1. 先在当前目录下进行查找 2. 然后到/etc/profile配置文件当中查找 3. 以上两步都找不到的话,返回找不到服务1
2
3
4
7. ```sh
# 配置环境变量的配置文件
vim /etc/profile在/etc/profile配置文件当中的配置(在最后加入以下两行配置)
1
2export JAVA_HOME=/usr/local/java/jdk1.8.0_261
export PATH=$JAVA_HOME/bin:$PATH让新的环境变量生效
1
source /etc/profile
2、测试是否安装成功
在任何目录下输入
1 | java -version |
3、tomcat 的安装
1、步骤
上传安装文件,并解压缩到
1
2
3
4
5
6
7
8
9
10
11
12# 把JDK下载到opt目录下
mkdir /opt/tomcat
# 通过xftp6 上传到/opt/jdk 下,进入该目录
cd /opt/jdk
# 解压缩
tar -zxvf apache-tomcat-8.5.59.tar.gz
# 把解压的tar.gz在usr目录的local目录下
mkdir /usr/local/tomcat
mv /opt/tomcat/apache-tomcat-8.5.59 /usr/local/java进入解压目录/bin , 启动tomcat
1
./startup.sh
开放端口8080
1
2
3firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
firewall-cmd --query-port=8080/tcp
2、测试是否安装成功
在windows、Linux 下访问http://linuxip:8080
4、idea2020 的安装
步骤
- 下载地址: https://www.jetbrains.com/idea/download/#section=windows
- 解压缩到/opt/idea
- 把解压过后的目录移动到 /usr/local/idea2020下,启动idea bin 目录下./idea.sh,配置jdk
- 注意:这里只有在图形化界面才能启动成功,在命令行模式下不能成功
- 编写Hello world 程序并测试成功!
5、mysql5.7 的安装(!!)
新建文件夹/opt/mysql,并cd进去
运行wget http://dev.mysql.com/get/mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar,下载mysql安装包
- 这个mysql安装包很大,你要忍一下
centos7.6自带的类mysql数据库是mariadb,会跟mysql冲突,要先删除
# 使用tar进行解压 tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar
如果第四条报错, 可能是因为缺少libaio1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
注意:这里的选项没有-z,因为该文件不是tar.gz文件,只是一个tar文件
5. 运行 `rpm -qa|grep mari`,查询mariadb相关安装包
![image-20210918005511185](Linux/image-20210918005511185.png)
6. 运行rpm -e --nodeps mariadb-libs,卸载
7. 运行rpm -e --nodeps marisa,卸载
8. 然后开始真正安装mysql,依次运行以下几条
```sh
rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm1
yum install li'baio
运行systemctl start mysqld.service,启动mysql
然后开始设置root用户密码
Mysql自动给root用户设置随机密码,运行
grep "password" /var/log/mysqld.log
可看到当前密码
运行mysql -u root -p,用root用户登录,提示输入密码可用上述的,可以成功登陆进入mysql命令行
设置root密码,对于个人开发环境,如果要设比较简单的密码(生产环境服务器要设复杂密码),可以运行
1
2-- 提示密码设置策略
set global validate_password_policy=0;validate_password_policy默认值1
1
2# 设置mysql的密码
set password for 'root'@'localhost' =password('your_paddword');运行
flush privileges;
使密码设置生效
关于mysql密码的设置:
如果设置的密码不能满足当前设置的密码设置策略,会出现:
1 | Your password does not satisfy the current policy requirements |
- 注意密码设置的不合格;使用ALTER USER命令就能重新设置合格密码。
- 密码默认8位。不能低于8位
- mysql8的新版本在第一次进入MySQL时是不能修改密码强度的,必须先设置符合条件的密码,之后再该密码强度,再改密码
13、Shell 编程
1、为什么要学习Shell 编程
- Linux 运维工程师在进行服务器集群管理时,需要编写Shell 程序来进行服务器管理。
- 对于JavaEE 和Python 程序员来说,工作的需要,你的老大会要求你编写一些Shell 脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。
- 对于大数据程序员来说,需要编写Shell 程序来管理集群
2、Shell 是什么
Shell 是一个命令行解释器,它为用户提供了一个向Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用Shell 来启动、挂起、停止甚至是编写一些程序。
3、Shell 脚本的执行方式
1、脚本格式要求
- 脚本以
#!/bin/bash
开头- 在Linux当中不止一个shell命令解释器,只是国内用得最多的是bash
- 脚本需要有可执行权限(-x)
2、编写第一个Shell 脚本
需求说明:创建一个Shell 脚本,输出hello world!
1 | vim hello.sh |
- 大家公认的shell脚本以sh为后缀
- 在sh脚本当中,注释使用的是’#’
1 | !/bin/bash |
3、脚本的常用执行方式
1、方式1:给脚本-x权限
说明:首先要赋予helloworld.sh 脚本的+x 权限, 再执行脚本
1 | chmod u+x hello.sh |
2、方式2:sh+脚本
说明:不用赋予脚本+x 权限,直接执行即可。
1 | sh hello.sh |
4、Shell 的变量
1、Shell 变量介绍
- Linux Shell 中的变量分为,系统变量和用户自定义变量。
- 系统变量:$HOME、$PWD、$SHELL、$USER 等等,比如: echo $HOME 等等
- 显示当前shell 中所有变量:
set
2、shell 变量的定义
1、基本语法
定义变量:变量名=值
撤销变量:unset 变量
声明静态变量:readonly 变量
注意:静态变量不能unset进行撤销
2、快速入门
1 | !/bin/bash |
细节:
在Linux当中不要随便加空格
- 如在定义变量的时候变量名称与值之间的’=’左右不能有空格
输出变量需要加上’$’,如$A
$表示:让shell解释器知道后面是一个变量,会转换为该变量的值,否则当做文本处理
如:
1
2
3
4
5
6A=100
echo A=$A
# 或者
echo "A=$A"
echo "A=A"Linux输出:
1
2
3A=100
A=100
A=A
如果$后面的变量不存在或者已被销毁,则为空
- 如Linux输出:A=
将命令的返回值赋给变量
- A=`date`反引号,运行里面的命令,并把结果返回给变量A
- A=$(date) 等价于反引号
shell 脚本的多行注释
- :<<! 内容 !
- 注意:开头的:<<!与结尾的!都要另起一行
3、shell 定义变量的规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
- _A(√)
- 5A=200(×)
- 等号两侧不能有空格
- 变量名称一般习惯为大写, 这是一个规范,我们遵守即可
3、设置环境变量
1、基本语法
1 | # 功能描述:将shell 变量输出为环境变量/全局变量 |
2、快速入门
在/etc/profile 文件中定义 TOMCAT_HOME 环境变量
查看环境变量TOMCAT_HOME 的值
在另外一个shell 程序中使用TOMCAT_HOME
1
2
3!/bin/bash
使用环境变量TOMCAT_HOME
echo "tomcat_home=$TOMCAT_HOME"注意:在输出TOMCAT_HOME 环境变量前,需要让其生效
1
source /etc/profile
4、位置参数变量
1、介绍
当我们执行一个shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
比如: ./myshell.sh 100 200
, 这个就是一个执行shell 的命令行,可以在myshell 脚本中获取到参数100 200的信息
2、基本语法
$n
:功能描述:n 为数字- $0 代表命令本身,$1-$9 代表第一到第九个参数;
- 十以上的参数,十以上的参数需要用大括号包含,如${10}
$*
:功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体$@
:功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待$#
:功能描述:这个变量代表命令行中所有参数的个数
3、位置参数变量案例
案例:编写一个shell 脚本position.sh , 在脚本中获取到命令行的各个参数信息。
1 | !/bin/bash |
5、预定义变量
1、基本介绍
就是shell 设计者事先已经定义好的变量,可以直接在shell 脚本中使用
2、基本语法
$$
:功能描述:当前进程的进程号(PID)$!
:功能描述:后台运行的最后一个进程的进程号(PID)$?
:功能描述:最后一次执行的命令的返回状态。
- 如果这个变量的值为0,证明上一个命令正确执行;
- 如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
3、应用实例
在一个shell 脚本中简单使用一下预定义变量
1 | !/bin/bash |
细节:上面脚本的第四行的’&’表示以后台方式运行脚本
5、运算符
1、基本介绍
学习如何在shell 中进行各种运算操作。
2、基本语法
如果要执行的运算式:
- $((运算式))
- $[运算式]
- expr m + n
- expr是expression:表达式
注意:
expr 运算符间要有空格
如果希望将expr 的结果赋给某个变量,使用``
1
TEMP=`expr 2 + 3`
expr m - n
- 注意:m、n与运算符之间要有空格,否则shell解释器会把m-n当成一个文本
运算符
\*
:乘- 注意:这里的乘法需要转义字符
\
,否则语法报错
- 注意:这里的乘法需要转义字符
/
:除%
:取余
3、应用实例
- 案例1:计算(2+3)X4 的值
- 案例2:请求出命令行的两个参数[整数]的和20 50
1 | !/bin/bash |
细节:注意上面脚本的第13行的乘法需要转义字符\,否则语法报错
6、条件判断
1、判断语句
基本语法:
[ condition ]
- 注意condition 前后要有空格
- condition非空返回true,可使用$?验证
- 0 为true,>1 为false
2、应用实例
[ hspEdu ]
:返回true[ ]
:返回false[ condition ] && echo OK || echo notok
:条件满足,执行后面的语句也可以使用
1
2
3
4if [ condition ]
then
执行语句
fiif开始,then执行,fi结束
注意:
如果[ condition ]当中的condition是一个空,也需要加一个空格,否则语法报错
1
2if [](×)
if [ ](√)如果condition当中有任何值,如[ abc ],则condition不为空,非空返回true
3、判断语句
常用判断条件:
- = 字符串比较
- 两个整数的比较
-lt
:小于(less then)-le
:小于等于(less or equal)-eq
:等于(equal)-gt
:大于(greater than)-ge
:大于等于(greater or equal)-ne
:不等于(not equal)
- 按照文件权限进行判断
-r
:有读的权限-w
:有写的权限-x
:有执行的权限
- 按照文件类型进行判断
-f
:文件存在并且是一个常规的文件-e
:文件存在-d
:文件存在并是一个目录
4、应用实例
- 案例1:”ok”是否等于”ok”
- 判断语句:使用=
- 案例2:23 是否大于等于22
- 判断语句:使用-ge
- 案例3:/root/shcode/aaa.txt 目录中的文件是否存在
- 判断语句: 使用-f
1 | !/bin/bash |
7、流程控制
1、if 判断
基本语法:
1 | if [ 条件判断式 ] |
注意事项:[ 条件判断式 ],中括号和条件判断式之间必须有空格
应用实例:请编写一个shell 程序,如果输入的参数,大于等于60,则输出”及格了”,如果小于60,则输出”不及格”
1 | !/bin/bash |
2、case 语句
基本语法:
1 | case $变量名 in |
应用实例:当命令行参数是1 时,输出”周一”, 是2 时,就输出”周二”, 其它情况输出”other”
1 | !/bin/bash |
3、for 循环
基本语法1:
1 | for 变量in 值1 值2 值3… |
应用实例:打印命令行输入的参数[这里可以看出$* 和$@ 的区别]
1 | !/bin/bash |
基本语法2:
1 | for (( 初始值;循环控制条件;变量变化 )) |
应用实例:从1 加到100 的值输出显示
1 | !/bin/ bash |
4、while 循环
基本语法1:
1 | while [ 条件判断式 ] |
注意:while 和[有空格,条件判断式和[也有空格
应用实例:从命令行输入一个数n,统计从1+..+ n 的值是多少?
1 | !/bin/bash |
8、read 读取控制台输入
1、基本语法
1 | read (选项)(参数) |
选项:
-p
:指定读取值时的提示符;-t
:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。
参数
- 变量:指定读取值的变量名
2、应用实例
- 案例1:读取控制台输入一个NUM1 值
- 案例2:读取控制台输入一个NUM2 值,在10 秒内输入。
1 | !/bin/bash |
9、函数
1、函数介绍
shell 编程和其它编程语言一样,有系统函数,也可以自定义函数。
2、系统函数——basename
功能:返回完整路径最后/ 的部分,常用于获取文件名
basename 基本语法:
1 | basename [pathname] [suffix] |
选项:
suffix
:为后缀,如果suffix 被指定了,basename 会将pathname 或string 中的suffix 去掉。
应用实例:
- 案例1:请返回/home/aaa/test.txt 的”test.txt” 部分
- 案例1:请返回/home/aaa/test.txt 的”test” 部分
1 | basename /home/aaa/test.txt |
3、系统函数——dirname
功能:返回完整路径最后/ 的前面的部分,常用于返回路径部分
1 | 功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分) |
应用实例:请返回/home/aaa/test.txt 的/home/aaa
1 | dirname /home/aaa/test.txt |
4、自定义函数
1、基本语法
1 | [ function ] funname[()] |
调用直接写函数名:funname [值]
2、应用实例
案例1:计算输入两个参数的和(动态的获取), getSum
1 | !/bin/bash |
4、Shell 编程综合案例
数据库备份
1、需求
- 每天凌晨2:30 备份数据库 hspedu 到/data/backup/db
- 备份开始和备份结束能够给出相应的提示信息
- 备份后的文件要求以备份时间为文件名,并打包成.tar.gz 的形式,比如:2021-03-12_230201.tar.gz
- 在备份的同时,检查是否有10 天前备份的数据库文件,如果有就将其删除。
2、原理
3、编写备份数据库的shell脚本
代码:/usr/sbin/mysql_db.backup.sh
1 | 备份目录 |
4、编写定时任务
1 | crontab -e |
1 | 30 2 * * * /usr/sbin/mysql_db.backup.sh |
注意:这里编写到.sh的时候需要包光标打回去h,不能把光标停留到h的后面,在进行:wq退出,不然会出现很奇怪的问题:——会不断重复刚才打的这句话
14、Linux 日志管理
1、基本介绍
- 日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。
- 日志对于安全来说也很重要,它记录了系统每天发生的各种事情,通过日志来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。
- 可以这样理解日志是用来记录重大事件的工具。
2、系统常用的日志
/var/log/ 目录
就是系统日志文件的保存位置:
系统常用的日志:
日志文件 | 说明 |
---|---|
==/var/log/boot.log== | 系统启动日志 |
==/var/log/cron== | 记录与系统定时任务相关的日志 |
/var/log/cups | 记录打印信息的日志 |
/var/log/dmesg | 记录了系统在开机时内核自检的信息。也可以使用dmesg 命令直接查看内核自检信息 |
/var/log/firewalld | 记录了防火墙信息的日志 |
/var/log/btmp | 记录错误登陆的日志。这个文件是二进制文件,不能直接使用Vi查看,而要使用lastb 命令查看。命令如下:[root@localhost log]#lastb |
==/var/log/lastlog== | 记录了系统中所有用户最后一次登陆时间的日志。这个日志也是一个二进制文件。需要使用命令lastlog 查看 |
==/var/log/maillog== | 记录了邮件信息的日志 |
==/var/log/message== | 记录了系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息。如果系统出现问题,首先要检查的就是这个日志文件 |
==/var/log/secure== | 记录了验证和授权方面的信息,重要涉及账户和密码的程序都会记录。比如系统的登陆、ssh的登陆、su切换用户、sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件当中 |
/var/log/wtmp | 永久记录所有用户的登陆、注销信息,同时记录系统的启动、重启、关机事件。这也是一个二进制文件,需要使用命令last 查看 |
==/var/log/utmp== | 记录当前已经登陆的用户的信息。这个文件会随着用户的登陆和注销而不断变化,只记录当前登陆用户的信息。这个文件也是一个二进制文件,不能使用Vi查看,需要使用命令w 、who 、users 等查看 |
应用案例:
使用root 用户通过xshell6 登陆,第一次使用错误的密码,第二次使用正确的密码登录成功看看在日志文件/var/log/secure 里有没有记录相关信息
3、日志管理服务——rsyslogd
1、介绍
CentOS7.6 日志服务是rsyslogd , CentOS6.x 日志服务是syslogd 。
rsyslogd 功能更强大。rsyslogd 的使用、日志文件的格式,和syslogd 服务兼容的。
2、日志相关命令
1 | # 查询Linux 中的rsyslogd 服务是否启动 |
3、配置文件:/etc/rsyslog.conf
编辑文件时的格式为:
1 | *.* 存放日志文件 |
其中第一个
*
代表日志类型,第二个*
代表日志级别
1、日志类型
auth
:pam 产生的日志authpriv
:ssh、ftp 等登录信息的验证信息corn
:时间任务相关kern
:内核lpr
:打印mail
:邮件mark(syslog)-rsyslog
:服务内部的信息,时间标识news
:新闻组user
:用户程序产生的相关信息uucp
:unix to nuix copy 主机之间相关的通信local 1-7
:自定义的日志设备
2、日志级别
debug
:有调试信息的,日志通信最多info
:一般信息日志,最常用notice
:最具有重要性的普通条件的信息warning
:警告级别err
:错误级别,阻止某个功能或者模块不能正常工作的信息crit
:严重级别,阻止整个系统或者整个软件不能正常工作的信息alert
:需要立刻修改的信息emerg
:内核崩溃等重要信息none
:什么都不记录
注意:从上到下,级别从低到高,记录信息越来越少
3、日志记录内容
由日志服务rsyslogd 记录的日志文件,日志文件的格式包含以下4 列
- 事件产生的时间
- 产生事件的服务器的主机名
- 产生事件的服务名或程序名
- 事件的具体信息
日志如何查看实例:查看一下/var/log/secure 日志,这个日志中记录的是用户验证和授权方面的信息来分析如何查看
日志管理服务应用实例:
在/etc/rsyslog.conf 中添加一个日志文件/var/log/hsp.log,当有事件发送时(比如sshd 服务相关事件),该文件会接收到信息并保存。
进行登陆,然后查看hsp.log:
4、日志轮替
1、基本介绍
日志轮替就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围之后,就会进
行删除
2、日志轮替文件命名
- centos7 使用
logrotate
进行日志轮替管理,要想改变日志轮替文件名字,通过/etc/logrotate.conf
配置文件中“dateext
”参数 - 如果配置文件中有“dateext”参数,那么日志会用日期来作为日志文件的后缀,例如“secure-20201010”。这样日志文件名不会重叠,也就不需要日志文件的改名, 只需要指定保存日志个数,删除多余的日志文件即可。
- 如果配置文件中没有“dateext”参数,日志文件就需要进行改名了。
- 当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,
- 然后新建“secure”日志, 用来保存新的日志。
- 当第二次进行日志轮替时,“secure.1”会自动改名为“secure.2”, 当前的“secure”日志会自动改名为“secure.1”,
- 然后也会新建“secure”日志,用来保存新的日志,以此类推。
- 当达到最大保存的日志个数时,会把最大数的那个日志文件删除(最久之前的)
3、logrotate 配置文件
/etc/logrotate.conf 为 logrotate 的全局配置文件
1 | # rotate log files weekly, 每周对日志文件进行一次轮替 |
参数说明:
daily
:日志的轮替周期是每天weekly
:日志的轮替周期是每周monthly
:日志的轮替周期是每月rotate
:数字保留的日志文件的个数。0 指没有备份compress
:日志轮替时,旧的日志进行压缩create mode owner group
:建立新日志,同时指定新日志的权限与所有者和所属组。mail address
:当日志轮替时,输出内容通过邮件发送到指定的邮件地址。missingok
:如果日志不存在,则忽略该日志的警告信息notifempty
:如果日志为空文件,则不进行日志轮替minsize
:大小日志轮替的最小值。也就是日志一定要达到这个最小值才会轮替,否则就算时间达到也
不轮替size
:大小日志只有大于指定大小才进行日志轮替,而不是按照时间轮替。dateext
:使用日期作为日志轮替文件的后缀。sharedscripts
:在此关键字之后的脚本只执行一次。prerotate/endscript
:在日志轮替之前执行脚本命令。postrotate/endscript
:在日志轮替之后执行脚本命令。
/etc/logrotate.d目录中所有的子配置文件
因为可能的日志配置项会很多,将所有日志配置都配置到/etc/logrotate.conf配置文件当中的话,不仅可读性不高,而且也不好管理。因此Linux将一些日志配置在/etc/logrotate.d目录下,然后在/etc/logrotate.conf配置文件当中使用include
进行导入。例如boot.log启动日志的配置就是在/etc/logrotate.d目录下,然后在导入/etc/logrotate.conf配置文件当中使用。
4、把自己的日志加入日志轮替
- 第一种方法是直接在/etc/logrotate.conf 配置文件中写入该日志的轮替策略
- 第二种方法是在/etc/logrotate.d/目录中新建立该日志的轮替文件,在该轮替文件中写入正确的轮替策略,因为该目录中的文件都会被“include”到主配置文件中,所以也可以把日志加入轮替。
- 推荐使用第二种方法,因为系统中需要轮替的日志非常多,如果全都直接写入/etc/logrotate.conf 配置文件,那么这个文件的可管理性就会非常差,不利于此文件的维护。
- 在/etc/logrotate.d/ 配置轮替文件一览
5、应用实例
在/etc/logrotate.conf 进行配置, 或者直接在/etc/logrotate.d/ 下创建文件hsplog 编写如下内容,具体
轮替的效果可以参考/var/log 下的boot.log 情况。
1 | /var/log/hsplog.log |
6、日志轮替机制原理
日志轮替之所以可以在指定的时间备份日志,是依赖系统定时任务。在/etc/cron.daily/目录,就会发现这个目录中是有logrotate 文件(可执行),logrotate 通过这个文件依赖定时任务执行的。
5、查看内存日志
journalctl 可以查看内存日志, 这里我们看看常用的指令
1 | # 查看全部内存日志 |
注意:journalctl 查看的是内存日志,重启清空!
15、Linux 内核源码介绍 & 内核升级
1、linux0.01 内核源码
1、基本介绍
Linux 的内核源代码可以从网上下载, 解压缩后文件一般也都位于linux 目录下。内核源代码有很多版本,可以从
linux0.01 内核入手,总共的代码1w 行左右, 最新版本5.9.8 总共代码超过700w 行,非常庞大
2、linux0.01 内核源码目录&阅读
1、阅读内核源码技巧
- linux0.01 的阅读需要懂c 语言
- 阅读源码前,应知道Linux 内核源码的整体分布情况。现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序和网络等组成。Linux 内核源码的各个目录大致与此相对应。
- 在阅读方法或顺序上,有纵向与横向之分。
- 所谓纵向就是顺着程序的执行顺序逐步进行;
- 所谓横向,就是按模块进行。它们经常结合在一起进行。
- 对于Linux 启动的代码可顺着Linux 的启动顺序一步步来阅读;对于像内存管理部分,可以单独拿出来进行阅读分析。实际上这是一个反复的过程,不可能读一遍就理解。
2、linux 内核源码目录介绍
boot
:和系统引导相关的代码fs
:存放Linux支持的文件系统代码incloud
:存放Linux核心需要的头文件。比如asm、Linux、sysinit
:初始化的代码。里面存放了mian.c函数入口kernel
:和系统内核相关的代码lib
:存放库代码Markfile
:做编译使用mm
:与内存管理相关的代码tools
:一些工具代码
3、linux 内核源码阅读——main.c说明
main.c中的main函数
1 | void main(void) /* This really IS void, no error here. */ |
time_init();
:初始化运行时间tty_init();
:tty初始化trap_init();
:陷阱门(硬件中断向量)初始化sched_init();
:调度程序初始化buffer_init();
:缓冲管理初始化hd_init();
:硬盘初始化sti();
:所有初始化工作完成之后,开启中断move_to_user_mode();
:进入到用户模式
2、linux 内核最新版和内核升级
1、内核地址的查看
2、下载&解压最新版
1 | wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.8.16.tar.gz |
3、linux 内核升级应用实例
将Centos 系统从7.6 内核升级到7.8 版本内核(兼容性问题)
具体步骤:
1 | # 查看当前的内核版本 |
注意:
- 升级内核之后并不是说就应经把当前内核替换成升级的内核,当前的内核依旧是老的内核,只是在老的内核的基础上安装了与当前版本兼容的一个新的内核。
- 当你重启之后,会让你选择一个内核,这时候选择升级的内核才是真正的将升级的内核当做当前Linux的内核。
在升级内核之后,使用yum list kernel -q
命令查看已经安装的内核:
此时使用uname -a
去查看当前内核,发现:
使用依旧是老的内核
重启之后,选择升级的内核。在使用uname -a
去查看当前内核,发现:
已经修改成升级的内核。因为升级的内核与当前版本是兼容的,所以Linux当中下载的软件和插件,以及里面保存的文件都没有什么改变。
16、Linux 的备份与恢复
1、基本介绍
实体机无法做快照,如果系统出现异常或者数据损坏,后果严重, 要重做系统,还会造成数据丢失。
所以我们可以使用备份和恢复技术。
linux 的备份和恢复很简单, 有两种方式:
- 把需要的文件(或者分区)用TAR 打包就行,下次需要恢复的时候,再解压开覆盖即可
- 使用
dump
和restore
命令
2、安装dump 和restore
如果linux 上没有dump 和restore 指令(可以使用下面指令查看)
1 | dump |
需要先按照下面命令对dump 和restore进行安装
1 | yum -y install dump |
3、使用dump 完成备份
1、基本介绍
dump 支持分卷和增量备份(所谓增量备份是指备份上次备份后修改/增加过的文件,也称差异备份)。
什么是增量备份?
- 增量备份就是每一次更新文件时,不进行全文件的备份。只是将增加的部分备份起来,进行一次循环之后在进行一次全文件备份
- 在Linux当中,0代表全文件备份,其他1-9代表增量备份。
- 等到增量备份到了数字9之后,在进行一次全文件备份,也就是0备份。如此循环
2、dump 语法说明
1 | dump [ -cu] [-123456789] [ -f <备份后文件名>] [-T <日期>] [目录或文件系统] |
-c
: 创建新的归档文件,并将由一个或多个文件参数所指定的内容写入归档文件的开头。- c就是以下数字:
- -0123456789: 备份的层级。0 为最完整备份,会备份所有文件。若指定0 以上的层级,则备份至上一次备份以来修改或新增的文件, 到9 后,可以再次轮替.
-u
: 备份完毕后,在/etc/dumpdares 中记录备份的文件系统,层级,日期与时间等。-f <备份后文件名>
: 指定备份后文件名-T <日期>
: 指定开始备份的时间与日期-j
:==调用bzlib 库压缩备份文件==,也就是将备份后的文件==压缩成bz2 格式==,让文件更小-t
: 指定文件名,若该文件已存在备份文件中,则列出名称-W
:显示需要备份的文件及其最后一次备份的层级,时间,日期。-w
:与-W 类似,但仅显示需要备份的文件。
3、dump 应用案例
1 | # 将/boot 分区所有内容备份到/opt/boot.bak0.bz2 文件中,备份层级为“0” |
注:通过dump 命令在配合crontab 可以实现无人值守备份
4、dump -W
显示需要备份的文件及其最后一次备份的层级,时间,日期
5、查看备份时间文件
在etc目录下有dumpdates,里面存放着备份时间文件
1 | cat /etc/dumpdates |
6、dump 备份文件或者目录
前面我们在备份分区时,是可以支持增量备份的,如果备份文件或者目录,不再支持增量备份,即只能使用 0 级别备份
1 | # 使用dump 备份/etc 整个目录 |
如果是重要的备份文件, 比如数据区,建议将文件上传到其它服务器保存,不要将鸡蛋放在同一个篮子
4、使用restore 完成恢复
1、基本介绍
restore 命令用来恢复已备份的文件,可以从dump 生成的备份文件中恢复原文件
2、restore 基本语法
1 | restore [模式选项] [选项] |
说明下面四个模式, 不能混用,在一次命令中, 只能指定一种。
-C
:使用对比模式,将备份的文件与已存在的文件相互对比。-i
:使用交互模式,在进行还原操作时,restors 指令将依序询问用户-r
:进行还原模式,最常用-t
:查看模式,看备份文件有哪些文件
选项:
-f <备份设备>
:从指定的文件中读取备份数据,进行还原操作
3、restore 应用案例
restore 命令比较模式,比较备份文件和原文件的区别:
1 | # 假设下述文件已经备份 |
restore 命令查看模式,看备份文件有哪些数据/文件:
1 | restore -t -f boot.bak0.bz2 |
restore 命令还原模式, 注意细节: 如果你有增量备份,需要把增量备份文件也进行恢复, 有几个增量备份文件,
就要恢复几个,按顺序来恢复即可。
1 | mkdir /opt/boottmp |
restore 命令恢复备份的文件,或者整个目录的文件
1 | # 基础语法 |
1 | [root@hspedu100 opt]# mkdir etctmp |
17、Linux 可视化管理——webmin 和bt 运维工具
1、webmin
1、基本介绍
Webmin 是功能强大的基于Web 的Unix/linux 系统管理工具。管理员通过浏览器访问Webmin 的各种管理功能并完成相应的管理操作。除了各版本的linux 以外还可用于:AIX、HPUX、Solaris、Unixware、Irix 和FreeBSD 等系统
2、安装webmin&配置
1、下载地址:http://download.webmin.com/download/yum/ , 用下载工具下载即可
也可以使用:
1 | wget http://download.webmin.com/download/yum/webmin-1.700-1.noarch.rpm |
2、安装:
1 | rpm -ivh webmin-1.700-1.noarch.rpm |
3、重置密码:
1 | /usr/libexec/webmin/changepass.pl /etc/webmin root test |
root 是webmin 的用户名,不是OS 的,这里就是把webmin 的root 用户密码改成了test
4、修改webmin 服务的端口号(默认是10000 出于安全目的):
1 | # 修改端口 |
将port=10000 修改为其他端口号,如port=6666
5、重启webmin
1 | /etc/webmin/restart # 重启 |
6、防火墙放开6666 端口
1 | firewall-cmd --zone=public --add-port=6666/tcp --permanent # 配置防火墙开放6666 端口 |
7、登录webmin
使用http://ip:6666 可以访问了。用root 账号和重置的新密码test
8、修改语言
注:以上有些可以在网页上实现
3、bt(宝塔)
1、基本介绍
bt 宝塔Linux 面板是提升运维效率的服务器管理软件,支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA 等多项服务器管理功能。
2、安装和使用
安装:
1 | yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh |
安装成功后控制台会显示登录地址,账户密码,复制浏览器打开登录
3、使用介绍
比如可以登录终端、配置、快捷安装运行环境和系统工具、添加计划任务脚本
http://192.168.200.130:8888/2e673418/
4、如果bt 的用户名,密码忘记了,使用bt default 可以查看
1 | bt default |
18、Linux 面试题
1、分析日志t.log(访问量),将各个ip 地址截取,并统计出现次数,并按从大到小排序(腾讯)
1 | http://192.168.200.10/index1.html |
答:
1 | cat t.log | cut -d '/' -f 3 | sort | uniq -c | sort -nr |
解析:
cat t.log
先将文件当中的信息显示出来通过管道之后,使用
cut -d '/' -f 3
命令将IP分割出来cut
用来对每一行数据进行切割-d '/'
表示以’/‘为边界进行切割,将每一行分割成4部分- 第一部分:http:
- 第二部分:
- 第三部分:192.168.200.*(IP地址)
- 第四部分:*.html(访问的页面)
-f 3
表示将每一行分割的第三部分取出来——就是将IP取出来
通过管道之后,将取出的IP地址进行排序
为什么后面也进行排序了,这里依旧需要排序?
这里不进行sort的话,uniq -c统计出来的结果有误
通过管道之后,使用
uniq -c
进行计数通过管道之后,使用
sort -nr
将计数结果按从大到小排序- 因为sort默认是从小到大排序的,所以需要使用
-nr
参数让其按从大到小排序
- 因为sort默认是从小到大排序的,所以需要使用
2、统计连接到服务器的各个ip 情况,并按连接数从大到小排序(腾讯)
答:
1 | netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | cut -d ':' -f 1 | sort | uniq -c | sort -nr |
解析:
- 先使用
netstat -an
查看当前网络连接的情况 - 通过管道之后,使用
grep ESTABLISHED
对已经建立连接正在通信的服务器进行过滤 - 通过管道之后,使用
awk -F " " '{print $5}'
命令将IP加端口分割出来- 为什么这里不使用cut
- 因为cut不能使用空格
- 对于
awk -F " "
来说表示将每一行由空格进行分割,就算有多个空格按一个来算。 'print $5'
表示将第五部分——IP加端口分割出来
- 通过管道之后,使用
cut -d ':' -f 1
将每一行的IP与端口分割开,取出IP - 通过管道之后,进行sort排序
- 通过管道之后,使用
uniq -c
进行计数 - 通过管道之后,使用
sort -nr
将计数结果从大到小排序
3、如忘记了mysql5.7 数据库的ROOT 用户的密码,如何找回? (滴滴)
首先修改MySQL的配置文件/etc/mt.cnf,使mysql登陆时不使用权限表进行登陆——即:可以进行空密码进入mysql
1
vim /etc/mt.cnf
在mysqld当中添加一行
1
2# 使mysql登陆时不使用权限表进行登陆
skip-grant-tables修改完成之后需要重启一下mysqld服务
1
service mysqld restart
这时候就可以空密码进入mysql,在mysql当中的,有一个mysql数据库,当中有一个user表,用来保存一些mysql用户的数据,修改当中的
authentication_string
字段1
2
3
4
5
6
7
8
9show databases;
use mysql;
show tables;
desc user;
update user set authentication_string=password("mysql") where user = 'root';在修改
authentication_string
字段之后,需要刷新一下权限1
flush privileges;
退出mysql服务,进入MySQL的配置文件/etc/mt.cnf,将之前的修改的地方注释掉
注:如果为mysql8版本的数据库,要先设置为空密码,再alter user ‘root’@’%’ identified by ‘新密码’;
4、写出指令:统计ip 访问情况,要求分析nginx 访问日志(access.log),找出访问页面数量在前2位的ip(美团)
答:
1 | cat access.log | awk -F " " '{print $1}' | sort | uniq -c | sort -nr | head -2 |
解析:
- 最后的
head -2
表示取出管道筛选出来的前两条数据
5、使用tcpdump 监听本机, 将来自ip 192.168.200.1,tcp 端口为22 的数据,保存输出到tcpdump.log , 用做将来数据分析(美团)
答:
1 | tcpdump -i ens33 host 192.168.200.1 and port 22 >> /var/tcpdump.log |
前提:需要在当前的Linux中安装tcpdump
6、常用的Nginx 模块,用来做什么(头条)
答:
- rewrite 模块:实现重写功能
- access 模块:来源控制
- ssl 模块:安全加密
- ngx_http_gzip_module:网络传输压缩模块
- ngx_http_proxy_module:模块实现代理
- ngx_http_upstream_module:模块实现定义后端服务器列表
- ngx_cache_purge:实现缓存清除功能
7、如果你是系统管理员,在进行Linux 系统权限划分时,应考虑哪些因素?(腾讯)
答:
首先阐述Linux 权限的主要对象
根据自己实际经验谈考虑因素
- 注意权限分离,比如:工作中,Linux 系统权限和数据库权限不要在同一个部门
- 权限最小原则(即:在满足使用的情况下最少优先)
- 减少使用root 用户,尽量用普通用户+sudo 提权进行日常操作。
- 重要的系统文件,比如/etc/passwd, /etc/shadow etc/fstab,/etc/sudoers 等,日常建议使chattr(change attribute)锁定,需要操作时再打开。
- 演示比如:锁定/etc/passwd 让任何用户都不能随意useradd,除非解除锁定
- 注意:锁定的时候要小心,不要锁定了那些系统运行需要的文件,别锁定一个文件之后,系统都运行不了
- 使用SUID, SGID, Sticky 设置特殊权限。
- 可以利用工具,比如chkrootkit/rootkit hunter 检测rootkit 脚本(rootkit 是入侵者使用工具,在不察觉的建立了入侵系统途径)
- 利用工具Tripwire 检测文件系统完整性
1、权限分离
工作中,Linux 系统权限和数据库权限不要在同一个部门。这样可以保证一定的安全性
2、权限最小原则
在满足使用的情况下最少优先。
如:
- 如果tom用户在一个项目当中实现的是订单模块,那么就只需让他在订单模块文件中进行修改和提交,
- 不要跑到其他模块,如用户模块当中。不给他其它模块的相关权限(最高给一个读的权限)
3、chattr
chattr(change attribute)可以锁定一些重要的文件,在解锁之前,就算是root用户也没有操作权限,需要操作时再打开。
使用:
1 | # 锁定 |
演示:
对/etc/passwd文件进行锁定,这样就算是root也不能添加用户了
当然,如果黑客拿到了root权限,那么他可以先使用
chattr -i
进行解锁,在进行用户添加操作
改进:移动chattr命令的位置
这样,就算黑客使用chattr命令的话就会报错
但是,黑客可以使用
find / -name chattr
命令在全盘当中查找chattr命令的位置
改进:在移动chattr命令的位置的基础上,再修改chattr命令的名称——重命名
这样一来,就算黑客全盘搜索chattr命令也搜索不到
注:以上操作需要操作者自己记住自己修改过的东西,忘了就完了
怎么解除锁定?反方向执行一遍
4、chkrootkit
chkrootkit可以去扫描一些敏感和危险的文件,看看有没有被感染(入侵)
下载:
1 | wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz |
目录:
使用c语言编写的
使用:
8、权限操作思考题
(1)用户tom 对目录/home/test 有执行x 和读r 写w 权限,/home/test/hello.java 是只读文件,问tom 对hello.java 文件能读吗? 能修改吗?能删除吗?
答:
- tom 对hello.java 文件可以读,
- 由于hello.java 是只读文件,所以不可以修改,
- 由于yom对目录/home/test 有写w 权限,所以tom对hello.java可以删除
(2)用户tom 对目录/home/test 只有读写权限,/home/test/hello.java 是只读文件,问tom 对hello.java 文件能读吗? 能修改吗?能删除吗?
答:
- 由于tom 对目录/home/test没有执行的权限,所以tom对hello.java 文件不可以读、修改和删除
(3)用户tom 对目录/home/test 只有执行权限x,/home/test/hello.java 是只读文件,问tom 对hello.java 文件能读吗)?能修改吗?能删除吗?
答:
- tom 对hello.java 文件可以读,
- 由于hello.java 是只读文件,所以不可以修改,
- 由于yom对目录/home/test 没有写w 权限,所以tom不可以删除hello.java
(4)用户tom 对目录/home/test 只有执行x和写w权限,/home/test/hello.java 是只读文件,问tom 对hello.java 文件能读吗? 能修改吗?能删除吗?
答
- tom 对hello.java 文件可以读,
- 由于hello.java 是只读文件,所以不可以修改,
- 由于yom对目录/home/test 有写w 权限,所以tom对hello.java可以删除
9、说明Centos7 启动流程,并说明和CentOS6 相同和不同的地方
答:
先看两张图,对照图来分析
- 第一步、硬件启动阶段
- 这一步和CentOS6差不多,详细请看图
- 第二步、GRUB2引导阶段
- 从这一步开始,CentOS6和CentOS7的启动流程区别开始展现出来了。
- CentOS7的主引导程序使用的是grub2。
- 这一步的流程:
- 显示加载两个镜像,
- 再加载MOD模块文件,
- 把grub2程序加载执行,
- 接着解析配置文件/boot/grub2/grub.cfg,根据配置文件加载内核镜像到内存,
- 之后构建虚拟根文件系统,
- 最后转到内核。
- 在这里grub.cfg配置文件已经比较复杂了,但并不用担心,到了CentOS7中一般是使用命令进行配置,而不直接去修改配置文件了。不过我们可以看到grub.cfg配置文件开头注释部分说明了由/etc/grub.d/目录下文件和/etc/default/grub文件组成。
- 一般修改好配置后都需要使用命令
grub2-mkconfig -o /boot/grub2/grub.cfg
,将配置文件重新生成。
- 从这一步开始,CentOS6和CentOS7的启动流程区别开始展现出来了。
- 第三步、内核引导阶段
- 这一步与CentOS6也差不多,加载驱动,切换到真正的根文件系统,
- 唯一不同的是执行的初始化程序变成了/usr/lib/systemd/systemd
- 第四步、systemed初始化阶段(又叫系统初始化阶段)
- CentOS7中我们的初始化进程变为了systemd。执行默认target配置文件/etc/systemd/system/default.target(这是一个软链接,与默认运行级别有关)。
- 然后执行sysinit.target来初始化系统和basic.target来准备操作系统。
- 接着启动multi-user.target下的本机与服务器服务,并检查/etc/rc.d/rc.local文件是否有用户自定义脚本需要启动。
- 最后执行multi-user下的getty.target及登录服务,检查default.target是否有其他的服务需要启动。
- 注意:
- /etc/systemd/system/default.target指向了/lib/systemd/system/目录下的graphical.target或multiuser.target。
- 而graphical.target依赖multiuser.target,multiuser.target依赖basic.target,basic.target依赖sysinit.target,所以倒过来执行
System概述(了解):systemd即为system daemon,是Linux下的一种init软件,开发目标是提供更优秀的框架以表示系统服务间的以来关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell系统开销的效果,最终代替现在常用的System V与BSD风格的init程序。
与多数发行版使用的System V风格的init相比,systemd采用了以下的新技术:
- 采用Socket激活式与总线激活式服务,以提高相互依赖的各服务的并行运行性能;
- 用Cgroup代替PID来追踪进程,即使是两次fork之后生成的守护进程也不会脱离systemd的控制。
unit对象:unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其他与init相关的信息。(也就是CentOS6中的服务器启动脚本)
10、列举Linux 高级命令,至少6 个(百度)
答:
netstat
:网络状态监控top
:系统运行状态lsblk
:查看硬盘分区find
:查找ps -aux
:查看运行进程chkconfig
:查看服务启动状态systemctl
:管理系统服务器
11、Linux 查看内存、io 读写、磁盘存储、端口占用、进程查看命令是什么?(瓜子)
答:
top
:Linux 查看内存iotop
:Linux 查看 io 读写df -lh
:Linux 查看磁盘存储netstat -tunlp
:Linux 查看端口占用ps -aux | grep 关心的进程
:Linux 查看进程
12、使用Linux 命令计算t2.txt 第二列的和并输出(美团)
1 | 张三 40 |
答:
1 | cat t2.txt | awk -F " " '{sum+=$2}' END '{print sum}' |
13、Shell 脚本里如何检查一个文件是否存在?并给出提示(百度)
答:
1 | if [ -f 文件名 ] |
14、用shell 写一个脚本,对文本t3.txt 中无序的一列数字排序, 并将总和输出(百度)
1 | 9 |
答:
1 | cat t3.txt | sort -nr | awk '{sum+=$0;print $0}' END '{print "和="sum}' |
15、请用指令写出查找当前文件夹(/home)下所有的文本文件内容中包含有字符“cat”的文件名称(金山)
答:
1 | grep -r "cat" /home | cut -d ":" -f 1 |
16、请写出统计/home 目录下所有文件个数和所有文件总行数的指令(在金山面试题扩展)
答:
1 | find /home -name "*.*" | wc -l |
17、列出你了解的web 服务器负载架构(滴滴)
答:
- Nginx
- Haproxy
- Keepalived
- LVS
18、每天晚上10 点30 分,打包站点目录/var/spool/mail 备份到/home 目录下(每次备份按时间生成不同的备份包比如按照年月日时分秒)(滴滴)
答:
shell脚本:
1 | !/bin/bash |
使用crond进行定时任务设置:
1 | crontab -e |
1 | 30 22 * * * /root/mail.sh |
19、如何优化Linux 系统, 说出你的方法(瓜子)
对Linux 的架构的优化和原则分析
几个考虑的因素:
- 网络速度
- 磁盘IO速度
- 文件连接数
- 安全性
- 防火墙的设置
- 内存的设置
对linux 系统本身的优化-规则
- 不用root,使用 sudo 提示权限。
- 定时的自动更新服务时间
- 使用
nptdate npt1.aliyun.com
,让croud 定时更新
- 使用
- 配置yum 源,指向国内镜像(清华,163)
- 配置合理的防火墙策略,打开必要的端口,关闭不必要的端口
- 打开最大文件数(调整文件的描述的数量)
vim /etc/profile ulimit -SHn 65535
- 配置合理的监控策略
- 配置合理的系统重要文件的备份策略
- 对安装的软件进行优化,比如nginx ,apache
- 内核参数进行优化/etc/sysctl.conf
- 锁定一些重要的系统文件
chattr +i /etc/passwd /ect/shadow /etc/inittab
- 禁用不必要的服务
setup
ntsysv
0、补充知识
1、虚拟机相关——CentOS
1、CentOS 安装难点-网络连接方式理解
- 桥接模式:虚拟机可以直接与外部主机进行通信,占用网段的实际IP地址。
- 即:张三的虚拟系统Linux可以与李四的主机直接通信(双方)
- 即:当前网段有200个IP,如果每一个计算机都使用桥接模式创建虚拟机的话,每一个虚拟机占用的也是当前网段的实际IP,即200个IP
- 那么一起一共400个IP超过了255个(实际上除去一个全0和一个全1只有254个)
- 总结:在本机的环境中占用一个ip地址,如果本机的环境有多个设备,可能会造成ip不够用的情况
- NAT模式:虚拟机自己会生成一个新的网段的IP,在虚拟机生成的网段下,主机也会生成一个与之对应的IP,相当于主机和虚拟机构成了一个新的局域网。虚拟机可以通过主机在原本网段的IP对外进行通信(间接),但是外部的主机不能直接与虚拟机进行通信。
- 即:不会占用当前网段的IP地址
- 即:王五的虚拟系统Linux可以与李四的主机进行通信,通过王五主机IP作为对外通信的IP
- 但是李四的主机不能与王五的虚拟系统Linux进行通信——单方面的通信
- 总结:借用本机的ip与外界进行单方面通信——只能你访问别人,就是别人不能访问你
- 主机模式:不与外界发生联系
2、用户密码的生成
如果只是用来进行简单测试用的虚拟机,用户余密码可以进行简单的设置。
但是在生产环境当中,一般虚拟机不会使用root这个根用户,root也不会出现在用户列表当中让你选择。一般使用的是有一定权限限制的用户进行虚拟机的操作。而且密码的设置也是要很复杂的,以下网站可以帮你生成复杂密码
生成复杂密码:https://suijimimashengcheng.51240.com/
生成之后就用自己的密码本记录下来,防止记不住。
3、虚拟机克隆
如果你已经安装了一台 linux 操作系统,你还想再更多的,没有必要再重新安装,你只需要克隆就可
以。克隆方法:
- 方式1:直接拷贝一份安装好的虚拟机文件,然后在VM当中打开文件名为vmx为后缀的文件就行了
- 方式2:使用vmware 的克隆操作,注意, 克隆时,需要先关闭linux 系统
- 克隆生成的VM文件不仅可以在当前的计算机通过VM进行运行,也可以将VM文件拷贝到另外一台计算机里面,使用VM也可以进行运行
- 克隆产生的两份虚拟机完全一样,不仅里面的内容完全一样,而且年用户余密码也是一样的
- 可以用来快速搭建集群
4、虚拟机快照
如果你在使用虚拟机系统的时候(比如linux),你想回到原先的某一个状态,也就是说你担心可能有些误操作造成系
统异常,需要回到原先某个正常运行的状态,vmware 也提供了这样的功能,就叫快照管理。
应用实例
- 安装好系统以后,先做一个快照A
- 进入到系统。创建一个文件夹,再保存一个快照B
- 回到系统刚刚安装好的状态,即快照A
- 试试看,是否还能再次回到快照B
5、vmtools
1、介绍
- vmtools 安装后,可以让我们在windows 下更好的管理vm 虚拟机
- 可以设置windows 和centos 的共享文件夹
2、安装vmtools 的步骤
进入centos
点击vm 菜单的 -> install vmware tools
centos 会出现一个vm 的安装包——xx.tar.gz
拷贝到/opt
使用解压命令tar,得到一个安装文件
1
2
3# 进入到 opt 目录
cd /opt
tar -zxvf xx.tar.gz进入该vm 解压的目录/opt 目录下
1
cd vmware...
安装./vmware-install.pl
全部使用默认设置即可,就可以安装成功
注意:安装vmtools 需要有gcc
1
gcc -v
3、设置共享文件夹
1、基本介绍
为了方便,可以windows上创建一个共享文件夹,比如d:/myshare
2、具体步骤
菜单->vm->setting,如图设置即可。注意:设置选项为
always enable
,这样可以读写了windows 和centos 可共享d:/myshare 目录可以读写文件了
共享文件夹在centos 的/mnt/hgfs/ 下
注意事项和细节说明
- windows 和contos 就可以共享文件了,但是在实际开发中,文件的上传下载是需要使用远程方式完成的