linux操作系统

image-20240521151621611

第一章 初识LINUX

1.1 虚拟机

  • 什么是虚拟机?

    借助虚拟化技术,我们可以在系统中,通过软件:模拟计算机硬件,并给虚拟硬件安装真实的操作系统。这样就可以在电脑中,虚拟出一个出来的完整电脑。

image-20240521160402098

1.2 VMmare Workstation 安装

  • 安装步骤跳过

image-20240521184957221

  • 检查虚拟网卡(win+R 输入ncpa.cpl)

image-20240521185053960

1.3 vm安装centos7

  1. 创建新的虚拟机
  2. 简易安装向导
  3. 选择安装程序光盘映像
  4. 设置用户名密码
  5. 设置虚拟机名称和位置
  6. 指定磁盘容量大小

image-20240521192735117

  1. 启动虚拟机

image-20240521194114204

image-20240521194233871

1.4远程连接LINUX

  1. 操作系统的使用形式
  • 图形化界面
  • 命令行方式
  1. FinalShell

我们使用VMware可以得到Linux虚拟机,但是在VMware中操作Linux的命令行页面不太方便,主要是:

  • 内容的复制、粘贴跨越VMware不方便

  • 文件的上传、下载跨越VMware不方便

  • 也就是和Linux系统的各类交互,跨越VMware不方便

我们可以通过第三方软件,FinalShell, 远程连接到Linux操作系统之上。

  1. 安装finalshell(步骤省略)

image-20240521201547820

  1. FinalShell连接Linux
  • 虚拟机命令行输入ifconfig找到IP地址:

image-20240521202253864

  • finalshell中输入ip、用户名和密码连接linux

image-20240521202648883

1.5 WSL(Windows Subsystem for Linux)

  1. 为什么使用wsl?

WSL作为Windows10系统带来的全新特性,正在逐步颠覆开发人员既有的选择。

  • 传统方式获取Linux操作系统环境,是安装完整的虚拟机,如VMware.
  • 使用WSL,可以以非常轻量化的方式,得到Linux系统环境

目前,开发者正在逐步抛弃以虚拟机的形式获取Linux系统环境,而在逐步拥抱WSL环境。

所以,为什么要用WSL,其实很简单:

  • 开发人员都在用,大家都用的,我们也要学习
  • 实在是太方便了,简单、好用、轻量化、省内存
  1. 什么是wsl

WSL: Windows Subsystem for Linux,是用于Windows系统之上的Linux子系统。

作用很简单,可以在Windows系统 中获得Linux系统环境,并完全直连计算机硬件,无需通过虚拟机虚拟硬件

  1. wsl部署

控制面板==》程序==》程序和功能==》启用和关闭windows功能

image-20240521204922604

微软商店下载Ubuntu,安装完成设置用户名和密码:

image-20240523185405413

安装windows Terminal:

image-20240523193719582

1.6 虚拟机快照

VMware,虚拟机( Workstation和Funsion)支持为虛拟机制作快照。
通过快照将当前虚拟机的状态保存下来,在以后可以通过快照恢复虚拟机到保存的状态。

相当于游戏存档

  • 在VMware Workstation PRO 中制作并还原快照

image-20240523195445512

还原快照:

image-20240523195718289


第二章 Linux基础命令

2.1 Linux目录结构

Linux的目录结构是一个树型结构
Windows系统可以拥有多个盘符,如C盘、D盘、E盘
Linux没有盘符这个概念,只有一个根目录/所有文件都在它下面.

image-20240523201720219

Linux路径描述方式

  • 在Linux系统中,路径之间的层级关系,使用/来表示
  • 在Windows系统中,路径之间的层级关系,使用:\来表示

2.2 Linux命令入门

2.2.1linux命令基础

  • 命令行:即Linux终端(Terminal),是一种命令提示符页面。以纯“字符”的形式操作系统,可以使用各种字符化命
    令对系统发出操作指令。

  • 命令:即Linux程序。一个命令就是一一个Linux的程序。命令没有图形化页面,可以在命令行(终端中)提供字符化的反馈。

Linux命令通用格式:
command [-options] [parameter]

command:命令本身

options:[可选] 命令的一些选项,可以通过选项控制命令的行为细节

parameter:[可选] 命令的参数,多用于命令的指向目标等

ls命令入门

ls命令语法细节:

ls [-a -l -h] Linux路径

  • -a -l -h是可选的选项
  • Linux路径 是此命令可选的参数

当不使用选项和参数,直接使用ls命令本体,表示:以平铺形式,列出当前工作目录下的内容

image-20240523204123703

  • ls命令的参数和选项
  • -a: all的意思,即列出全部文件(包含隐藏文件、文件夹)

image-20240523205223536

图中以.开头的,表示Linux系统的隐藏文件/文件夹(只要以.开头,就能自动隐藏)

  • -l:表示以列表(竖向排列)的形式展示内容,并展示更多信息

image-20240523205708763

选项可以组合使用,如:

  • ls -l -a
  • ls -la
  • ls -al

上述三种写法,表示同时应用-l 和 -a 的功能

除了选项本身可以组合使用以外,选项和参数也可以一起使用,如:

  • ls -al /

以上命令表示以列表形式展示根目录下全部文件

  • -h:表示以易于阅读的形式展示且必须和-l一起使用

image-20240523210949049

上图可以看出文件大小不只有数值,还带上了单位

2.2.2目录切换相关命令(cd/pwd)

cd命令

当Linux终端(命令行)打开的时候,会默认以用户的HOME目录作为当前的工作目录
我们可以通过cd命令,更改当前所在的工作目录。
cd命令来自英文: Change Directory

语法: cd [linux路径]

  • cd命令无需选项,只有参数,表示要切换到哪个目录下
  • cd命令直接执行,不写参数,表示回到用户的HOME目录

image-20240523212121641

pwd命令

通过ls来验证当前的工作目录,其实是不恰当的。
我们可以通过pwd命令,来查看当前所在的工作目录。
pwd命令来自: Print Work Directory

语法:pwd

  • pwd命令,无参数,无选项

image-20240523212512982

2.2.3 绝对路径、相对路径和特殊路径符

  • 绝对路径:以根目录为起点,描述路径的一种写法,路径描述以/开头

    cd /home/weisiyang/Desktop

image-20240523214139737

  • 相对路径:以当前目录为起点,描述路径的一种写法,无需以/开头

    cd Desktop

image-20240523214233772

  • 特殊路径符
  • .:表示当前目录,比如cd ./Desktop 表示切换到当前目录下的Desktop目录内,和cd Desktop效果一致
  • ..: 表示上一级目录,比如:cd .. 即可切换到上一级目录,cd ../.. 切换到上二级的目录
  • ~ :表示HOME目录,比如:cd ~ 即可切换到HOME目录或cd ~/Desktop,切换到HOME内的Desktop目录

2.2.4 mkdir命令

通过mkdir命令可以创建新的目录(文件夹)
mkdir来自英文: Make Directory

语法: mkdir [-p] linux路径

  • 参数必填,表示Linux路径,即要创建的文件夹的路径,相对路径或绝对路径均可
  • -p选项可选,表示自动创建不存在的父目录,适用于创建连续多层级的目录

image-20240523221007377

-p选项的使用:

image-20240523221349491

2.2.5 文件操作命令

touch命令

可以通过touch命令创建文件

语法:touch linux路径

touch命令无选项,参数必填,表示要创建的文件路径,相对、绝对、特殊路径符均可以使用

image-20240523222238090

cat命令

cat命令用于查看文件内容

语法:cat linux路径

cat同样没有选项,只有必填参数,参数表示:被查看的文件路径,相对、绝对、特殊路径符都可以使用

image-20240523222931714

more命令

more命令同样是用来查看文件内容的,但与cat不同的是

  • cat是直接将内容全部显示出来
  • more支持翻页,如果文件内容过多,可以一页页的展示

语法:more linux路径

同样没有选项,只有必填参数,参数表示:被查看的文件路径,相对、绝对、特殊路径符都可以使用

