Linux虚拟机以及shell常用命令总结

前言

入门

简介

  • Linux 是一款操作系统,免费,开源, 安全,高效,稳定, 处理高并发非常强悍,现在很多 的企业级的项目都部署到 Linux/unix服务器运行

  • 发行版【最常用的是centOS和ubuntu】

    • ubuntu适合个人学习,且界面比centOS华丽

    • centOS适合企业开发(本课程选择

      • 注意:centOS7.9版本维护支持到2024.6

      • 官方打算用centOS stream取代centOS(但稳定性会稍差),以后可以关注rocky

image-20230810153706996

环境配置

  • 安装vm虚拟机软件和centOS的Linux操作系统

创建虚拟机

image-20230810160222389

  • 由于虚拟机需要划分内存空间,所有安装位置需要选择内存足够大的磁盘

  • 虚拟机要向物理机(主机)获取资源,需要参考本机配置,并确认本机已启用虚拟化

    • 插槽1即cpu个数只有一个

    • 内核:cpu独立出来的内部处理核心,提升性能的关键

    • 逻辑处理器:利用超线程技术,每个内核可以扩展出两个逻辑内核

      • 所以虚拟机分配的内核总数(处理器数量*每个处理器的内核数量)不能超过本机的12个

image-20230810160916395

image-20230810161909829

  • 配置虚拟机网络类型

    • 桥接:把主机当作桥,可以通过主机访问外部网络,和主机地位是平等的

    • nat:虚拟机完全依托于主机和外部进行网络连接(相当于把主机当成虚拟路由器),和主机对外是一个ip

image-20230810162544512

安装linux到虚拟机

  1. 点开虚拟机设置-》使用iso映像文件-》找到下载好的centOS镜像

image-20230810170739429

  1. 开启虚拟机,进行系统配置

    • 配置软件选择(默认是最小配置,没有桌面环境),选择gnome桌面环境(kde相对华丽,初学先不使用)

image-20230810174622783

  1. 点击安装目标位置,配置磁盘信息

    • linux没有盘符的概念(小拓展 A/B盘是软盘【历史】)

      • 有根目录/,分区用文件夹代替(整个系统架构就是一个文件目录)

      • 分区分好之后,要将该区域挂载到文件夹(挂载点)

      • 如果没有挂载一律认为在根分区下

  2. 选定标准分区,+号新增挂载点

    image-20230810180015980

    • 创建引导分区

      • 必须单独设置出来,放在根目录下的boot(规定)

      • 系统启动靠引导分区进行快速启动

    image-20230810180111059

    • 文件系统

      • ext4:第四代扩展文件系统,总容量可以到达1EB(1024TB)

      • xfs:新的高性能日志文件系统,最大支持8EB,性能比ext4更强(centos7之后默认选定)

    image-20230810181755090

    image-20230810180248102

    • 创建交换分区swap

      • 单独设置硬盘中的一块区域,作为扩展内存(虚拟内存)

      • 文件系统类型必须是swap类型

    image-20230810181256498

    • 剩下的容量就放在根分区下

image-20230810181515254

  1. 修改网络主机名,便于访问

    image-20230810182509163

  2. 禁用kdump

    • 划分系统空间用于安全备份的,学习阶段如果崩了就直接重启,所以这里先禁用掉节省系统资源

  3. 设置密码,然后先创建一个普通用户,默认有root用户(超级管理员)

基础

基础设置

  • 左上角的应用程序中可以对系统进行一些基础设置

image-20230810183704066

  • 键盘设置中,super即window键

image-20230810184056358

  • 文本编辑器可以用于编辑文档(常见)

image-20230810184205338

  • 添加输入法

    image-20230813234959541

    • 在设置中添加汉语拼音输入

    • 使用super+空格或者是shift就可以切换输入法

终端

  • image-20230810184911412

    linux终端本质是命令解释层(学习的重点),核心层即linux内核,命令解释层连接外部的应用和内核

  • 打开终端

    • 这里打开的终端实际上是命令解释层的仿真器

      image-20230810184517501

      空白处右键

      image-20230810184545768

      应用程序中

    • 如果要打开正在意义的终端,可以使用ctrl+alt+f2进入,退回到图形化界面使用alt+f1

  • 终端界面

    • image-20230810190703221

      用户@主机名

      • ~表示当前所在位置,即当前在哪个目录下,如果~后面没有跟东西就是在主文件夹

      • #输入命令的提示,普通用户是$为提示符

    • 终端界面的首选项可以对界面展示进行配置

命令

  • tab键可以自动补全目录名

  • 常用命令

    • ls:把当前目录下所有的文件和文件夹都列举出来

    • cd:切换目录

linux目录结构

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

  • windows系统下层级用“\”划分,而linux用“/”划分(正斜杠,因为反斜杠是有转义作用,正斜杠没有转义的问题)

image-20230813223713864

  • 具体的目录结构(建议除home、opt、tmp、var之外的其它目录中的内容不要做改动!!)

    • /bin:存放着最经常使用的命令

      • 根目录下的/bin其实是bin目录的链接(快捷方式),其实际位置在/usr/bin、/usr/local/bin

    • /sbin:存放的是系统管理员使用的系统管理程序

      • 同样也是链接,实际位置在/usr/sbin

    • /lib,/lib64:库目录,存放系统和应用程序之间的共享库文件(类似于windows系统中的dll文件),等同windows的system目录

      • 连接到/usr/lib

    • /usr:包含了用户所有的应用程序和所需要的文件和数据

    • /boot:存放启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件

    • /dev:类似于windows的设备管理器,把所有的硬件文件的形式存储

    • /etc:存放系统管理所需要的配置文件和对应的服务

    • /home:存放普通用户主目录,linux中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的

      • root用户的主目录在/root下

    • /opt:给主机额外安装软件所摆放的目录。如安装ORACLE数据库就可放到该目录下,默认为空

    • /media:linux系统会自动识别可移动媒体设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下

    • /mnt:为了让用户临时挂载别的文件系统,我们可以将外部的存储挂载在/mnt/上,然后进入该目录就可以查看里面的内容,可以认为是另一个可移动媒体设备挂载点

    • /proc:是一个虚拟目录,它是系统内存的映射,访问这个目录来获取系统信息

    • /run:是一个临时目录,存放当前系统运行以来的信息,重启后会清空

    • /srv:service缩写,存放一些服务启动之后需要提取的数据

    • /sys:存放系统硬件信息

    • /tmp:临时存放文件

    • /var:可变目录,存放经常被修改的文件,一般存放日志文件

!!!VI/VIM编辑器

  • 简介

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

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

  • 使用方式

    • 打开文本:vi/vim 文件名

    • 右下角有当前光标位置(第几行第几列,已经当前位置的百分比)

      image-20230813235630983

编辑器的三种模式转换

image-20230813235948747

具体操作

image-20230814141348151

命令模式
  • 保存并退出:wq

    • 保存:w

    • 退出文本编辑器:q

  • 不保存强制退出:q!

  • 强制保存,如果有相关权限,只读文件也可以保存:wq!

  • 显示行号:set nu

    • 取消显示:set nonu

  • 查找:/+查找信息

    • 此时光标会跳转到第一个查找到的位置,所有符合查找的信息会高亮显示

      • 使用:noh就不显示高亮

    • n向下找

    • N向上找

  • 替换:s/替换词/替换结果

    • 替换当前行匹配的第一个信息

    • 当前行所有匹配都替换:s/替换词/替换结果/g

    • 全文替换:

      • 替换每一行的第一个:%s/替换词/替换结果

      • 替换全文:%s/替换词/替换结果/g

一般模式
  • 在操作之前加数字重复该操作几次

  • 拷贝当前行:yy

    • 拷贝当前行中光标位置

      • 之后的所有内容:yy+$(删除也同理)

      • 之前的所有内容:yy+^(删除也同理)

    • 拷贝当前的单词:yw(w即word,删除也同理)

  • 删除当前行:dd

  • 粘贴到当前行:p

  • 剪切单个字符:x

  • 回退:u

  • 更改光标位置的字符:r

    • R(即shift+r) :进入替换模式,依次替换字符

  • 光标移动,移动到

    • 行头:^

    • 行尾:$

    • 词头:w

    • 词尾:e

    • 上一个词的词头:b

    • 篇头:H、gg

    • 篇尾:G、L

    • 某一行:行号+G

编辑模式
  • 进入编辑模式

image-20230814135529037

  • 退出:esc

网络配置

本机和虚拟机互相连接

  • 查看ip地址

    • 本机:可以在windows命令行下使用ipconfig

    • linux:终端使用ifconfig

  • 连接

    • 虚拟机连接主机:linux终端中使用 ping+ip

      • ctrl+c退出连接界面

      image-20230814144428028

    • 主机连接虚拟机:命令行也是使用ping+ip(要确保linux有线已经连接)

    image-20230814143632608

    image-20230814143647388

  • ip地址前三段完全一样才在一个网段内

  • 查看网关

image-20230814211558032

image-20230814211617366

  • 主机向虚拟机传输文件:scp "文件" 会话名@IP地址:/对应的虚拟机下载目录

vm提供的连接模式

  • 桥接模式:虚拟机直接连接外部物理网络的模式,主机起到了网桥的作用。这种模式下,虚拟机可以直接访问外部网络,并且对外部网络是可见的

    • 缺点

      • ip地址前三段都要一样,保证和主机在同一局域网内,最后一段不一样,会占用一个ip地址

      • 外部网络可以在同一局域网中访问到虚拟机,不安全

    image-20230814205625243

  • NAT 模式:虚拟机和主机构建一个专用网络,并通过虚拟网络地址转换 (NAT)设备对IP进行转换。虚拟机通过共享主机IP可以访问外部网络,但外部网络无法访问虚拟机

    • 局域网里面虚拟出了新的局域网

    • 为了保证主机可以和虚拟机通信,主机中设置了虚拟网卡vmnet8,用于连接虚拟路由器

    image-20230814210339954

  • 仅主机模式:虚拟机只与主机共享一个专用网络,与外部网络无法通信

image-20230814210451222

修改静态ip

  • windows系统下(主机)指定静态ip

image-20230814212206287

  • 虚拟机指定静态ip

    • 图形化界面的方式

    image-20230814212524671

    • 终端修改配置文件:/etc/sysconfig/network-scripts/ifcfg-ens33

      1. 将BOOTROTO(启动协议)由dhcp(动态分配ip)改成static(静态分配ip)

      2. 添加ip地址的配置IPADDR,网关GATEWAY,域名解析器DNS1

      3. 重启当前网络服务 service network restart

  • 修改ip地址可能出现的问题

    • 物理机能 ping 通虚拟机,但是虚拟机 ping 不通物理机,一般都是因为物理机的防火墙问题,把防火墙关闭就行

    • 虚拟机能 Ping 通物理机,但是虚拟机 Ping 不通外网,一般都是因为DNS 的设置有问题

    • 虚拟机 Ping www.baidu.com 显示域名未知等信息,一般查看 GATEWAY 和DNS 设置是否正确

    • 如果以上全部设置完还是不行,需要关闭NetworkManager服务

      • systemctl stop NetworkManager 关闭

      • systemctl disable NetworkManager 禁用

    • 如果检查发现 systemctl status network 有问题 需要检查 fcfg-ens33

配置主机名

  1. 查看当前主机名:hostname

  2. 配置主机名

    • 在/etc/hostname目录中修改信息

    • 直接hostnamectl set-hostname 名称

  3. 在hosts文件中(在/etc/hosts目录下)配置主机名和ip的映射关系

    • 格式: ip 主机名

  4. 修改主机的hosts文件(C:\Windows\System32\drivers\etc),主机就可以通过主机名访问虚拟机

image-20230814221457803

远程登录

  • 命令行进行远程登录:ssh 用户@主机名

  • 使用工具xshell进行远程登录

    1. 配置连接的主机名

    image-20230814232219706

    1. 配置连接的用户及密码

    image-20230814232258072

    1. 直接点击对应的连接即可远程登录

      image-20230814232448497

  • 安装xftp可以进行远程文件传输

    • xftp的主机配置同xshell

    • 如果出现中文乱码,在文件-》当前会话属性-》选项中修改字符编码为utf-8

系统管理

  • 关键词查找对应文件信息:ls 目录对应文件 | grep 关键词

image-20230815173709627

service服务管理

服务定义
  • 计算机中,一个正在执行的程序或命令,叫做进程;启动之后一只存在、常驻内存进程,一般被称作服务

  • 守护进程和服务的关系,守护进程守护系统服务

服务管理的语法
  • systemctl start|stop|restart|status 服务名(centos7语法)

  • service 服务名 操作(centos6语法,但是7之后也兼容了)

查看服务
  • ls /usr/lib/systemd/system,其中

    • .service是服务文件

    • .target是一组服务的集合

    • 网络服务

      • NetworkManger(centos7)

      • network(6)

系统服务配置的图形化工具

image-20230815175836905

  • 打开:命令行输入setup

  • 操作:选中系统服务(tab移动光标),按回车进入

    • sysv标签的是老版本的启动方式

    • systemd是7之后的启动方式

image-20230815180219767

  • 开机自动启动状态

    • 带*的是自动启动

    • 修改:选中对应的服务,按空格可以修改启动状态

修改服务的运行级别
  • 查看服务的运行级别

    • 查看所有

      • chkconfig --list(6)

      image-20230815183601628

      • systemctl list-unit-files(7)

      image-20230815185531804

    • 查看具体:systemctl status 服务名(7)

      • vendor preset是默认的启动状态

      • service是当前的启动状态

    image-20230815184718808

  • 修改服务自动启动(会对该服务的所有级别进行修改)

    • chkconfig 服务名 on/off(6)

    • systemctl enable/disable 服务名(7)

  • 修改服务的指定级别

    • chkconfig --level 级别 服务 on/off(6)

运行级别
linux启动过程
  • init进程是用户级别第一个启动的进程

image-20230815180624405

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

    • 级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动

    • 级别1:单用户工作状态,只允许root权限,用于系统维护,禁止远程登陆

      • 忘记了root密码可以通过该方式进入系统

    • 级别2:多用户状态(没有NFS【网络文件系统】),不支持网络

    • 级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式

      • 经测试,控制台模式使用小键盘输入数字会出错

    image-20230815181645634

    • 级别4:系统未使用,保留

    • 级别5:X11控制台,登陆后进入图形GUI模式

    image-20230815181706755

    • 级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

  • CentOS7的运行级别简化为:

    • multi-user.target等价于原运行级别3(多用户有网,无图形界面)

    • graphical.target等价于原运行级别5(多用户有网,有图形界面)

  • 查看当前运行级别

    • systemctl get-default(7)

    • vi/vim /etc/inittab(6)

  • 修改当前运行级别

    • systemctl set-default TARGET.target(这里TARGET取multi-user或者graphical)

    • init 数字

关机重启

  • 指令

    • sync:将数据由内存同步到硬盘中

    • halt:停机,关闭系统,但不断电

    • poweroff:关机,断电

    • reboot:重启,等同于 shutdown-r now)

    • shutdown [选项] [时间]:关机/重启相关操作

      • 选项

        • -H:停机

        • -h/P:关机

        • -r:重启

      • 时间

        • shutdown:一分钟之后关机,在此之前使用shutdown-c可以取消

        • shutdown now:立刻关机

        • shutdown 数字:在几分钟之后关机

        • shutdown 时间:定时关机(shutdown 15:28【在15点28分进行关机】)

  • linux默认不是立即关机的原因

    • linux为提高磁盘的读写效率,采用预读和延迟写入

      • 延迟写入:保存的内容不立即写入磁盘,而是先存到缓冲区,缓冲区达到阈值才写入

        • 如果未写入磁盘就关机会导致数据丢失