linux系统内置有一个文件,路径为:/etc/services,可以通过more命令查看

  • 查看过程中,空格翻页
  • q键退出

image-20240523223631747

cp命令

cp命令可以使用于复制文件、文件夹,cp命令来自英文单词copy

语法:cp [-r] 参数1 参数2

  • -r选项,可选,用于复制文件夹使用,表示递归
  • 参数1,Linux路径,表示被复制的文件或文件夹
  • 参数2,Linux路径,表示要复制去的地方

image-20240523224358635

mv命令

mv命令可以用于移动文件\文件夹,mv命令来自英文单词: move

语法:mv 参数1 参数2

  • 参数1, Linux路径,表示被移动的文件或文件夹
  • 参数2, Linux路径,表示要移动去的地方,如果目标不存在,则进行改名,确保目标存在

image-20240523225050003

rm命令

rm命令可用于删除文件、文件夹
rm命令来自英文单词: remove

语法:rm [-r -f] 参数1 参数2参数n

  • 同cp命令-样, -r选项用于删除文件夹

  • -f表示force,强制删除(不会弹出提示确认信息)

    • 普通用户删除内容不会弹出提示,只有root管理员用户删除内容会有提示
    • 所以一-般普通用户用不到-f选项
      参数1、参数2、…… 参数N表
  • 参数1、参数2….参数:要删除的文件或文件夹路径,按照空格隔开

image-20240523230008996

rm命令支持通配符*,用来模糊匹配

  • 符号*表示通配符,即匹配任意内容(包含空),示例:
    • test*, 表示匹配任何以test开头的内容
    • *test,表示匹配任何以test结尾的内容
    • *test*, 表示匹配任何包含test的内容

image-20240523230347820

which命令

我们在前面学习的Linux命令,其实它们的本体就是一个个的二进制可执行程序。
和Windows系统中的.exe文件,是一个意思。
我们可以通过which命令,查看所使用的- -系列命令的程序文件存放在哪里

语法:which 要查找的命令

image-20240531194029752

find命令

在Linux系统中,我们可以通过find命令去搜索指定的文件。

语法:find 起始路径 -name 被查找文件名

-iname 不区分大小写
-type 指定类型:d (目录) f(文件) l(软链接)
-mtime days:按修改时间查找,+days表示指定天数后,-days指定天数前
-ctime n:查找在 n*24 小时内状态发生变化的文件(例如权限)
-atime n:查找在 n*24 小时内被访问过的文件。

为了确保后续演示,拥有最大的权限,可以在整个系统完成搜索
我们可以切换到root用户以获得管理员权限
执行命令:

su - root

输入密码

image-20240531195320215

配合逻辑符使用

-or 或逻辑
-and 与逻辑
-not 非逻辑

使用-exec参数

1
2
find -name "*.txt" -exec rm {} \;
#查找txt文件并删除

语法: find 起始路径 -size +|-n[kMG]

  • +、-表示大于和小于
  • n表示大小数字
  • kMG表示大小单位,k(小写字母)表示kb, M表示MB, G表示GB .

image-20240531200302916

grep命令

可以通过grep命令,从文件中通过关键字过滤文件行。

语法:grep [-n -i -v] 关键字 文件路径

  • 选项-n,可选,表示在结果中显示匹配的行的行号。
  • i :忽略大小写
  • v:反向过滤
  • 参数,关键字,必填,表示过滤的关键字,带有空格或其它特殊符号,建议使用 ” ” 将关键字包围起来
  • 参数,文件路径,必填,表示要过滤内容的文件路径,可作为内容输入端口

先创建一个weisiyang.txt,输入内容用于测试:

image-20240531201516411

测试:

image-20240531202342868
目录递归搜索

  1. 递归搜源码函数定义:
    1
    grep -r "function" /project/src
  2. JS文件找console.log:
    1
    grep -r --include="*.js" "console.log" 文件目录(空默认当前目录)
    查找空行
    1
    grep -n -c "^$" /etc/my.cnf
    查找IP地址
    1
    grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" access.log
    查找并高亮
    1
    grep --color=auto "WARNING" system.log
    过滤不含注释行
    1
    grep -v "^#" /etc/test.log #不显示#开头的行
wc命令

可以通过wc命令统计文件的行数、单词数量等

语法:wc [-c -m -l -w] 文件路径

  • 选项,-c, 统计bytes数量
  • 选项,-m,统计字符数量
  • 选项,-l, 统计行数
  • 选项,-W,统计单词数量
  • 参数,文件路径,被统计的文件,可作为内容输入端口

不带参数选项,默认显示行数、单词数、byte数和文件名:

image-20240531203025186

带参数选项:

image-20240531203204416

管道符

符号:|

含义:将管道左边命令的结果,作为右边命令的输入

image-20240531203727174

如上图:

  • cat itheima.txt的输出结果(文件内容)
  • 作为右边grep命令的输入(被过滤文件)

嵌套使用:

image-20240531204624908

echo命令

echo命令可以在命令行内输出指定内容

语法: echo 输出内容

  • 无需选项,只有一个参数表示要输出的内容

image-20240531210804690

反引号 `

反引号(通常也称作飘号)与echo命令搭配可以将包裹的内容作为命令进行执行,而非普通字符

未使用反引号:

image-20240531211232501

使用反引号:
image-20240531211950446

注意:是`而不是

重定向符
  • >:将左侧命令的结果,覆盖写入到符号右侧指定的文件中
  • >>:将左侧命令的结果,追加写入到符号右侧指定的文件中

image-20240531212846844

tail命令

使用tail命令,可以查看文件尾部内容,跟踪文件的最新更改

语法:tail [-f -num] linux路径

  • 参数,Linux路径,表示被跟踪的文件路径
  • 选项,-f,表示持续跟踪(follow)
  • 选项, -num(整数不是单词),表示,查看尾部多少行,不填默认10行

image-20240602193921815

-f参数选项持续跟踪文件尾部内容的更改:

image-20240602194353977

sed命令
  1. 基础和特性
    sed工作原理:
    • 逐行处理文本:sed读取一行到模式空间,执行命令后输出
    • 流水线式编辑:像流水线一样对文本进行连续处理
    • 不直接修改原文:默认输出处理结果,不改变原文件内容

特性:支持正则表达式,可多操作组合,默认不修改原文件
动作:

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)(2a即第二行后插入)
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何东东;
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)(2i即第2行前插入);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦!
  1. 替换操作
1
2
3
4
5
6
sed 's/旧词/新词/' 文件名 #替换每行第一个匹配项
sed 's/旧词/新词/g' 文件名 #g表示全局替换
sed 's#旧路径#新路径#g' #替换路径分隔符
#条件替换
sed '/error/ s/error/ERROR/g' log.txt #行条件替换
sed '5,${/error/ s/error/ERROR/g}' log.txt #行范围替换:从第五行开始替换(5,$即5-最后一行)
  1. 以行为单位的新增/删除

    1
    2
    3
    4
    nl testfile | sed '2,5d'#删除2-5行,表示删除
    nl testfile | sed '2i drink tea'#第二行插入drink tea
    nl testfile | sed '2a Drink tea or ......\
    drink beer ?'#第二行新增两行文本,\表示换行
  2. 引用匹配内容

    1
    2
    3
    4
    5
    6
    #引用&或\1引用匹配内容
    #[0-9]+表示所有数字 [&] 表示将匹配到的字符加上[],&为匹配到的字符
    echo "123" abc "456" | sed 's/[0-9]\+/[&]/g'

    # 将yyyy-mm-dd(1-2-3) 改为mm-dd-yy(3-2-1)格式 旧字符:([0-9]{4})-([0-9]{2})-([0-9]{2}) 新字符:\3/-\2/-\1 其中/-为-转义字符
    sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3/-\2/-\1/'
  3. 搜寻并执行命令

    1
    2
    $ nl testfile | sed -n '/oo/{s/oo/kk/;p;q}'  
    #搜索 testfile,找到 oo 对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把 oo*替换为 kk,再输出这行,最后的q是退出。
  4. 追加内容(a:行后添加 i:行前追加)

    1
    2
    3
    4
    sed '/pattern/a \new line' file #在指定行后追加(可使用\换行,以多行追加)
    sed '$a \new line' file #在文件末尾添加
    sed '/pattern/i \new line' file
    sed 'pattern/i\\' file #插入空行
  5. 多条件处理
    -e 参数:- -e <脚本>或–expression=<脚本> 以选项中指定的script来处理输入的文本文件

    1
    sed -e 's/apple/苹果/g' -e 's/banana/香蕉/g' -e 's/car/车/g'#同时替换多个条件行

2.3 vi/vim编辑器

​ vi\vim是visual interface的简称,是Linux中最经典的文本编辑器
​ 同图形化界面中的文本编辑器一样, vi是命令行下对文本文件进行编辑的绝佳选择。
vim是vi的加强版本,兼容vi 的所有指令,不仅能编辑文本,而且还具有shell程序编辑的功能,可以不同颜色的字体来辨别语法的正确性,极大方便了程序的设计和编辑性

2.3.1 vi/vim三种工作方式

  • 命令方式(command mode)

    命令模式下,所敲的按键编辑器都理解为命令,以命令驱动执行不同的功能。
    此模式下,不能自由进行文本编辑。

  • 输入模式(insert mode)

    也就是所谓的编辑模式、插入模式。
    此模式下,可以对文件内容进行自由编辑。

  • 底线命令模式(last line mode)

    以:开始,通常用于文件的保存、退出。

image-20240602200011948

2.3.2 命令模式

  1. 终端命令行进入命令模式:

语法: vi /vim linux路径

  • 如果文件路径表示的文件不存在,那么此命令会用于编辑新文件
  • 如果文件路径表示的文件存在,那么此命令用于编辑已有文件
  1. 命令模式下有一般指令

移动光标:

命令 含义
gg 光标移动到文档头部
G 光标移动到文档尾部
ngg 光标移动到第n行头部
n+ 光标向下移动n行
n- 光标向上移动n行
0 光标移动到当前行行首
$ 光标移动到当前行行尾
w 光标移动到下一个字的开头
b 光标移动到上一个字的开头
fx 光标移动到当前行下一个字母x的位置
h 光标向左移动一个字符。等于方向键←
j 光标向下移动一个字符。等于方向键↓
k 光标向上移动一个字符。等于方向键↑
l 光标向右移动一个字符。等于方向键→

复制粘贴:

命令 含义
yy 复制当前行
nyy 复制当前行以及下面的n-1行
p 粘贴

删除:

命令 含义
x 删除光标后一个字符
X 删除光标前一个字符
nx 删除光标后n个字符
nX 删除光标前n个字符
d0 从光标处删除到行首(delete)
d$ 从光标处删除到行尾
dG 从光标当前行开始,向下全部删除
dgg 从光标当前行开始,向上全部删除
dd 删除光标所在行
ndd 删除光标所在行以及后面n-1行

撤销:

命令 含义
u 撤销上一步操作
  1. 命令模式进入编辑模式:
命令 含义
i 光标前插入
a 光标后插入
I 光标当前行头部插入
A 光标当前行结尾插入
o 光标下一行插入
O 光标上一行插入

2.3.3 底线命令模式

搜索查找:

命令 模式
/ 进入搜索模式
/str 从光标处向文件尾部搜索,查找str字符串
?str 从光标处向文件首部搜索,查找str字符串
n 向下继续搜索(next)
N 向上继续搜索

替换:

命令 含义
:s/str1/str2/g 将当前行中所有str1,均用str2替换
:s/str1/str2/gc 将当前行中所有str1,均用str2替换,需要确认
:%s/str1/str2/g 将文件中所有str1,均用str2替换
:%s/str1/str2/gc 将文件中所有str1,均用str2替换,需要确认

退出和其他:

命令 含义
:q 退出(quit)
:q! 强制退出
:wq 保存文件并退出
:w 将更改内容写入文件
:set nu 显示行号
:set paste 设置粘贴模式

第三章 Linux用户和权限

3.1认知root用户

无论是Windows. MacOS、Linux均采用多用户的管理模式进行权限管理。

  • 在Linux系统中,拥有最大权限的账户名为:root(超级管理员)

  • 而在前期,我们一直使用的账户是普通的用户: weisiyang

su命令exit命令

su命令就是用于账户切换的系统命令,其来源英文单词: Switch User

语法:su [-] [用户名]

  • - 符号是可选的,表示是否在切换用户后加载环境变量
  • 参数:用户名,表示要切换的用户,用户名也可以省略,省略表示切换到root
  • 切换用户后,可以通过exit命令退回上一个用户,也可以使用快捷键:ctrl + d
sudo命令

我们可以使用sudo命令,为普通的命令授权,临时以root身份执行。

语法:sudo 其他命令

  • 在其它命令之前,带上sudo,即可为这一条命令临时赋予root授权
  • 但是并不是所有的用户,都有权利使用sudo,我们需要为普通用户配置sudo认证

为普通用户配置sudo认证

  • 切换到root用户,执行visudo命令,会自动通过vi编辑器打开: /etc/sudoers

  • 在文件末尾添加:

  • 用户名 ALL=(ALL) ALL

  • 用户名 ALL=(ALL) NOPASSWD :ALL

image-20240629192153779

  • :wq保存

3.2 用户、用户组管理

  • 用户、用户组

Linux系统中:

  • 可以配置多个用户
  • 可以配置多个用户组
  • 用户可以加入多个用户组中

Linux中关于权限的管控级别有2个级别,分别是:

  • 针对用户的权限控制
  • 针对用户组的权限控制
用户组管理

1.创建用户组

语法: groupadd 用户组名

2.删除用户组

语法:groupdel 用户组名

用户管理

1.创建用户

语法:useradd [-g -d] 用户名

  • 选项: -g指定用户的组,不指定-g, 会创建同名组并自动加入,指定-g需要组已经存在,如已存在同名组,必须使用-g
  • 选项: -d指定用户HOME路径, 不指定,HOME目录默认在: /home/用户名

image-20240629214636861

image-20240629214844751

2.删除用户

语法:userdel [-r] 用户名

选项: -r, 删除用户的HOME目录,不使用-r,删除用户时,HOME目录保留

image-20240629215058920

3.查看用户所属组

语法:id [用户名]

参数:用户名,被查看的用户,如果不提供则查看自身

image-20240629215250677

image-20240629215326378

4.修改用户所属组

语法:usermod -aG 用户组 用户名

将指定用户加入指定用户组

image-20240629215840994

5.修改用户密码
语法 passwd [-l -u -e] [username]

-l :lock 锁定账户
-u :ulock 解锁账户
-e :强制下次用户登录时修改密码
usename :要修改的用户

6.设置用户密码过期时间
语法:chage [-l -E ] [date] [username]

-l :查看最近账户改密情况
-E :账户过期时间
date:过期时间

  • getent命令

gentent命令可以查看当前系统中有哪些用户

语法:getent passwd

image-20240629220235029

上图中:密码(x):用户id组id:描述信息:HOME目录:执行终端(默认bash)

gentent也可以查看系统中的用户组

语法:getent group

image-20240629220727106

上图中:组名称:组认证(显示为x):组id

3.3查看权限控制

  • 认知权限信息

image-20240629221108120

第一列:表示文件、文件夹的权限控制信息

第三列:表示文件、文件夹所属用户

第四列:表示文件、文件夹所属用户组

image-20240629221623856

权限细节分为10位:

第1位:-dl:分别表示文件、文件夹、软链接

第2-4位(用户权限):r-,w-,x-

第5-7位(用户组权限):r-,w-,x-

第8-10位(其他用户权限):r-,w-,x-

image-20240629223006062

3.4修改权限控制

chmod命令

只有文件、文件夹的所属用户或root用户可以修改。

语法:chmod [-R] u=权限,g=权限,o=权限 文件或文件夹

选项:-R,对文件夹内的全部内容应用同样的操作

image-20240629223754886

权限的数字序列