!!!实操--基本命令

基础概念

  • Shell:可以看作是一个命令解释器,提供了交互式的文本控制台界面。我们可以通过终端控制台来输入命令,由shell进行解释并最终交给内核执行

  • 内嵌命令:一部分基础功能的系统命令是直接内嵌在shell中的,系统加载启动之后会随着 shell起加载,常驻系统内存中。这部分命令被称为内置 (built-in)命令;相应的其它命令被称为外部命令

  • 判断命令的类型:type 命令

    image-20230816000536654

  • 常用快捷键

    • ctrl + c:停止进程

    • ctrl+l:清屏,等同于 clear;彻底清屏:reset提示

    • 善于用 tab 键:提示(更重要的是可以防止敲错)

    • 上下键:查找执行过的命令

帮助命令

  • 获取内嵌命令帮助信息

    1. man -f 内嵌命令

      • 查看1p下的解释:man 1p cd

    image-20230816000902838

    1. help 命令

      • 缺陷:帮助信息是纯英文、只能获取内嵌命令的帮助信息

  • 获取外部命令帮助信息

    1. man [命令或配置文件]

      • 使用b/f可以查看下/上一页

    2. 命令 --help

!!!文件目录类

!!!查看信息

查看目录信息
  • pwd:显示当前工作目录绝对路径

    • 绝对路径:从根目录开始的路径

    • 相对路径:相对于当前位置的路径

    • pwd是内嵌命令

  • ls [选项] [目录或文件]:列出目录内容

    • 选项

      • -a:显示所有的文件(包括隐藏文件)

        • linux中以.开头的文件都是隐藏文件

      • -l:长数据串列出,包含文件的属性与权限等等数据

        • 每行列出的信息依次是: 文件类型与权限 链接数 文件属主 文件属组 文件大小用byte来表示 建立或最近修改的时间 名字

          • 一般文件的类型以-开头

          • 目录类型以d开头

        • ls -l命令的别名为ll

        • ls -lh可以用单位表示文件大小

          image-20230819154442295

      • 两个参数可以合并在一起,如-al