权限可以用3位数字来代表,第一位数字表示用户权限,第二位表示用户组权限,第三位表示其它用户权限。

数字 含义 原表示
0 (000) 无权限
1 (001) 有x权限 –x
2 (010) 有w权限 -w-
3 (011) 有w和x权限 -wx
4 (100) 有r权限 r–
5 (101) 有r和x权限 r-x
6 (110) 有r和w权限 rw-
7 (111) 有全部权限 rwx
chown命令

使用chown命令,可以修改文件、文件夹的所属用户和用户组,需要root权限

语法:chown [-R] [用户] [:] [用户组] 文件或文件夹

  • 选项, -R,同chmod,对文件夹内全部内容应用相同规则
  • 选项,用户,修改所属用户
  • 选项,用户组,修改所属用户组
  • :用于分隔用户和用户组

image-20240629231322800

第四章 linux实用操作

4.1快捷键

ctrl + c 强制停止

强制停止某些程序的运行

命令输入错误,退出当前输入

ctrl + d 退出或登出

退出账户的登录

退出某些程序的专属页面

历史命令搜索

1.history:

可以通过history命令查看历史输入过的命令

image-20240630193826598

  1. !+命令部分前缀:

可以自动匹配符合前缀的最近执行过的命令

image-20240630194432974

3.ctrl + r ,输入内容:

使用输入的内容去匹配历史命令

  • 回车键可以直接执行
  • 键盘左右键,可以得到此命令(不执行)

image-20240630195437026

  • 光标移动
快捷键 含义
ctrl+a 光标移动到开头
ctrl+e 光标移动到结尾
ctrl+ 向左移动一个单词
ctrl+ 向右移动一个单词
  • 清屏

1.快捷键ctrl+l

2.命令clear

4.2软件安装

操作系统的两种安装软件的方法:

1.通过下载安装包自行安装

2.系统的应用商店安装

  • yum软件安装(for centos)

yum: RPM包软件管理器,用于自动化安装配置Linux软件,并可以自动解决依赖问题。

语法:yum [-y] [install | remove | search] 软件名称

  • 选项:-y,自动确认,无需手动确认安装或卸载过程
  • install:安装
  • remove:卸载
  • search:搜索

安装:

image-20240630202437189

卸载:

image-20240630202517485

查找:

image-20240630202719878

  • apt软件安装(for ubuntu)

ubuntu系统软件安装包为.deb文件,使用apt进行包管理

语法:apt [-y] [install | remove | search] 软件名称

安装:

image-20240630205239770

4.3 systemctl命令

Linux系统很多软件(内置或第三方)均支持使用systemctl命令控制:启动、停止、开机自启.
能够被systemctl管理的软件,一般也称之为:服务

语法:systemctl start | stop | status | enable | disable 服务名

  • start:启动
  • stop:停止
  • status:状态查看
  • enable:开启开机自启动
  • disable:关闭开机自启动

系统内置服务,如:

  • NetworkManager,主网络服务
  • network,副网络服务
  • firewalld,防火墙服务
  • sshd, ssh服务( FinalShell远程登录Linux使用的就是这个服务)

image-20240630205740801

4.4软链接

在系统中创建软链接,可以将文件、文件夹链接到其它位置。
类似Windows系统中的快捷方式.

语法:ln -s 参数1 参数2

  • -s选项,创建软连接
  • 参数1:被链接的文件或文件夹
  • 参数2:要链接去的目的地

image-20240630210933385

4.5日期、时区

  • date命令

通过date命令可以在命令行中查看系统的时间

语法:date [-d] [+格式化字符串]

  • -d按照给定的字符串显示日期, -般用于日期计算
  • 格式化字符串:通过特定的字符串标记,来控制显示的日期格式
    • %Y
    • %y 年份后两位数字(00….99)
    • %m 月 份(01….12)
    • %d 日 (01…..31)
    • %H 小时(00…..23)
    • %M 分钟(00……59)
    • %S 秒(00…..60)
    • %s 自1970-01-01 00000UTC到现在的秒数

image-20240630213050357

-d选项的使用:

时间标记:

  • year
  • month
  • day
  • hour
  • minute
  • second

image-20240630213453229

  • 修改Linux时区

1.删除etc/localtime

2.创建新的软链接,将/usr/zoneinfo/Asia/Shanghai软链接到/etc/localtime

image-20240630214117736

  • ntp程序

ntp程序可以自动校准时间

安装程序并设置开机自启动即可

手动校准:

语法:ntpdate -u ntp服务器

image-20240630215135527

  • chrony程序
    Chrony是一个用来同步计算机系统时钟的网络时间协议(NTP)客户端和服务器。它适用于各种网络环境,尤其是在时钟精度要求较高且网络连接不稳定的情况下。
  • chronyd:这是一个后台守护进程,负责时间同步任务。
  • chronyc:这是一个命令行界面工具,用户可以通过它与chronyd通信,监控和配置时间同步。

语法:chronyc tracking

查看chrony服务器状态
image.png

语法:chronyc sources

查看同步用的ntp时间服务器

image.png

4.6IP地址、主机名

  • 查看本机IP地址

IP地址:IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异

语法:ifconfigipconfig

image-20240630215707609

  • 主机名

每一台电脑除了对外联络地址(IP地址)以外,也可以有一-个名字,称之为主机名
无论是Windows或Linux系统,都可以给系统设置主机名

  1. 查看主机名

语法:hostname

image-20240630215952430

  1. 修改主机名

语法:hostnamectl set-hostname 主机名 新主机名

image-20240630220559481

  • 虚拟机配置固定IP地址

1.vmware中配置IP地址和网段

编辑==>虚拟网路编辑器==>更改设置==>选择vmnet8并修改IP地址和网段==>nat设置==>设置网关==>确定应用

image-20240701231748520

image-20240701231918438

image-20240701233948406

2.Linux中修改固定IP

使用vim编辑etc/sysconfig/network-scripts/ifcfg-ens33

编辑结果如下:

image-20240701233535181

然后使用systemctl restart network重启网络,修改ssh连接配置并连接:

image-20240701233716737

image-20240701234328361

  • 纯命令行
    1
    2
    3
    4
    5
    nmcli connect mod ens33 ipv4.address 192.168.16.100/24
    nmcli connect mod ens33 ipv4.gateway 192.168.16.1
    nmcli connect mod ens33 ipv4.dns 223.5.5.5
    nmcli connect mod ens33 ipv4.method manual
    nmcli connect down ens33 && nmcil connect up ens33

4.7网络传输

  • ping命令

可以通过ping命令,检查指定的网络服务器是否是可联通状态

语法:ping [-c num] ip或主机名

  • 选项: -C,检查的次数,不使用-C选项,将无限次数持续检查
  • 参数:ip或主机名,被检查的服务器的ip地址或主机名地址

image-20240701234813434

  • wget命令

wget是非交互式的文件下载器,可以在命令行内下载网络文件

语法:wget [-b] url

  • 选项:-b,可选,(backend)后台下载,会将日志写入
  • 当前工作目录的wget-log文件
    参数:url,’下载链接
  • curl命令

curl可以发送http网络请求,可用于:下载文件、获取信息等

语法:curl [-O] url

  • 选项:-O,用于下载文件,当url是下载链接时,可以使用此选项保存文件
  • 参数:url,要发起请求的网络地址

image-20240701235512804

  • 端口

端口,是设备与外界通讯交流的出入口。端口可以分为:物理端口和虛拟端口两类

  • 物理端口:又可称之为接口,是可见的端口,如USB接口, RJ45网口, HDMI端口
  • 虚拟端口:是指计算机内部的端口,是不可见的,是用来操作系统和外部进行交互使用的

查看端口占用

  1. 查看IP的端口占用

使用yum安装nmap

命令: nmap 被查看的ip

image-20240702001615674

  1. 查看指定端口占用

安装net-tools

命令:netstat -anp | grep 端口号

image-20240702002846319

4.8进程管理

  • 进程