查看文件内容
  • cat [选项] 文件:查看文件内容,从第一行开始显示

    • 选项-n:显示包含空行在内的所有行的行号

  • more 文件:文件内容分屏查看

    • more指令是一个基于VI编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容

    • 具体操作

      image-20230816194109416

  • !!!less 文件:分屏显示文件内容

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

    • 具体操作(more的操作也适用)

      image-20230816194911836

  • 显示文件头尾部内容

    • head [-n num] 文件:查看文件头num行内容

      • 不指定行数则默认显示10行

      • 空行也计入

    • tail [-n num] 文件:查看文件尾num行内容

      • 不指定也是显示10行

      • tail -f 文件:显示文件最新增加的内容,监视文件变化(可用于实时追踪

        • ctrl+s:暂停监视

        • ctrl+q:继续监视

        • ctrl+c:退出监视

        image-20230816231950087

        image-20230816231935433

        • 如果是通过vim的方式修改文件,则最新增加的内容不会被监视到

          • 因为监视本质上是通过文件底层的索引号inode进行监视(ls -i 文件:显示文件索引号)

          • 而vim的方式打开文件会赋予一个新的索引号

            image-20230816232616230

!!!修改目录或文件

  • cd [路径]:切换路径

    • 路径

      • 以/开头为绝对路径

      • 不以/开头为相对路径

        • ..:返回上层目录

        • .:表示当前目录

    • 返回上次的目录:cd -

    • 回到主文件夹:cd

  • mkdir [-p] [路径1] [路径2] ....:创建文件夹(可以创建多个)

    • -p:可以嵌套创建目录(如果创建的目录的父目录不存在,也会将其父目录创建出来,不指定-p则默认无法创建

  • rmdir [-p] [路径1] [路径2] ....:删除文件夹(可以删除多个)

    • 删除父目录时,如果父目录中还有子文件/目录,则无法删除

    • -p:可以嵌套删除目录(如果删除目录之后,其父目录不存在资源,则会将该父目录删除)

  • cp [-r] source dest :复制文件或目录

    • source:源文件

    • dest:目标路径(可以是文件,如果复制到文件中去则为覆盖

      • 回复y/n即为要/不覆盖

      image-20230816184521198

      • 如果复制到的目录中有同名文件,也会询问是否要覆盖

    • -r:递归复制整个文件夹(复制文件夹时,会将其下的资源一同复制过来)

    • 使用\cp则不会询问信息

      image-20230816184858956

      • \指使用linux中的原生命令

        • 使用alias可以查看linux采用别名的命令

        image-20230816191933168

      • 常用的cp其实是cp -i命令(即提示是否覆盖)

  • touch [路径]文件名:创建空文件

    • 如果文件名不带后缀名,那默认就是文本文件

      • 也可以通过vim 文件名来创建文本文件(不同于touch的是,vim创建的文本文件如果没有内容默认不会保存

    • 如果不知道路径,则创建在当前目录下

  • rm [选项] 文件/目录:删除文件

    • 选项

      • -r:递归删除目录所有内容,如果不指定则无法删除目录

      • -f:强制执行删除,不提示信息

      • -v:显示指令的详细执行过程

      • 想要删除目录且不提示,可以使用复合选项-rf(之后不一一赘述)

  • mv移动文件或重命名

    • mv old new:重命名

    • mv 源文件 目标路径:移动文件

其它命令

  • echo [-e] [输出内容]:输出内容到控制台

    • 可以有空格,多个空格默认当单个空格

    • 如果使用" ",则引号里面的内容会原封不动输出

    • -e:可以使用转义功能(转义功能要在引号中才能生效)

      image-20230816200027538

    • echo $:查看系统环境变量

  • >输出重定向和>>追加

    • 基本语法

      • Is -l > 文件:列表的内容写入文件中(覆盖写)

      • Is -al >> 文件:列表的内容追加到文件的末尾

      • cat 文件1 > 文件2:将文件1的内容覆盖到文件2

      • echo 内容 >> 文件

  • ln -s [原文件或目录] [软链接路径]:给原文件创建一个软链接

    • 软链接也称为符号链接,类似于windows 里的快捷方式,有自己的数据块,主要存放链接到其他文件的路径

      • 访问软链接的路径可以跳转到指定位置,相当于指针,访问软连接指向的位置

    • 软链接的文件类型是以l打头

      image-20230818155934626

    • 删除软链接:rm -rf 软链接名,而不是rm -rf 软链接名/

      • 如果使用rm -rf 软链接/,会把软链接对应的真实目录下的内容删掉

    • 通过软链接跳转之后,使用pwd显示的是软链接所在的路径【而不是真实路径】,如果要显示实际路径需要用pwd -P

      • 切换路径的时候也可以指定实际路径 cd -P 软链接

      image-20230818161958546

      image-20230818161940926

      image-20230818162025405

    • 拓展,硬链接:ln [原文件或目录] [链接路径]

      • 硬链接直接指向文件的索引号inode,相当于别名(linux中的链接数指的就是硬链接)

      image-20230818165700944

      • 而软链接有自己的inode,里面存放的原文件/目录的地址,软链接其实是链接文件

        image-20230818170142536

  • 历史操作相关

    • history [num]:查看执行过的num条命令,不指定则全展示

    • history -c:清空历史记录

    • ![编号]:查看该编号下执行的命令

时间日期类

  • 显示当前时间

    • date:显示当前时间

    • date +日期参数【+号不可省】:显示指定格式的日期,如果要使用空格就必须要用引号括起来

    image-20230818171322269

  • 显示非当前时间

    • date -d '1 days ago':显示前天的时间

    • date -d '-1 days ago':显示明天的时间

  • 设置系统时间

    • date -s 字符串时间

  • 查看日历

    • cal [-星期首字母小写] [具体年份]:显示该年的日历,不指定则显示本月的日历

      • cal -m:指定从星期一作为开始

        image-20230818172226204

用户管理类

用户管理

  • useradd [选项] 用户名:添加新用户

    • 选项

      • -g 组名:将该用户添加到某个组

      • -d 路径:指定该用户的主文件目录的位置(默认在home目录下)

  • passwd 用户名:设置用户密码

  • userdel [-r] 用户名:删除用户

    • 删除用户之后其家目录还存在

    • 加上-r选项会把家目录一起删除

  • usermod -g 组名 用户名:修改用户的用户组

  • su 用户名:切换用户

    • 同级或者下级到上级的用户切换需要输入密码

    • 无法访问同级或者上级的家目录

    • exit:登出当前用户,返回到上一个用户

  • sudo 命令:临时赋予普通用户root权限,执行该命令

    image-20230818182105294

    • 前提是该用户要在sudoers文件中存在才可以赋予【sudoers文件中指定了哪些用户有哪些权限】

      • 修改/etc/sudoers文件

        image-20230818181532148

查看用户信息

  • 查看用户是否存在

    • id 用户名:查看用户是否存在

    • 在/etc/passwd文件查看系统所有用户【自定义的用户id从1000开始】

      • 每个用户的信息包括 用户名:编号:组号::家目录:与系统交互的方式

    image-20230818174431229

  • who am i:查看原始登录的用户信息【即创建会话的用户】

  • whoami:查看当前用户信息

  • who:查看所有登录的用户信息

用户组管理

  • 基础知识

    • 每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理,便于赋予权限

    • /etc/group文件中可以查看系统中的用户组

    • sudoers文件中%标识的是用户组

      • 在wheel组的用户可以申请root权限

        image-20230818231742451

  • groups 用户名:查看用户的用户组

    image-20230912132853810

  • groupadd 组名:新建组

  • groupmod -n 新组名 原组名:修改组名

  • groupdel 组名:删除用户组

!!!文件权限类

文件类型

image-20230818233814445

  • 可以通过llls -l命令来显示一个文件的属性以及所属的用户【属主】和组【属组】

    • 复制的文件其文件的原信息不变【权限不变】

  • 补充

    image-20230818235545967

    • c为首字母是字符类型的设备文件,b为设备文件

    • image-20230818235335650

      文件类型之后跟的数字为链接数,文件真正意义被删除是指硬链接数为0

      • 文件的链接数指的是硬链接个数

      • 文件夹的链接数指的是子文件夹【包含当前目录和父目录】个数

        image-20230819000036896

  • 如果没有权限,就会出现减号[-]

  • rwx对文件和目录的不同解释

    • 作用到文件

      • r代表可读(read):可以读取,查看

      • w代表可写(write):可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限

      • x代表可执行(execute):可以被系统执行

    • 作用到目录

      • r代表可读(read):可以读取,即通过ls查看目录内容

      • w代表可写(write): 可以修改,目录内创建+删除+重命名

      • x代表可执行(execute):可以进入该目录,即通过cd进入

chmod改变权限

image-20230819000442763

  1. chmod [{ugoa} {+-=} {rwx}] 文件或目录

    • u:属主权限,g:属组权限,o:其它权限,a:所有权限

    • +添加,-删除,=覆盖

  2. chmod [model=三位数] 文件或目录

    • r=4,w=2,x=1

    • 三位数百位到个位分别代表ugo

    • 本质上是二进制编码转十进制,0表示没权限,1有权限

  • 修改目录里面所有文件的权限:chmod -R [上述方式1/2] 目录

更改属主和属组

  • chown [-R] [最终用户] [文件或目录]:更改文件属主

    • -R:递归修改,把目录下的所有子目录/文件一同修改

  • chgrp [最终用户组] [文件或目录]:更改文件属组

综合应用

  • 创建不同的用户组并为各组添加用户

image-20230819150314645

  • 在t1用户下的家目录创建文本文件,然后修改属组权限,让同组的成员可以访问并且操作t1的家目录

    image-20230819150950635

image-20230819151029472

  • 添加文本文件的属组修改权限

image-20230819151822948

  • 修改b1到testing组,检验是否可以查看t1下的文件

image-20230819152124031

image-20230819152156010

搜索查找类

查找文件路径

  • find [指定目录] [选项]

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

      • 不指定目录则从当前目录查找

    • 选项

      • -name<查询方式>:按照指定的文件名【查找模式】查找文件

        • 指定文件名

          image-20230819153518334

        • 指定文件名查找模式

          image-20230819153455497

      • -user<用户名>:查找属于指定用户名所有文件

      • -size<文件大小>:按照指定的文件大小查找文件

        • 单位为b-块(512字节)、c-字节、w-字(2字节)、k、M、G

        • 可以用+/-表示大/小于某个数

          image-20230819154240183

        • 文件大小必须为整数

  • locate 搜索文件【关键字】:locate快速定位文件路径

    • locate指令利用事先建立的系统中所有文件名称及路径locate数据库实现快速定位给定的文件。Locate指令无需遍历整个文件系统,查询速度较快

    • 为了保证查询结果的准确度,管理员必须定期更新locate数据库(数据库每天自动更新一次)

      • updatedb:更新locate数据库

  • which/whereis 命令:查看命令所在的路径

image-20230819155058512

image-20230819155156247

过滤查找

  • grep [-n] 查找内容 源文件:查找文件中匹配的内容

    • -n:显示匹配的行号

  • 管道符|:将前一个命令的处理结果输出传递给后面的命令处理,配合grep可以进行二次筛选

    image-20230819161515612

    • 拓展--wc 文件名:显示行数 字符数 总字符的大小

      image-20230819161744603

    • 显示关键字的出现次数

      image-20230819162036391

压缩和解压类

  • gzip/gunzip

    • gzip 文件:压缩成.gz文件

    • gunzip 文件.gz:解压.gz文件

    • 注意事项

      • 只能压缩文件不能压缩目录

      • 不保留原来的文件

      • 同时多个文件会产生多个压缩包

  • zip/unzip

    • zip [-r] 压缩名.zip 压缩的内容:压缩文件

      • -r:压缩目录以及内部的文件

    • unzip [-d<目录>] 压缩名.zip:解压

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

    • 压缩目录且保留源文件

  • tar [选项] 打包内容【可以有多个】:打包目录,压缩后文件格式为.tar.gz

    • 选项

      • -c:产生.tar打包文件,如果要压缩则必须指定

      • -v:显示详细信息

      • -f:指定压缩后的打包名【打包名.tar.gz 】,必须指定

      image-20230819165823461

      • -z:打包同时压缩

      • -x:解包.tar文件,解压缩必须指定

      • -C:解压到指定目录

        image-20230819171055089

磁盘查看和分区类

查看文件或目录的资源使用

  • 安装tree插件,通过tree 目录查看指定目录下的树状结构

image-20230819174245043

  • du [选项] 目录/文件:查看文件和目录所占硬盘大小

    • 如果用ll统计的仅仅是目录的大小,不包括其下的资源,而du会统计目录下的所有资源

    • 选项

      • -h:以人们较易阅读的GBytes,MBytes,KBytes等格式自行显示

      • -a:不仅查看子目录大小,还要包括文件和隐藏文件【如果不指定的话只会详细展示目录信息】

      • -c:显示所有的文件和子目录大小后,最后再显示总和(其实没卵用,因为总目录大小就是总和)

      image-20230819175820793

      • -s:只显示总和

      • -max-depth=n:指定统计子目录的深度为第n层

查看系统的资源使用

  • df [-h]:列出文件系统整体磁盘和内存使用量,检查文件系统的磁盘空间占用情况

    • -h:以人们较易阅读的GBytes,MBytes,KBytes等格式自行显示

    • tmpfs:临时的文件系统类型,基于内存

      • shm:shared memory,共享内存

    • devtmpfs:linux内核启动时创建该文件 系统,用于管理所有设备

image-20230819232111301

  • free [-h]:查看内存的使用情况

    image-20230819232426514

挂载相关

查看挂载情况
  • lsblk [-f]:查看块设备的挂载情况

    image-20230819232545515

    • mountpoint:挂载点

    • sda123是sda的三个分区,sr0是光驱的设备名

    • 硬盘分类

      • 常见

        • SATA特点数据存储容量大且成本低,命名以ad开头

        • SCSI数据传输快,命名以sd开头

        • 字母序表示第几块硬盘,如sda、sdb、sdc....

      • 传统

        • IDE命名hd开头

      • 虚拟化模拟设备,命名vd开头

    • -f:显示文件性能类型

      • uuid:系统为每一个分区创建的唯一标识符

      image-20230819233626421

mount/umount 挂载/卸载
  • linux中目录是虚拟目录,通过挂载指定其底层存放位置

  • mount [-t vfstype] [-o options] device dir:挂载设备

    • -t vfstype:指定文件系统的类型,通常不必指定【因为mount会自动选择正确的类型】

      • 常用类型

        • 光盘或光盘镜像:iso9660

        • Dos fat16 文件系统: msdos

        • Windows 9x fat32 文件系统: vfat

        • Windows NT ntfs 文件系统: ntfs

        • Mount Windows 文件网络共享: smbfs

        • UNIX(LINUX)文件网络共享: nfs

    • -o options:主要用来描述设备或档案的挂接方式

      • 常用的参数

        • loop:用来把一个文件当成硬盘分区挂接上系统

        • ro:采用只读方式挂接设备

        • rw:采用读写方式挂接设备

        • iocharset:指定访问文件系统所用字符集

    • device:要挂接(mount)的设备

    • dir:设备在系统上的挂接点(mount point)

  • unmount 设备文件名或挂载点:卸载

    • 卸载之后挂载点所在目录还存在,只是没了挂载文件

  • 实操

    image-20230820001414085

    1. 当插入光驱的时候,系统会自动帮我们挂载【上图】,这里先将其弹出

      image-20230820001318672

    2. 弹出之后其挂载点消失,需要手动挂载

      image-20230820001536371

    3. 图形化界面先退出用户【避免自动挂载】,然后连接光驱,连接之后才能使用dev/sr0设备

    4. 将sr0设备手动挂载/mnt下【linux下的临时挂载目录】

    image-20230820003023331

    1. 检查挂载情况【可以访问到光驱即挂载成功】

    image-20230820003112284

    1. 卸载

      image-20230820004827042

开机自动挂载配置
  • 配置 /etc/fstab文件

    • 两个0

      • 第一个指是否做(dump)备份,如果为1则每天定时做备份,0就不备份

      • 第二个指文件系统检查的优先级,1的优先级最大,数字越大优先级越小,0表示不检查

        • 拓展:fsck命令用于检查和修复文件系统

    image-20230820003458088

    • 将光驱配置自动挂载

      • 指定uuid或者是设备名 挂载点 文件类型 配置

      image-20230820004411860

      • 挂载成功

image-20230820010404235

硬盘分区

  • fdisk

    • fdisk -l:查看硬盘分区详情

    image-20230820201215561

    • fdisk 硬盘设备名:对新增硬盘进行分区操作

    • 只有root用户才能使用该命令

  • 实操

    1. 添加一块新硬盘

      image-20230820201858902

    2. 执行reboot重启虚拟机,然后查看新硬盘挂载情况以及系统硬盘信息

      image-20230820202306806

      image-20230820202823293

    3. 使用fdisk命令对其进行分区(参考帮助文档)

      image-20230820203023809

    4. 输入n添加分区,然后输入w进行保存

      image-20230820204417334

      • primary主分区,一块磁盘最多划分四个主分区,编号1-4

        • 如果需要添加更多分区,会把四个主分区的其中一个主分区替换成扩展分区

      • extended扩展分区,编号为5-16(最多12个扩展分区)

    5. 给新添加的分区创建文件系统将其格式化

      • -t 文件类型:指定文件类型

      image-20230820204954369

    6. 挂载

      image-20230820205323995

    7. 向挂载目录里面添加文件,检查新硬盘的使用情况

      image-20230820210137240

进程管理类

查看进程信息

  • linux进程按运行方式大致可以分为

    • 前台显示

    • 后台运行,系统服务往往属于后台进程

    • 具体执行系统服务的进程一般叫做守护进程(服务名称会以d结尾)

      image-20230820210852839

      • 可以认为守护进程和系统服务是一一对应的关系

查看信息语法
  • ps [选项1/选项2]:查看当前系统进程状态

    image-20230820212559199

    • 选项1(bsd风格)

      • a:列出带有终端的所有用户的进程(后台运行的不显示)

      • x:列出当前用户的所有进程,包括没有终端的进程

      • u:面向用户友好的显示风格

    • 选项2(unix风格)

      • -e:列出所有进程

      • -u 用户名:列出某个用户关联的所有进程

      • -f;显示完整格式的进程列表

两种选项显示信息说明
  • aux

    • USER:该进程是由哪个用户产生的

    • PID:进程的ID号

    • %CPU:进程占用CPU资源的百分比,占用越高,进程越耗费资源

    • %MEM:该进程占用物理内存的百分比,占用越高,进程越耗费资源

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

    • RSS:该进程占用实际物理内存的大小,单位KB

    • TTY:该进程是在哪个终端中运行的

      • 对于CentOS 来说,tty1是本地图形化终端,tty2-6是本地的字符界面终端,pts/0-255是虚拟终端【在图形化界面打开的终端也是虚拟终端】

    • STAT:进程状态,常见的状态有

      • R:运行状态、S:睡眠状态、T:暂停状态

      • Z:僵尸状态,进程中还存在父进程需要的信息,所以没有完全删干净,只剩下空壳【也会占系统资源】

        • 正常情况下,父进程退出,僵尸进程会被清掉

      • s:包含子进程、l:多线程、+:前台显示

      • <:当前进程优先级很高、N:当前进程优先级较低

    • START:该进程的启动时间

    • TIME:该进程占用CPU的运算时间,注意不是系统时间

    • COMMAND:产生此进程的命令名

  • -ef相较于aux多了一个ppid:父进程的id,即启动当前进程的进程

查看远程登录进程
  • 可以搜索带有sshd的服务找到远程登录相关进程信息

image-20230820220901085

  • 登录一个普通用户,会创建一个进程用于权限分离,该用户使用root权限实际上是通过该进程进行操作

image-20230820220356971

查看进程树
  • 命令:pstree [选项]

    image-20230821222914267

    • 选项

      • -p:显示进程的pid

        image-20230821223331513

      • -u:显示进程的所属用户, 如果子进程和父进程的用户一样就不会例外显示

        image-20230821223410692

实时监控进程状态
  • 命令:top [选项]

    • 选项

      • -d:指定top每个几秒进行更新【默认3秒】

      • -i:不显示任何闲置和僵尸进程

      • -p pid:专门指定某个进程的状态

    • 操作

      • 进程状态默认是按%CPU排序的,使用

        • shift+M按以%MEM排序

        • shift+N按进程号排序

        • shift+P切回以cpu排序

      • 监控固定用户:u,然后输入想要监控的用户【空格和回车都是监控所有】

        image-20230821233839945

      • 终止进程:p,然后输入pid

        image-20230821234011961

        确认发送信号【发具体名称或对应数字】

      image-20230821234208085

      • 退出top:q

    • 参数

      image-20230821224427353

      • up:系统启动到现在持续的时间(2时17分)、user:登录的用户数(包括图形化界面里的终端)

      • load average:平均负载,如果超过1就说明超过系统负荷,tasks:当前正在进行的任务

      • %Cpu的占用

        • us:用户进程占用cpu的时间比,这里的用户进程指的是默认情况下没有修改过优先级的进程

        • sy:系统进程占用cpu的时间比、id:idle空闲、wa:wait,当前等待i/o操作的时间占比

        • ni:经过nice【友善值,越有善优先级越低】调整过当前优先级之后的所有用户进程占用cpu的时间比

        • hi:硬中断服务请求时间占比、si:软中断服务请求时间占比

        • st:stole,被虚拟化设备占用的时间占比

      • Mem:内存占用情况、Swap:交换内存,当前虚拟内存占用情况【二者单位都是Kb】

      image-20230821232729111

      • pr:任务调度优先级、ni:用户指定的nice优先级

      • VIRT:虚拟内存占用的大小、RES:物理内存占用的大小、SHR:共享内存占用大小

      • S/R:睡眠/运行状态

      • TIME+:已经占用cpu的总时间,精确到0.01秒

      • COMMAND:生成当前进程的命令

!!!终止进程

  • kill [-9] 进程号:通过进程号杀死进程

    • -9:表示sigkill信号值,即强迫进程立即停止(杀死终端只能靠强行)

    image-20230821234400157

  • killall 进程名:通过进程名称杀死所有有关进程,也支持通配符,这在系统因负载过大而变得很慢时很有用

    • 全杀有风险,对应的守护进程也会被关掉,如果杀死sshd就无法进行远程连接,只能到虚拟机的主机终端systemctl start sshd

显示网络状态和端口占用信息

  • netstat -anp:显示网络状态和端口占用信息

    image-20230822002652252

    • proto:当前的协议

    • recv-q:连接到当前用户程序还没有拷贝的字节数

    • send-q:已经发送出去但远程的主机还没确认收到的字节数【有可能丢失的数据】

    • local/foreign address:本地/远程地址

      • 0.0.0.0:本机本地的所有地址

      • 127.0.0.1:本地回环地址,用于本地监听和测试,等同于localhost

  • netstat -anp|grep 进程号:查看该进程网络信息

  • netstat-nlp|grep 端口号:查看网络端口号占用情况

  • 选项

    • -a:显示所有正在监听 (listen) 和未监听的套接字(socket)

      • 套接字 ip:port

    • -n:拒绝显示别名,能显示数字的全部转化成数字

    • -l:仅列出在监听的服务状态

    • -p:显示哪个进程在调用

系统定时任务

  • 重新启动crond服务:systemctl restart crond

  • crond是crontab的后台守护进程

  • crontab 选项

    • 选项

      • -e:编辑crontab定时任务

      • -l:查询 crontab任务

      • -r:删除当前用户所有的crontab任务

    • 参数配置:* * * * * 执行的任务

      • 五颗星分别代表

        • 一小时当中的第几分钟(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分钟就执行一遍命令

          image-20230822233320464

          .

扩展

软件包管理

RPM

简介
  • RPM(RedHat Package Manager),RedHat软件包管理工具,,是Linux这系列操作系统里面的打包安装工具,它虽然是RedHat的标志,但理念是通用的

  • 类似windows里面的setup.exe,但是比它更强大,setup只能安装,而rpm可以安装、卸载甚至可以从源码包中build一个软件

  • RPM包的名称格式

    • Apache-1.3.23-11.i386.rpm4

      • apache软件名称

      • “1.3.23-11”软件的版本号,主版本和此版本

      • “i386”是软件所运行的硬件平台,Intel32位处理器的统称

      • “rpm”文件扩展名,代表RPM包

相关命令
  • 查询

    • rpm -qa:查询所有安装的rpm软件包

    • rpm -qi 软件名:显示该软件安装的详细信息

    image-20230822235037078

  • 卸载

    • rpm -e rpm软件名:卸载软件包

    • rpm -e nodeps:卸载软件时,不检查依赖(这样的话,那些使用该软件包的软件在此之后可能就不能正常工作了)

  • 安装

    • rpm-ivh RPM包全名

      • -i:install,安装

      • -v:--verbose,显示详细信息口

      • h:-hash,显示进度条

      • --nodepse:安装前不检查依赖

YUM

简介
  • YUM(全称为 Yellow dog Updater, Modified)是一个在 Fedora和 RedHat以及 CentOS中的 Shell 前端软件包管理器

  • 基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装

常用命令
  • yum [-y] [参数]

    • -y:对所有提问都回答yes

    • 参数

      • install:安装rpm软件包

      • update更新rpm软件包

      • check-update<检查是否有可用的更新rpm软件包

      • remove: 删除指定的rpm软件包

      • list:显示软件包信息

      • clean:清理yum过期的缓存

      • deplist:显示 yum软件包的所有依赖关系

修改yum源
  • 查看/etc/yum.repos.d/CentOS-Base.repo配置信息

    image-20230823001324995

  • 系统会判断IP地址的位置,然后在地理上选择一个最近的镜像源,所有没必要修改yum源

    image-20230823001547471

克隆虚拟机

克隆步骤

  1. 右键指定虚拟机,找到管理(开机状态下无法克隆)

    image-20230823232501410

  1. 选择克隆类型,为了服务更加稳定这里选择完整克隆

    image-20230823232956424

  2. 指定名称和克隆虚拟机位置

    image-20230823233110961

修改配置

  • 克隆的虚拟机与原虚拟机配置是一样的,为了构建集群,便于用户访问不同虚拟机,需要修改相应配置

  • 修改网络配置

    • 修改静态ip地址:/etc/sysconfig/network-scripts/ifcfg-ens33

      image-20230823233933824

    • 先关闭旧版的网络systemctl stop network服务避免干扰,然后重启网络服务systemctl restart NetworkManager

    • 查看是否修改成功

      image-20230823234643237

    • 修改主机名,以便于通过主机名访问(其实不用修改主机名,只有修改ip的映射关系即可)

      • 然后在主机的hosts文件中添加新的映射

        image-20230823235318830

  • 快照:保存了当前机器的重要节点,以备虚拟机故障可以恢复到该节点

  • 虚拟机拷贝:找到虚拟机在主机上的存放目录,拷贝到另一台机器后可以使用vm打开

    image-20230824000206244

!!!shell

基础知识

  • Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核

    image-20230824160209581

  • 还是一个功能相当强大的编程语言,易编写、易调试、灵活性强

  • 查看shell解析器

    • 查看Linux系统支持的shell解析器:cat /etc/shells

      image-20230824160611597

    • 查看当前系统默认使用的shell解析器

      • echo $SHELL

        image-20230824161123030

      • ll /bin/ | grep bash

        image-20230824161104917

shell脚本入门

  • 约定shell脚本文件以.sh作为后缀(不加也可以)

  • 开头:一般以#!/bin/bash开头(指定解析器)

  • #单行注释

  • 执行方式

    • 采用bash/sh 加脚本的相对路径或绝对路径(不用赋予脚本x【可执行】权限)

      • 系统另起一个bash进程专门用于解析脚本,所以不用赋予x权限

    • 直接输入脚本的相对路径或绝对路径(前提是脚本要有x权限)

      1. 给脚本赋予x权限:chmod +x 脚本路径

      2. 然后输入绝/相对路径调用脚本

        image-20230824162939128

        • 在脚本所在目录无法通过访问脚本名来调用

          image-20230824163038480

          • 因为系统把该脚本当作是命令

        • 如果要调用直接使用相对路径:./脚本名

          image-20230824163313121

    • 在脚本的路径前加上.或者 source

      image-20230824163615602

      • 子shell:使用bash/sh或者是直接访问脚本路径,本质是打开了一个子shell进程嵌套在当前shell中

        • 当脚本内容执行结束,子shell关闭,返回到父shell

        • 如果直接使用bash不跟路径就会进入子shell中,按exit退回父shell

          image-20230824164741960

        • 开不开子shell 的区别就在于环境变量的继承关系,如在子shell中设置的当前变量,父shell 是不可见的

      • 使用.或者 source不会打开子shell,直接在当前shell进程中把shell脚本每一行命令都拿出来逐行解析

        • 在子shell修改环境变量的时候,父shell不生效,此时就要使用source/.

!!!变量

  • 变量可以认为是内存中存储的一块数据

分类
  • linux中的变量有两种分类方式

    • 系统变量(预定义)和用户变量(自定义)

    • 全局变量和局部变量(只对当前shell可见)

系统预定义变量
  • 常用的系统变量:$HOME、$PWD、$SHELL、$USER

  • 查看变量

    • 查看所有环境变量:env/printenv

    • 查看具体系统环境变量

      • echo$变量(如果要使用环境变量都要带上$,例如ls $HOME)

        image-20230824170218597

      • printenv 变量【不用带$】

    • 查看当前定义的所有变量:set

自定义变量
  • 语法

    • 定义变量:变量名=变量值,注意=号前后不能有空格,定义的是局部变量

      • export 变量名:将局部变量导出成全局变量

      • 注意:对变量的更改只在当前shell生效【子shell修改的父shell变量,在父shell中不改变】

    • 撤销变量:unset 变量名

    • 声明静态变量:readonly 变量,只读变量,不能修改和unset

  • 定义规则

    • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写

    • 等号两侧不能有空格

    • 在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算

    • 变量的值如果有空格,需要使用双/单引号括起来

特殊变量
  • $ n:n 为数字

    • $0代表该脚本名称

    • $1-$9 代表第一到第九个参数

    • 十以上的参数需要用大括号包含,如${10}

    • 注意,双引号中有$会当作特殊符号,而单引号会直接输出$字符

image-20230824174947474

image-20230824175037853

  • $#:获取所有输入参数个数,常用于循环、判断参数的个数是否正确以及加强脚本的健壮性

image-20230824175818870

image-20230824175842474

  • 获取命令行中所有的参数

    • $*:所有的参数看成一个整体

    • $@:把每个参数区分对待

  • $?最后一次执行的命令的返回状态,如果

    image-20230824184850681

    .

    • 这个变量的值为0,证明上一个命令正确执行

    • 如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确yu

运算符
  • 计算运算式的结果

    • $((运算式))$[运算式]

    • expr 运算式,弊端如下

      • 运算式中每个数字和符合需要用空格分开,相当于把数字和符合都作为参数

        • expr 5 + 2

      • 为变量赋值的时候需要使用命令替换【即把某个命令执行的结果替换过来】

        • a=$(expr 5 + 2)

        • a="expr 5 + 2"

      • 使用*做乘法时需要转义

        • exper 5 /* 2

  • 定义加法运算脚本

    • 编写脚本sum=$[ $1 + $2 ]

      image-20230825235254614

    • 添加可执行权限

      image-20230825235622381

    • 测试

      image-20230825235642421

条件判断

  • 语法

    • test 条件

    • [ 条件 ] 【注意要空格】

  • 捕获条件判断的结果:echo $?

    • 通过检验上一条命令是否执行成功,原命令结果成功则返回0,失败返回1

      • 与其它编程语言相反

    • 空值也返回false--》1

  • 条件

    • =两边

      • 有空格是等于

      • 没空格是赋值

    • 整数比较

      • -eq 等于 (equal)、-ne 不等于(not equal)

      • -lt 小于(less than)、-gt大于(greater than)

      • -le 小于等于 (less equal)、-ge 大于等于(greater equal)

    • 按照文件进行判断

      image-20230826000935218

      • -r有读的权限 (read)

      • -w有写的权限(write)

      • -x有执行的权限 (execute)

    • 按照文件类型进行判断

      • -e 文件存在 (existence)

      • -f 文件存在并且是一个常规的文件 (file)

      • -d 文件存在并且是一个目录 (directory)

    • 与或非同其它编程语言,满足短路运算

      • 同一个中括号中使用与/或运算需要用-a/o

!!!流程控制

分支流程
if
单分支
  • 分号代表一行里面可以分开实现两个命令

if [ condition ]; then 程序; fi
或者
if [ condition ]
then
	程序
fi
  • 字符串参数为空的处理方式

    if [ "$1"x = "liao"x ]
    then
    	echo hello
    fi

    image-20230829115156465

    • 如果没加x进行拼接,且参数为空会报错

      image-20230829114644599

  • 单分支实现多条件判断

    • 中括号内部的逻辑关系用-a/o表示与/或

a=25
方式1
if [ $a -gt 20 ] && [ $a -lt 30 ]; then echo ok; fi
方式2
if [ $a -gt 20 -a $a -lt 30 ]; then echo ok; fi

image-20230829120400861

.

多分支
if [ condition ]
then 
	程序
elif [ condition ]
then
	程序
else
	程序
fi
  • 实例

if [ $2 -lt 18 ]
then
        echo 未成年
elif [ $2 -lt 35 ]
then
        echo 青年
else
        echo 中老年
fi

image-20230829121437855

.

case
case $变量名 in 
"值1")
	如果变量的值等于值 1,则执行程序1
;; #结束当前分支,类似于break
"值2")
	如果变量的值等于值 2,则执行程序2
;;
...省略其他分支...
*) #类似于default
	如果变量的值都不是以上的值,则执行此程序
;;
esac
  • 测试

case $1 in
1)
        echo "one"
;;
2)
        echo "two"
;;
3)
        echo "three"
;;
*)
        echo "else"
;;
esac

image-20230829132448543

.

循环流程
for
  • 语法1

    for (( 初始值;循环控制条件;变量变化 ))
    do
    	程序
    done
    • 测试:计算1加到100

      • shell中有类似有i++的语法,但是没有+=相关语法

      • 双小括号内可以直接使用<=等数学上的运算式

    #!/bin/bash
    for (( x=1; x<=$1; x++ ))
    do
            sum=$[ $sum + $x ]
    done
    echo $sum

    image-20230829134437803

    .

  • 语法2

    for 变量 in 值1 值2 值3...
    do
    	程序
    done
    • 测试

      • in后面可以跟一个序列{},{start..end}:生成从start到end的一串数字

    for os in windows mac linux; do echo $os; done
    for num in {1..10};do echo $num; done #生成1到10的数字

    image-20230829135720909

    .

    image-20230829140117679

    .

  • $*和$@的区别

    • 如果没有被双引号引起来,二者没有区别

    image-20230829141237304

    image-20230829141203787

    • 被双引号引起来,$*把所有元素当成一个整体,$@把所有元素作为独立数据

    image-20230829141440538

    image-20230829141508490

while
  • 循环变量需要在外部定义

while [ condition ]
do
	程序
done
  • 测试:输出1-100的和

    • 拓展:使用let内嵌命令就可以用类似于其它编程语言的运算语法

i=$1
while [ $i -le $2 ]
do
        #sum=$[ $sum + $i ]
        #i=$[ $i + 1 ]
        let sum+=i
        let i++
done
echo $sum

image-20230829155046827

.

!!!读取控制台输入

  • read [选项] [指定读取值的变量名]:读取控制台输入的信息,类似于scanner(System.in)

    • 选项

      • -p 提示信息:指定读取值时的提示符

      • -t:指定读取值时等待的时间 (秒),不加-t表示一直等待

  • 测试

read -t 10 -p "请输入信息" inf

image-20230829161113281

.

函数

  • 函数实际上是简化的脚本,脚本实际上是复杂的函数

系统函数
  • basename [string/pathname] [suffix]:会删掉包含最后一个/之前的所有前缀,然后将字符串显示出来

    • basename可以理解为取路径里的文件名称

    • suffix为后缀,basename 会将pathname 或string 中的指定sufix去掉

    image-20230829173134002

    .

    • 显示当前文件的文件名称:echo $(basename $0 .sh)

    image-20230829173628448

    .

  • dirname 文件的绝对路径

    image-20230829173839292

    .

    • 显示脚本文件所在目录的绝对路径

    cd $(dirname $0) #先切换到脚本文件所在位置
    echo $(pwd) #使用pwd命令输出当前的绝对路径

    image-20230829174322220

    .

自定义函数
  • []表示可省略

[function] funname[()]{
	Action
	[return int;] #只能返回0-255的整数,如果没有return则返回值为最后一条命令的执行情况
}
  • 测试

add(){
        sum=$[ $1 + $2 ]
        echo "两数之和"$sum
}
read -p "请输入第一个数" a
read -p "请输入第二个数" b
add $a $b       

image-20230829175756706

.

  • 获取函数结果

add(){
        sum=$[ $1 + $2 ]
        echo $sum
}
read -p "请输入第一个数" a
read -p "请输入第二个数" b
sum=$(add $a $b) #利用命令替换将输出的结果赋值给sum
echo "和的平方" $[ $sum * $sum ]

image-20230829180637880

.

文本处理工具

cut
使用
  • 功能:在文件中负责剪切数据,从文件的每行剪切字节、字符和字段,并将这些字节、字符和字段输出

  • cut [选项] filename

    • 选项

      • -f num:num表示列号,提取第几列

        • 截取多列用","分割

        • 截取一个区间用"-",如1-4、-4、4- 分别表示截取第1到4列、第4列之前、第4列之后

      • -d:分隔符,按照指定分隔符作为分割列(即分隔符也算一列),默认是制表符"\t"

      • -c num:按字符进行切割,num表示取第几列

    • 使用grep之后再使用cat不需要指定文本文件

测试
  • 数据准备

    • cut文本文件

      image-20230830165700603

    • passwd文件的bash信息

      image-20230830170102508

  • 按空格分割

    image-20230830165740134

  • :进行分割,同时截取

    • 第1、6、7列

      image-20230830170213957

    • 1到4列

      image-20230830170422875

    • 第4列之后

      image-20230830170923137

    • 第4列之前

      image-20230830170937748

  • 获取ip地址

    • ifconfig ens33 | grep netmask | cut -d " " -f 10

      image-20230830171456979

      .

      1. ifconfig ens33获取ip地址相关信息

      2. grep有ip地址的那一行的关键字

      3. 用空格分割,截取ip地址所在的列

    • 获取所有ip地址:ifconfig | grep netmask | cut -d " " -f 10

      image-20230830171821800

awk
使用
  • 功能:把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理

  • awk [选项] '/patternl/{action1} /pattern2/{action2}...' filename

    • pattern:在数据中查找的内容,就是匹配模式

    • action:在找到匹配内容时执行的一系列命令

    • 使用grep之后再使用awk不需要指定文本文件

    • 选项

      • -F:指定输入文件分隔符,awk的分隔符不计入列

      • -v:赋值一个用户定义变量

内置变量
  • FILENAMEG:文件名

  • NR:已读的记录数(行号)

  • NF:浏览记录的域的个数(切割后,列的个数)

  • 测试

    • 输出文件名、行号以及分割后的列数awk -F ":" '{print "文件名:" FILENAME "当前行号:" NR "列数:"NF }' /etc/passwd

    image-20230830224837567

    • 查询ifconfig输出结果中空行的行号ifconfig | awk '/^$/{print NR}'

      image-20230830225303796

      .

    • 使用awk获取ip地址ifconfig | awk '/netmask/{print $2}'

      image-20230830225839881

      .

测试
  • 数据准备:/etc/passwd

  • :分割,然后提取所有以root开头的行,输出

    • 第七列cat /etc/passwd | awk -F ":" '/^root/{print $7}'

    image-20230830174034822

    .

    • 第六、七列,并以","分割cat /etc/passwd | awk -F ":" '/^root/{print $6","$7}'

    image-20230830174521089

    .

  • 只显示第一、七列,并以","分割,且在开头添加"user,shell",在最后一行添加"dahaige,/bin/zuishuai"

    • BEGIN在所有数据读取行之前执行;END在所有数据执行之后执行

    cat /etc/passwd | awk -F ":" 'BEGIN{print "user,shell"} {print $6","$7} END{print "dahaige,/bin/zuishuai"}'

    image-20230830175436292

    .

正则表达式入门

  • 正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在 Linux 中grep,sed,awk 等文本处理工具都支持通过正则表达式进行模式匹配

常用特殊字符

  • ^:匹配一行的开头

    image-20230829230651370

  • $:匹配一行的结束

    image-20230829230726379

  • .:匹配一个任意字符

    image-20230829232304239

  • *:不单独使用,和上一个字符连用,表示匹配上一个字符0次或多次

  • 指定开头字母和结尾字母^开头.*结尾$,如果是^$匹配的是空行

  • []:字符区间,表示匹配某个范围内的一个字符,例如

    • [6,8]------匹配6或者8

    • [0-9]------匹配一个0-9 的数字

    • [0-9]*------匹配任意长度的数字字符串

    • [a-z]------匹配一个a-z 之间的字符

    • [a-z]*------匹配任意长度的字母字符串

    • [a-c,e-f]------匹配a-c 或者e-f之间的任意字符

    image-20230830163450055

    .

  • \:表示转义,并不会单独使用

    • 由于所有特殊字符都有其特定匹配模式,当我们想匹配某一特殊字符本身时(例如找出所有包含$的行),就会碰到困难。此时就要将转义字符和特殊字符连用,来表示特殊字符本身

    image-20230830164217746

    .

  • {num}:配合前一个字符使用,重复num次

    • 使用{}是需要用-E,表示使用扩展的正则表达式

      image-20230830164730155

综合应用

归档文件

  • 实际生产应用中,往往需要对重要数据进行归档备份

  • 需求:实现一个每天对指定目录归档备份的脚本,输入一个目录名称(末尾不带/),将目录下所有文件按天归档保存,并将归档日期附加在归档文件名上,放在/root/archive下

  • 步骤

    1. 判断输入的归档目录的个数是否只有一个

    2. 判断目录是否存在

    3. 获取目录的绝对路径以及目录名称

    4. 获取当前日期

    5. 定义生成的归档文件名称和归档路径(/root/archive)

    6. 使用tar命令进行归档

    7. 判断是否归档成功

    8. 给当前用户赋予可执行权限

    9. 设置定时任务

  • 归档操作脚本

#!/bin/bash
#判断传入的归档目录个数,不为一直接退出
if [ $# -ne 1] 
then
        echo "error:归档目录个数有误"
        exit #退出脚本执行
fi
#判断该目录是否存在
if [ -d $1 ]
then
        echo #换行
else
        echo "目录不存在"
        exit
fi
#获取目录名称和所在路径
DIR_NAME=$( basename $1 )
DIR_PATH=$( cd $( dirname $1 ); pwd )
#获取当前时间,以生成归档文件的名称
DATE=$(date +%y%m%d )
#定义生成的归档文件名称
FILE=arch_${DIR_NAME}_$DATE.tar.gz
DEST=/root/archive/$FILE
#开始归档文件
echo "===========开始归档============"
tar -czf $DEST $DIR_PATH/$DIR_NAME
#判断是否归档成功
if [ $? -eq 0 ]
then
        echo "归档成功"
        echo "归档的文件为:"$DEST
else
        echo "error:归档失败"
fi
exit
  • 设置定时任务 crontab -e

0 2 * * * /root/scripts/arch ../scripts #每天凌晨两点进行任务

image-20230829225732973

.

发送消息

  • 可以利用Linux自带的mesgwrite工具,向其它用户发送消息

    • mesg y/n:开启/关闭mesg功能

    • who -T:查看所有登录的用户信息,并且有一个+/-号可以用于截取是否开启消息发送功能

    • write 发送给的用户 发送到的控制台(一个用户可以在多个控制台登录):向用户发送消息

  • 需求:实现一个向某个用户快速发送消息的脚本,输入用户名作为第一个参数,后面直接跟要发送的消息。脚本需要检测用户是否登录在系统中、是否打开消息功能,以及当前发送消息是否为空

  • 发送消息脚本

#查看用户是否登录
login_user=$(who | grep -i -m 1 $1 | awk '{print $1}') #-i表示忽略大小写,-m num表示最大匹配的行数为num行
if [ -z $login_user ] #-z表示是否为空
then
	echo "用户不在线"
	exit
fi
#查看用户是否开启消息功能
is_allow=$(who -T | grep -i -m 1 $1 | awk '{print $2}')
if [ $is_allow != "+" ]
then
	echo $1"没有开启消息通信功能"
	exit
fi
#确认是否有消息发送
if [ -z $2 ]
then
	echo "没有发送的消息"
	exit
fi
#从参数中获取发送的消息,第三列(第一个分隔符后面一列)开始都是发送的消息
msg=$(echo $* | cut -d " " -f 2-)
#获取用户登录的终端
terminal=$(who | grep -i -m 1 $1 | awk '{print $2}')	
#写入要发送的消息
echo $msg | write $login_user $terminal
#判断是否发送成功
if [ $? != 0 ]
then
	echo "发送失败"
else
	echo "发送成功"
exit

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值