程序运行在操作系统中,是被操作系统所管理的。.
为管理运行的程序,每一个程序在运行的时候,便被操作系统注册为系统中的一个:进程
并会为每一个进程都分配一一个独有的:进程ID (进程号)

  • 进程状态:
    1.运行态 Running
    2.睡眠态 Sleeping
    3.僵尸态 Zombiz
    4.停止态 Stopped

  • 查看进程

可以通过ps命令查看Linux系统中的进程信息

语法:ps [-e -f]

  • 选项: -e,显示出全部的进程
  • 选项: -f,以完全格式化的形式展示信息(展示全部信息)

一般来说,固定用法就是: ps -ef列出全部进程的全部信息

image-20240702214523291

  • UID:进程所属的用户ID
  • PID:进程的进程号ID
  • PPID:进程的父ID(启动此进程的其它进程)
  • C:此进程的CPU占用率(百分比)
  • STIME:进程的启动时间
  • TTY:启动此进程的终端序号,如显示?,表示非终端启动
  • TIME:进程占用CPU时间
  • CMD:进程对应的名称或启动路径或启动命令
  • 管道符过滤查看指定进程

语法: ps [-e -f] | grep 指定进程或名称

image-20240702215500140

  • 查找进程pid

语法:pgrep [进程名称]

根据进程名称查找pid号

  • 树状显示进程

语法:pstree [进程名称]

树状显示进程

  • 不挂起守护进程

语法:nohup Command [ Arg … ] [&]

nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。

  • 关闭进程

语法:kill [-9] 进程id

选项: -9,表示强制关闭进程。不使用此选项会向进程发送信号要求其关闭,但是否关闭看进程自身的处理机制。

image-20240702215839471

4.9 主机状态

  • 查看系统资源占用

可以通过top命令查看CPU、内存使用情况,类似Windows的任务管理器
默认每5秒刷新一次,

语法:top [-p | -d | -c | -n | -b | -i | -u]

  • -p只显示某个进程的信息
  • -d 设置刷新时间,默认是5s
  • -c显示产生进程的完整命令,默认是进程名
  • -n 指定刷新次数,比如top -n 3,刷新输出3次后退出
  • -b 以非交互非全屏模式运行,以批次的方式执行top,一般配合-n指定输出几次统计信息,将输出重定向到指
    定文件,比如top -b -n 3 > /tmp/top. tmp
  • -i不显示任何闲置 (idle) 或无用(zombie) 的进程
  • -u查找特定用户 启动的进程

q ctrl+ c退出

image-20240702220501140

上图详解:

第一行:top:命令名称,22:00:45:当前系统时间,up 10:06:启动了10小时6分钟,2 user:2个用户登录,load :1、5、15分钟负载

第二行:Tasks:168个进程,1 runnning:一个进程在运行,167 sleeping:167个进程休眠,0个停止进程,0个僵尸进程

第三行:*%Cpu(s):cpu使用率,us*:用户cpu使用率,sy:系统cpu使用率,ni:高优先级进程占用cpu时间百分比,id:空闲cpu率,wa:IO等待cpu占用率,hi:cpu硬件中断率,si:cpu软件中断率,st:强制等待占用cpu率

第四、五行:

KiB Mem:物理内存,KiB Swap:虚拟内存(交换空间)

  • PID:进程id
  • USER:进程所属用户
  • PR:进程优先级,越小越高
  • NI:负值表示高优先级,正表示低优先级
  • VIRT:进程使用虚拟内存,单位KB
  • RES:进程使用物理内存,单位KB
  • SHR:进程使用共享内存,单位KB
  • S:进程状态(S休眠, R运行, Z僵死状态,N负数优先级, 1空闲状态)
  • %CPU:进程占用CPU率
  • %MEM:进程占用内存率.
  • TIME+:进程使用CPU时间总计,单位10毫秒
  • COMMAND:进程的命令或名称或程序文件路径

top交互式选项

按键 功能
h 显示帮助信息
c 显示产生进程完整命令
f 选择需要展示的信息列
M 根据驻留内存(RES)大小排序
P 根据CPU使用百分比大小排序
T 根据时间/累计时间进行排序
E 切换顶部内存显示单位
e 切换进程内存显示单位
l 切换显示平均负载和启动时间信息
i 不显示闲置或无用进程
t 切换显示CPU状态信息
m 切换显示内存信息
  • 磁盘信息监控

1.df命令查看硬盘的使用情况

语法: df [-h]

选项: -h,以更加人性化的单位显示

image-20240702224316354

2.iostat命令查看CPU、磁盘的相关信息

语法:iostat [-x] [num1] [num2]

-x:显示更多信息

num1:刷新间隔

num2:刷新次数

image-20240703001815091

  • 网络状态监控

可以使用sar命令查看网络的相关统计

语法:sar -n DEV num1 num2

-n:查看网络

DEV:查看网络接口

num1:刷新间隔

num2:刷新次数

image-20240703002408107

IFACE:本地网卡接口的名称出
rxpck/s:每秒钟接受的数据包
txpck/s:每秒钟发送的数据包
rxKB/S:每秒钟接受的数据包大小,单位为KB
txKB/S:每秒钟发送的数据包大小,单位为KB
rxcmp/s:每秒钟接受的压缩数据包
txcmp/s:每秒钟发送的压缩包
rxmcst/s:每秒钟接收的多播数据包

4.10环境变量

环境变量是操作系统(Windows.Linux、Mac)在运行的时候,记录的-些关键性信息,用以辅助系统运行。
在Linux系统中执行:env命令即可查看当前系统中记录的环境变量

image-20240703003500489

  • 环境变量PATH

image-20240703003755371

PATH记录了系统执行任何命令的搜索路径

上图记录了,执行命令时会在目录中搜索程序本体

/usr/local/bin

/usr/bin:/usr/local/sbin

/usr/sbin

/home/weisiyang/.local/bin

/home/weisiyang/bin

  • $ 符号

在Linux系统中,$符号被用于取”变量”的值。

如: echo $PATH

image-20240703005841795

  • 自行设置环境变量
  1. 临时设置

语法:export key (变量名)= value(变量值)

image-20240704190518125

  1. 永久生效的变量
  • 当前用户环境变量:~/.bashrc文件中配置
  • 所有用户环境变量:/etc/profile文件中配置

配置完后使用source 配置文件,使变量生效,或者重启ssh连接工具

当前用户变量配置:

image-20240704191841276

image-20240704191844167

所有用户变量配置:

image-20240704192500029

  • 自定义环境变量PATH

1.创建测试文件

image-20240704193745047

2.添加环境变量

临时修改PATH:

语法:export PATH=$PATH:要添加的路径

永久生效:

在用户环境变量文件(~/.bashrc)中或系统环境变量中(/etc/profile)追加

export PATH=$PATH:要添加的路径

image-20240704194645461

4.11上传和下载

1.图形化窗口

  • finallshell使用底部文件窗口上传和下载
  • xshell可以使用同系列程序xftp进行上传和下载

2.rz、sz命令

rz、sz命令需要安装,可以通过: yum -y install lrzsz,即可安装。

上传:输入rz,会自动打开一个文件窗口,选择文件即可上传

下载:输入sz 要下的文件,finalshell会自动下载到桌面的/fsdownload中,xshell则是先选择要下载到的文件在开始下载

4.12压缩、解压

  • tar命令

Linux和Mac系统常用有2种压缩格式,后缀名分别是:

  • tar, 称之为tarball,归档文件,即简单的将文件组装到一 个.tar的文件内,并没有太多文件体积的减少,仅仅是简单
    的封装

  • gz,也常见为.tar.gz, gzip格式压缩文件,即使用gzip压缩算法将文件压缩到- 一个文件内,可以极大的减少压缩后的

语法:tar [-c -v -x -f -z -C] 参数1….参数n

  • -c,创建压缩文件,用于压缩模式
  • -v,显示压缩、解压过程,用于查看进度
  • -x,解压模式
  • -f,要创建的文件,或要解压的文件, -f选项必须在所有选项中位置处于最后一个
  • -z, gzip模式,不使用-z就是普通的tarball格式,一般位于选项第一个
  • -C,选择解压的目的地,用于解压模式

压缩

image-20240704202041655

解压:

image-20240704202625456

指定目的地解压:

image-20240704202925586

  • zip压缩命令

语法:zip [-r] parm1parm2

-r ,递归压缩整个文件夹,与rm,cp命令效果一致

image-20240704203502262

  • unzip解压命令

语法unzip [-d] parm1 parm2

  • -d ,表示要指定解压目录,不指定默认是当前目录
  • parm1 ,被解压目录
  • parm2 :被解压的文件

image-20240704204228539

4.13磁盘管理与分区

  • 磁盘与分区的概念

    • 磁盘的物理结构:磁盘由盘片、磁头主轴马达等组成,数据以磁性形式存储在盘片上。
    • 分区的逻辑划分:分区是将磁盘划分为多个逻辑部分,每个分区可以独立格式化和使用。
    • 文件系统的作用:文件系统定义了数据存储的结构和管理方式,如ext4、XFS。
    • 分区表的类型:常见的分区表类型有MBR和GPT,它们决定了磁盘的分区的布局和限制。
  • Linux中磁盘的命名
    1.基于设备类型命名
    Linux中,磁盘设备通常以/dev/sd[a-z]或者/dev/hd[a-z]的形式命名,如sda表示的一个SCSI磁盘
    2.基于分区编号命名
    每个磁盘设备可以有多个分区,他们通过在设备名后加数字编号来区分,例如sda1是sda磁盘的第一个分区。

  • 分区的类型

    • 主分区:主分区是硬盘上独立的,直接被操作系统识别的分区,每个硬盘最多可有4个主分区
    • 扩展分区:扩展分区用于创建额外的逻辑分区,它本身不用于存储数据,而是作为逻辑分区的容器。
    • 逻辑分区:逻辑分区是在扩展分区内部创建的,用于进一步划分扩展分区的空间,以满足不同的存储需求。
  • df命令
    Linux df(英文全拼:display free disk space) 命令用于用于显示文件系统的磁盘空间使用情况,包括总容量、已用空间、可用空间和挂载点等信息。

语法:df [-h ] [FIlE]

-h (human readable) 以易读形式显示

  • du命令
    Linux du (英文全拼:disk usage)命令用于显示目录或文件的大小。

du 会显示指定的目录或文件所占用的磁盘空间。

语法: du [-s -h -S ] [文件]

-s或–summarize 仅显示指定目录或文件的总大小,而不显示其子目录的大小。
-S或–separate-dirs 显示个别目录的大小时,并不含其子目录的大小。

  • -h或–human-readable 以K,M,G为单位,提高信息的可读性。
  • lsblk命令
    lsblk (list block)是 Linux 系统中的一个实用命令,用于列出系统中所有可用的块设备信息。块设备是指以块为单位进行数据读写的存储设备,如硬盘、SSD、U盘等。

  • iostat命令
    iostat(Input/Output Statistics)是Linux系统下一个强大的性能监控工具,属于sysstat工具包的一部分。它主要用于监控系统的磁盘I/O活动情况和CPU使用情况。

  • 分区操作
    1.选择分区类型
    在创建新分区时,首先要确定是创建主分区还是扩展分区,以及是否使用逻辑分区。
    2.分区大小规划
    根据实际需求规划分区大小,合理分配空间,避免资源浪费或不足
    3.选择合适的文件系统进行格式化,如ext4、XFS等,确保分区能够被系统正确识别和使用。
    image.png
    使用lsblk查看分区结果
    image.png

  • 格式化分区(创建分区后)
    mkfs命令:
    Linux mkfs(英文全拼:make file system)命令用于在特定的分区上建立 linux 文件系统。

语法:mkfs [-t] 文件系统 [dev]

  • device : 预备检查的硬盘分区,例如:/dev/sda1
    -t : 给定档案系统的型式,Linux 的预设值为 ext2

image.png

  • 挂载分区
    1.选择合适的文件系统
    在挂载分区前,需要确定分区的文件系统类型,如ext4、xfs
    等,以确保兼容性。
    2.挂载点的创建
    创建一个目录作为挂载点,例如/mnt/data,用于挂载新的
    分区。
    3.使用mount命令挂载
    通过mount命令将分区挂载到之前创建的挂载点,如执行
    mount /dev/sdb1 /mnt/data
    4.配置开机自动挂载
    编辑/etc/fstab文件,添加挂载信息,使系统在启动时自动
    挂载分区。
    image.png
    自动挂载:
    image.png

4.14 Linux内核升级

  1. 内核的定义与功能
  • 内核是电脑的总指挥:负责管理所有硬件和软件之间的配合,确保系统运行流畅。
  • 协调硬件和软件工作:例如,玩游戏时协调显卡、键盘、网络等硬件,保证游戏运行不卡顿。
  1. 升级内核的必要性
  • 支持新硬件:新买的显卡、无线网卡等硬件可能需要新的内核才能被识别
  • 修复漏洞:升级内核可以修复系统漏洞,增强安全性,防止黑客攻击
  • 提升性能:优化内核工作效率,使电脑运行更快更稳定
  • 支持新功能:新的内核可能带来新的网络加速、文件加密的先进功能
  1. 升级前的准备
  • 备份关键文件,避免升级失败风险
    使用命令cp -r /boot /boot_backupcp -r /etc /etc_backup备份环境与内核。
  • 更新现有软件
    Ubuntu/Debian系:apt update && apt upgrade -y
    Centos7:yum update -y
    Centos8:dnf update -y
  1. 内核升级步骤
    Ubuntu:apt install linux-image-generic -y
    Centos7:由于centos7官方已经不维护,所以不能通过应用商店软件包升级内核,需要手动下载内核软件包进行安装升级。
    - 下载内核:内核下载镜像站进行下载相关版本内核
    - 安装内核包:rpm -Uvh [内核包路径]
    - 查看默认启动顺序:
    1
    awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg

    - 设置新内核为默认内核:grub2-set-default 0
    - 重启即可加载新内核

image.png

image.png
5. 清理就旧的内核文件
Ubuntu/Debian:apt autoremove --purge
Centos/REHL:package-cleanup --oldkernels --count=1
image.png

4.15 linux系统计划任务

  1. 计划任务定义
  • 任务的定义:计划任务是预先设定的,需要在特定时间或条件下自动执行的操作或程序。
  • 任务的分类: 计划任务可以分为一次性任务和周期性任务,根据执行频率和时间点进行区分。
  • 任务的触发条件:任务触发条件包括时间、事件或系统状态,如特定日期、系统启动或用户登录。
  • 任务的执行环境:计划任务通常在操作系统或特定软件中设置,如Windows任务计划程序或Linux的cron。
  1. 计划任务的作用
  • 提升工作效率
  • 资源优化配置
  • 确保任务按时完成
  1. cron定时任务(重复闹铃)
  • cron表达式基础:Cron表达式由六或七个字段组成,用于定义任务执行的时间点和频率。
    image.png

  • Cron任务的常见用途:Cron常用于自动化系统维护任务,如备份、清理日志文件等周期性工作。
    语法: crontab [-l -e -r]

    • l :查看cron任务列表
    • e:编辑cron定时任务
    • r:删除当前cron任务
  1. At命令(单次闹铃)
  • At命令定义:At命令是一种用于安排在特定时间执行一次任务的命令行工具。
  • At命令工作原理:通过指定时间参数,At命令将任务添加到队列中,到预定时间由系统自动执行。
  • At命令历史背景:At命令起源于Unix系统,后来被多种操作系统采纳,用于简化定时任务的管理。
  • At命令使用场景:At命令常用于服务器维护、数据备份等需要定时执行的任务。
    语法:at [选项] [时间]
    1
    2
    3
    4
    5
    6
    7
    pwd | at 11:50 #11:50执行pwd

    $ at 15:30
    warning: commands will be executed using /bin/sh
    at> echo "Hello at command" > ~/at_test.txt
    at> # 按 Ctrl+D 结束输入
    job 1 at Tue Jul 18 15:30:00 2023
  • 查看和删除at任务
    1
    2
    3
    4
    $ atq  # 或 at -l
    1 Tue Jul 18 15:30:00 2023 a username

    $ atrm 1 # 或 at -d 1

4.16nfs网络文件系统

  1. 概述和核心概念
  • 基本定义:
    跨平台文件共享协议
    采用客户端-服务器架构实现异构系统互通,如Linux与Unix系统间实现无缝文件传输(NASA科研项目采用NFS跨平台协作)

  • 核心价值
    集中式存储管理优势
    通过单一存储节点服务多客户端,降低运维复杂度(某跨国银行采用NFS统一管理全球分支机构数据)
    高性能网络传输机制
    基于RPC/XDR实现高效数据传输,支持大文件快速读写(皮克斯动画工作室渲染集群采用NFS加速4K视频处理)
    标准化网络协议体系
    遵循RFC7530标准构建,兼容NFSV4协议与TCP传输(阿里云NAS服务基于NFS协议实现企业级文件存储方案)

  1. NFS服务端配置
  • 创建共享文件(权限755)

    1
    mkdir -p /export/share
  • 编辑nfs配置文件

    1
    vim /etc/exports

    image.png

配置文件:

1
2
3

/export/share 192.168.16.0/24(rw,sync,no_root_squash)

文件夹 + 可访问ip +( 权限 )

  • 启动nfs服务
    systemctl start nfs-server

  • 开放防火墙端口

    tcp : 2049端口
    udp: 111端口

  1. nfs客户端配置
  • 创建用于挂载的文件夹
    mkdir -p /mnt/nfs

  • 挂载服务端的共享文件
    临时挂载:
    mount -t nfs 192.168.16.100:/export/share /mnt/nfs
    永久挂载:
    编辑fstab配置文件
    vim /etc/fstab
    行末添加:

    1
    服务器ip:/共享文件夹路径 挂载点 nfs defaults 0 0
  1. 权限管理规范
  • 实施用户权限分层机制
    采用root/nfsnobody/自定义用户组三级体系,如RedHat系统默认使用nfsnobody用户保障共享安全。
  • 启用SELinux强制访问保护
    部署SELinux策略限制NFS守护进程权限,防止越权操作,如RHEL系统默认启用nfs_selinux策略。
  • 配置ACL扩展权限控制
    通过setfacl命令为研发目录添加特定用户写权限,实现跨部门协作时的精准文件访问控制。

第五章 shell编程

5.1 shell概述

  1. shell定义与功能
  • 定义:Shell是用户与Linux操作系统交互的命令行界面负责解释用户输入的命令。
  • 核心功能:Shell提供命令行解释、脚本编程、环境配置等功能,是系统管理与自动化任务的关键工具。
  1. shell种类与选择
  • 常见的shell种类:Linux中常见的Shell包括bash、sh、csh、ksh等,各有特点和使用场景
  • 选择合适的Shell:根据个人习惯和项目需求选择shell,例如bash因其广泛支持和脚本兼容性二受欢迎。
  • shell的性能考量:不同的shell在性能上有所差距,例如zsh在某些情况下提供更快的命令执行速度。

5.2应用场景说明

  1. 自动化任务处理
  • 定时备份数据:使用shell脚本可以设置定时任务,自动备份重要数据,确保数据安全。
  • 监控系统状态:shell脚本可以监控服务器的CPU、内存使用情况,并在异常时发送警报。
  1. 系统管理与监控
  • 自动化任务调度:使用Shell脚本可以设置定时任务,如使用cron进行系统维护和数据备份。
  • 资源使用情况监控:Shell可以编写脚本来监控CPU、内存和磁盘使用情况,及时发现系统瓶颈
  • 日志文件分析:通过Shell脚本分析系统日志,帮助管理员快速定位问题和安全事件。
  • 网络服务状态检查:Shell脚本可以定期检查网络服务状态,如HTTP、SSH服务,确保服务的高可用性。
  1. 软件开发辅助
  • 自动化构建与部署:使用Shell脚本自动化软件的构建和部署过程,提高开发效率,减少人为错误。
  • 版本控制与代码管理:利用Shell脚本与版本控制系统(如Git)交互,实现代码的自动提交、分支切换等操作。

5.3 Shell基本语法与核心功能

1. 脚本编写规范
  • 命名规范:脚本文件名应简洁明了,使用小写字母和下划线如”backup_script.sh”。
  • 注释说明:脚本开头应包含注释说明,包括脚本功能、作者、创建日期及修改记录。
  • 代码缩进与格式:使用统一的缩进风格(如空格或制表符),保持代码整洁,易于阅读。
  • 注释:脚本应写注释,每一段代码后,都要注释说明这段内容什么含义。

脚本示例:
第一行:定义脚本的解释 器
第二行:注释脚本名称
第三行:解释脚本做了那些操作
第四行:作者
第五行:创建日期

1
2
3
4
5
6
7
8
#!/bin/bash
# mysql数据库备份脚本
# 备份MySQL数据库的数据到,存储到/data/mysql_bak目录下
# zero
# 创建日期:2025-10-27

mysqldump -uroot -p***** -B mysql_aaa > /data/mysql_bak/mysql_aaa.sql

2. 变量
  • 命名规则:

    • 只包含字母、数字和下划线: 变量名可以包含字母(大小写敏感)、数字和下划线 _,不能包含其他特殊字符。
    • 不能以数字开头: 变量名不能以数字开头,但可以包含数字。
    • 避免使用 Shell 关键字: 不要使用Shell的关键字(例如 if、then、else、fi、for、while 等)作为变量名,以免引起混淆。
    • 使用大写字母表示常量: 习惯上,常量的变量名通常使用大写字母,例如 PI=3.14。
    • 避免使用特殊符号: 尽量避免在变量名中使用特殊符号,因为它们可能与 Shell 的语法产生冲突。
    • 避免使用空格: 变量名中不应该包含空格,因为空格通常用于分隔命令和参数。
  • 使用变量:使用一个定义过的变量,只要在变量名前面加美元符号即可。

    1
    2
    3
    your_name=zero
    echo $your_name
    echo ${your_name}

    注:花括号可选,花括号便于解释器识别变量边际

  • 只读变量
    使用 readonly 命令可以将变量定义为只读变量

    1
    2
    3
    #!/bin/bash
    myname=zero
    readyonly myname
  • 删除变量
    使用 unset 命令可以删除变量

    1
    2
    3
    #!/bin/bash
    myname=zero
    unset myname
  • 变量类型
    定义变量时= 前后不能有空格,即整条变量语句都不能有空格

变量类型 说明
字符串变量 在 Shell中,变量通常被视为字符串。你可以使用单引号 ‘ 或双引号 “ 来定义字符串
my_string='hello'my_string="hello"
整数变量 你可以使用 declare 或 typeset 命令来声明整数变量。这样的变量只包含整数值
declare my_interger=123
数组变量 Shell 也支持数组,允许你在一个变量中存储多个值。数组可以是整数索引数组或关联数组
整数索引数组:my_array=(1 2 3 4 5)
关联数组(类似map):
declare -A associative_array
associative_array["name"]="John"
associative_array["age"]=20
环境变量 这些是由操作系统或用户设置的特殊变量,用于配置 Shell 的行为和影响其执行环境
PATH 变量包含了操作系统搜索可执行文件的路径:echo $PATH
特殊变量 有一些特殊变量在 Shell 中具有特殊含义,例如 $0 表示脚本的名称,$1$2,等表示脚本的参数。
$#表示传递给脚本的参数数量,$? 表示上一个命令的退出状态等。
3. 用户输入

使用read 读取用户输入

1
2
3
echo -n "请输入你的内容"
read user_input
echo "你输入的内容是:${user_input}"
4. 流程控制
  • 条件判断

if :

1
2
3
4
5
6
if 条件
then
命令1
命令2

fi

写成一行(适用于终端命令提示符 ):

1
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

if else:

1
2
3
4
5
6
7
if 条件
then
命令1
命令2
else
命令1
fi

if else-if else:

1
2
3
4
5
6
7
8
9
10
if 条件
then
命令1
命令2
else if 条件
then
命令1
else
命令1
fi

注:
if else 中的[...]判断语句使用-gt表示大于,-lt表示小于

1
2
3
if ["$a" -gt "$b"];then
...
fi

如使用((...))作为判断语句,大于和小于可以直接使用<>

1
2
3
if (( a > b )); then
...
fi

if else 语句经常与 test 命令结合使用,如下所示:

1
2
3
4
5
6
7
8
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '两个数字相等!'
else
echo '两个数字不相等!'
fi
  • for循环
    一般格式:

    1
    2
    3
    4
    5
    6
    7
    for var in item1 item2 ... itemN
    do
    command1
    command2
    ...
    commandN
    done

    写成一行:

    1
    for var in item1 item2 ... itemN; do command1; command2… done;

    示例:

    1
    2
    3
    4
    for var in 1 2 3 4 5
    do
    echo $var
    done
  • whlie语句
    while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。

    1
    2
    3
    4
    while 条件
    do
    命令
    done

    示例:

    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    int=1
    while(($int<=5))
    do
    echo $int
    let "int++"
    done

    while循环读取用户输入:

    1
    2
    3
    4
    5
    6
    echo '按下 <CTRL-D> 退出'
    echo -n '输入你最喜欢的网站名: '
    while read FILM
    do
    echo "是的!$FILM 是一个好网站"
    done

    无限循环:

    1
    2
    3
    4
    while :
    do
    命令
    done

    1
    2
    3
    4
    while true
    do
    命令
    done

    1
    for(( ; ; ))
  • until循环
    until 循环执行一系列命令直至条件为 true 时停止。
    until 循环与 while 循环在处理方式上刚好相反。相当于C语言do-while
    语法:

    1
    2
    3
    4
    until 条件
    do
    命令
    done

    示例:
    [...]条件里前后必须有空格。

    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    a=0
    until [ ! $a -lt 10 ]#括号不能与其他字符相连只能和空格相连
    do
    echo $a
    a=`expr $a + 1`
    done
  • case … esac
    case … esac 为多选择语句,与其他语言中的 switch … case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句,esac(就是 case 反过来)作为结束标记。

语法:

1
2
3
4
5
6
7
8
case 值 in
模式1)
命令
;; #break
模式2)
命令
;; #break
esac

取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至;;
一旦匹配成功,不再匹配其他模式。如无匹配,使用星号*捕获该值,在执行之后命令。
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
echo '输入1-4的数字'
echo '你输入的数字为:'
read num
case $num in
1) echo '你输入了1'
;;
2) echo '你输入了2'
;;
3) echo '你输入了3'
;;
4) echo '你输入了4'
;;
esac

字符串:

1
2
3
4
5
6
7
8
#!/bin/bash
str="nihao"
case "$str" in
"nihao") echo "nihao"
;;
"123") echo "123"
;;
esac
  • 跳出循环
    ①break(跳出所有循环)
    示例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
    while :
    do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
    1|2|3|4|5) echo "你输入的数字为 $aNum!"
    ;;
    *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
    break
    ;;
    esac
    done
    ②continue(跳出当前(一次)循环,即少执行一次i=n时的命令,继续执行i=n+1以及之后的命令)
    示例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/bash
    while :
    do
    echo -n "输入 1 到 5 之间的数字: "
    read aNum
    case $aNum in
    1|2|3|4|5) echo "你输入的数字为 $aNum!"
    ;;
    *) echo "你输入的数字不是 1 到 5 之间的!"
    continue
    echo "游戏结束"
    ;;
    esac
    done
5. test命令

test 命令是 Shell 内置的条件判断工具,用于评估表达式并返回布尔值(真/假),它通常与 if 语句结合使用,是 Shell 脚本中实现逻辑控制的基础。

语法:

1
2
3
test 表达式
#
[ 表达式 ] #方括号内必须有空格
  • 文件测试
操作符 描述 示例
-e 文件是否存在 [ -e file.txt ]
-f 是普通文件 [ -f /path/to/file ]
-d 是目录 [ -d /path/to/dir ]
-r 可读 [ -r file.txt ]
-w 可写 [ -w file.txt ]
-x 可执行 [ -x file.sh ]
-s 文件大小>0 [ -s logfile ]
-L 是符号链接 [ -L symlink ]
示例:
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

file="/etc/passwd"

if [ -e "$file" ]; then
echo "$file 存在"
if [ -r "$file" ]; then
echo "并且可读"
fi
else
echo "$file 不存在"
fi
  • 字符串比较
操作符 描述 示例
-z STRING 字符串为空 [ -z "$var" ]
-n STRING 字符串非空 [ -n "$var" ]
STRING1 = STRING2 字符串相等 [ "$var1" = "$var2" ]
STRING1 != STRING2 字符串不等 [ "$var1" != "$var2" ]
  • 数值比较
操作符 描述 示例
-eq 等于equal [ "$a" -eq "$b" ]
-ne 不等于not equal [ "$a" -ne "$b" ]
-gt 大于greater than [ "$a" -gt "$b" ]
-ge 大于或等于greater than、equal [ "$a" -ge "$b" ]
-lt 小于 less than [ "$a" -lt "$b" ]
-le 小于等于less than、equal [ "$a" -le "$b" ]
  • 逻辑操作符
操作符 描述 示例
逻辑非 [ ! -f "$file" ]
-a 逻辑与 and [ "$a" -eq 1 -a "$b" -eq 2 ]
-o 逻辑或 or [ "$a" -eq 1 -o "$b" -eq 2 ]
  • 高级用法
    双括号[[]]
    • 支持模式匹配:[[ "$var" == *.txt ]]
    • 支持正则表达式:[[ "$var" =~ ^[0-9]+$ ]]
    • 更安全的字符串处理

算数比较(())

  • 专为数值比较设计:(( a > b ))
  • 支持更复杂的算术表达式
6. echo命令

echo 是一个内置的 Shell 命令,用于在标准输出(通常是终端)显示一行文本或变量的值。

Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。

  • 基本用法
    ①简单文本输出
    1
    echo "Hello World"
    ②输出变量
    1
    2
    name="Linux"
    echo "Hello $name"
    ③不带引号输出
    引号不是必须的,但建议使用以避免意外:引号不是必须的,但建议使用以避免意外:
    1
    echo This is a test
  • 常用选项
    • -n 选项:不换行输出
    • -e 选项:启用转义字符输出

常用转义序列:

转义序列 说明
\n 换行
\t 水平制表位
\v 垂直制表位
\b 退格
\r 回车
\\ 反斜杠字符本身
  • 高级用法
    ①输出到文件
    重定向到文件:

    -2>:将错误信息重定向到文件
    &>:将错误信息和标准输出重定向到文件

    1
    echo "this is a test" > output.txt
    追加到文件末尾:
    1
    echo "add test" >> output.txt
    ②彩色输出
    使用 ANSI 转义码实现彩色文本:
    1
    2
    echo -e "\033[31mRed Text\033[0m"
    echo -e "\033[42;31mGreen Background with Red Text\033[0m"
    颜色代码:
    • 前景色:30(黑)、31(红)、32(绿)、33(黄)、34(蓝)、35(紫)、36(青)、37(白)
    • 背景色:40-47 对应上述颜色
    • \033[0m 重置所有属性

③输出命令执行结果

1
echo "today is $(date)"

7. read命令

Linux read命令用于从标准输入读取数值。

read 内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。

语法:

1
read [参数] [输入]

参数:

  • -a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。
  • -d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。
  • -p 后面跟提示信息,即在输入前打印提示信息。
  • -e 在输入的时候可以使用命令补全功能。
  • -n 后跟一个数字,定义输入文本的长度,很实用。
  • -r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个 正常的字符了。
  • -s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
  • -t 后面跟秒数,定义输入字符的等待时间。
  • -u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的。

示例:

1
2
3
4
5
6
7
#!/bin/bash
echo "请输入:"
read -a arr1
for item in "${arr1[@]}"
do
echo "$item"
done