基础篇

网络连接的三种方式

同一网段下(如在192.168.0下)的主机可以互相通信

三种方式:

  • 桥接模式:虚拟系统可以和外部系统相互通讯,但是容易造成IP冲突

  • NAT模式:网络地址转换模式,虚拟系统可以和外部系统相互通讯(通过代理),不造成IP冲突

  • 主机模式:独立系统,不与外部发生联系

Linux目录结构

特点:

  • 层级式的树状目录结构
  • linux中一切皆文件(linux会把硬件映射成文件来管理)

具体目录结构:

  • /bin :存放常用命令
  • /sbin:存放系统管理员使用的系统管理程序
  • /home:存放普通用户的主目录,目录名以用户账号命名
  • /root:系统管理员主目录
  • /lib:系统开机所需要的动态连接共享库
  • /lost+found:一般是空的,系统非法关机后会存放一些文件
  • /etc:系统管理所需的配置文件(.conf)和子目录
  • /usr:存放用户的应用程序和文件
  • /usr/local:给主机额外安装软件所存放的目录,一般通过编译源码方式安装的程序
  • /opt:给主机额外安装软件所存放的目录
  • /boot:存放启动linux的核心文件
  • /proc:虚拟目录,是系统内存的映射,访问该目录可获取系统信息
  • /srv:存放服务启动后需要提取的数据
  • /sys:该目录安装了文件系统sysfs
  • /tmp:存放临时文件
  • /dev:设备管理器,把所有硬件用文件形式存储
  • /media:linux识别U盘、光驱后,把这些设备挂载到该目录下
  • /mnt:该目录可挂载外部的存储(临时挂载其他文件系统)
  • /var:存惯存放经常被修改的目录,包括日志文件

远程登陆和文件传输

  • 准备工作:下载xshell和xftp

  • 使用ifconfig查看虚拟机ip

  • cmd ping 以上ip,确保互通

  • xshell和xftp的操作略,需要时看视频

vi和vim

常用快捷键(不声明则在标准模式下):

  • yy拷贝当前行,5yy拷贝当前行向下的5行,p粘贴至光标处
  • dd删除当前行,5dd删除当前行向下的5行
  • 查找:/关键字,回车查找,输入n查找下一个
  • 设置行号::set nu:set nonu
  • G到文档末行,gg到文档首行
  • ctrl+$ :跳转至某行末尾,ctrl+^:跳转至某行开头
  • u撤销
  • 跳转至第五行:5gg5G

tips:

  • 写文件名到一半,按tab有代码补全功能

关机重启

  • shutdown -h now:立刻关机
  • shutdown -h 1:1分钟后关机
  • shutdown -r now:立刻重启
  • halt:关机(使用该命令后虚拟机只是提示cpu已禁用,还需要在虚拟机里手动关机)
  • reboot:重启
  • sync:把内存数据同步到磁盘

tips:

  • 最好在关机和重启前执行sync,避免内存数据丢失,尽管关机重启前会默认执行sync,但小心为妙

登录注销

  • su - 用户名:切换用户,如 su - root 切换到管理员;从权限高的用户切换到权限低的用户,不需要密码,反之需要

  • shell(运行级别3,在GUI下不可)下输入logout可以注销用户,使用exit登出的效果类似

    假设第一次登录的用户是tom,tom使用 su - root 切换到管理员,此时logout,会从管理员变为tom,再logout,会退出系统

用户管理

增删用户

  • useradd 用户名:创建用户,并在/home下生成同名文件夹,作为该用户的文件夹
  • useradd -d 指定目录 用户名:把指定目录作为该用户的文件夹
  • passwd 用户名:设置某一用户的密码,如果不加用户名,设置的是当前登录用户的密码
  • userdel 用户名:删除用户,但保留家目录
  • userdel -r 用户名:删除用户,同时删除家目录

tips:

  • 删除用户前,最好使用logout退登,再重新登录root,防止删除普通用户时,这个用户还登陆着(如果从普通用户登录,使用su - root登录管理员,那么该普通用户仍保持着登陆状态)
  • 不要轻易删除家目录

查看用户

  • id 用户名:查看用户信息
  • whoami/who am i:查看当前第一次登录的用户信息

用户组

指令

  • groupadd 组名:新增组

  • groupdel 组名:删除组

  • useradd -g 用户组 用户名:创建用户,并将其添加至指定用户组

    如果直接使用useradd 用户名,会自动创建和该用户同名的组,再把该用户添加至这个组内

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

  • usermod -d 目录 用户名:改变该用户登录的初始目录(该用户必须拥有进入该目录的权限)

相关文件

  1. /etc/passwd

    用户的配置文件,记录用户的各种信息

    每行的含义:==用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell==

    Shell:linux内核是不认识各种指令的,可以认为shell帮助翻译了指令。一般情况下,shell是bash

  2. /etc/shadow

    口令的配置文件

    每行的含义:==登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志==

  3. /etc/group

    组配置文件,记录linux包含的组的信息

    每行的含义:==组名:口令:组标识号:组内用户列表==

用户级别

运行级别说明:

  • 0:关机

  • 1:单用户(找回丢失密码,视频在下一节,本人跳过)

  • 2:多用户状态,无网络服务

  • 3:多用户状态,有网络服务

  • 4:自定义

  • 5:图形界面

  • 6:重启

指令:

  • init [0123456]:切换运行级别

    init 0可关机,init 6可重启

  • systemctl get-default:查看默认运行级别

  • systemctl set-default target名称:修改默认运行级别

    target一般有两种:multi-user.target(级别3)和graphical.target

帮助指令

  • man 指令:获得某指令的帮助信息(按空格可以直接跳到下一页)
  • help 指令:获得shell内置命令的帮助信息

tips:

  • linux下,隐藏文件以 . 开头
  • 指令的选项可以组合使用,如ls -al和ls -la /root

文本处理

通配符

https://www.ruanyifeng.com/blog/2018/09/bash-wildcards.html

目录增删

  • ls -h:将文件大小以人类可以读懂的方式显示,如433M(不开-h,默认显示字节数)
  • ls -R:递归显示整个目录的内容
  • ll:相当于ls -l,显示详细信息。因此也可以写ll -ah
  • cd ~cd:回到自己的家目录,比如你是root,那么cd ~到 /root
  • mkdir -p:创建多级目录,如mkdir -p /home/animal/tiger。如果不加-p,linux必须得找到上一级目录才会创建下一级目录,否则会报错
  • cp -r 源目录 目标目录:递归复制整个文件夹,如cp -r /home/bbb /opt(将整个目录拷贝到/opt),如果需要强制覆盖不提示,把cp改为\cp
  • rm -r 目录:递归删除整个目录,如果需要强制删除不提示,再加-f选项

查看文件

知识补充:

  • 管道命令:把前一个命令的结果交给下一个命令处理,类似于命令的组合
  • cat -n 文件名:读文件,带行号。比vm读更安全,因为只能读不能改

  • more 文件名:读文件,并提供了多种交互功能,交互如下:

    • 空白:向下翻动一页
    • q:离开程序
  • cat -n 文件名| more:这是一个管道命令,把cat的结果交给more,好处:使用more也可以显示行号

  • less 文件名:交互比more更多,并且动态读取文本,而不是一下子把文本全部载入内存,推荐使用

    • PgUp:向上翻动一页
    • PgDn:向下翻动一页
    • /字串:向下搜寻【字串】的功能;n:向下查找;N:向上查找(记住它)
    • ?字串:向上搜寻【字串】的功能;n:向上查找;N:向下查找
    • G:跳转至末尾
    • g:跳转至开头
  • head 文件:查看文件前10行内容,tail查看后10行内容

  • head -n 5 文件:查看文件前5行内容

覆盖追加

  • echo 环境变量:查看环境变量,如echo $PATH

  • echo "内容":将内容打印在屏幕上,如echo “hello”

  • tail -f 文件:实时追踪文档的所有更新

>表示覆盖写,>>表示追加写

  • ls -l > 文件:将列表内容写入文件(目标文件不存在就会自动创建,下同)
  • cat 文件1 > 文件2:将文件1的内容覆盖到文件2
  • echo "内容" >> 文件 :将内容追加进文件
  • cal >> 文件:将日历信息追加进文件

补充:

  • > 文件也可以用于创建文件
  • echo "" > 文件可以用于把文件置空

软链接

软链接又称为符号链接,类似于win中的快捷方式,存放了链接其他文件的路径

  • ln -s 原文件或目录 软链接名:为原文件创建一个软链接

    创建好指向某一目录的软链接,并cd进入软链接以后,使用ls,看到的列表 和 在原目录下看到的列表 一致

    使用pwd查看目录时,仍然看到的是软链接所在目录

  • rm 软链接名:删除软链接,如rm /home/myroot

历史

  • history:显示所有的历史指令
  • history 10:显示最近使用过的10个指令
  • !5:执行历史编号为5的指令

补充

  • 批量创建文件:touch file{0..9}.txt
  • 批量删除文件:rm -f file{0..9}.txt
  • 批量创建文件夹:mkdir dir{0..9}
  • 批量删除文件夹:rmdir dir{0..9}或者rm -rf dir{0..9}

时间日期

字母注意大小写:

  • date:显示当前时间

  • date +%Y :显示当前年份

  • date +%m:月份

  • date +%d:天

  • date "+%Y-%m-%d %H:%M:%S":显示年月日时分秒

    引号内除第一个加号必需,后面的-和空格只是起修改格式的作用,可以任意修改

搜索查找

  • find 搜索范围 选项: 从指定目录向下递归地遍历各个子目录,将满足条件的文件或目录显示在终端

    • -name 按指定文件名查找
    • -user 查找属于某一用户名的所有文件
    • -size 按照大小查找,+n大于,-n小于,n等于,如find / -size +200M
    • 查找一类文件,使用通配符,如查找某一目录下全部.txt文件:find *.txt

    可以组合使用 | less,避免显示内容过长不便于阅读

  • locate 文件名:快速定位文件路径

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

    使用locate之前,先使用updatedb更新locate数据库

  • which 指令名:查看指令所在的目录

  • grep 选项 查找内容 文件名:筛选文件的特定内容

    • -n:显示匹配行及行号
    • -i:忽略字母大小写
    • -v:反向匹配

    可以直接用grep,也可以用管道指令,如==grep -n “yes” hello.txt== 等价于 ==cat hello.txt | grep “yes”==

压缩和解压

  • gzip 文件:将文件压缩为*.gz文件(将原本的文件变为压缩文件,而不是新生成压缩文件)

  • gunzip 压缩文件:解压缩

  • zip 选项 压缩后的文件名 目录或文件 :压缩文件,选项-r表示递归压缩

    在“压缩后的文件名”处还可以提供压缩后文件所在的目录

    如zip -r /opt/myhome.zip /home,表示将home目录及其包含的文件和子目录都压缩为/opt目录下的myhome.zip文件,同时原目录/文件被保留,相当于新生成了压缩文件

  • unzip 压缩文件:解压缩

    • unzip -d 目录 压缩文件:指定压缩文件解压缩到某个目录下,如unzip -d /tmp /home/myhome.zip,表示将该压缩文件解压到/tmp目录下
  • tar 选项 xxx.tar.gz 打包的内容:打包目录,压缩后的文件格式.tar.gz

    选项:

    • -c:产生.tar打包文件
    • -v:显示详细信息
    • -f:指定压缩后的文件名
    • -z:打包同时压缩
    • -x:解包.tar文件
    • -C:解压到的位置

    案例:

    • ==tar -zcvf test.tar.gz a.txt b.txt==:压缩多个文件(空格分隔文件名)
    • ==tar -zcvf test.tar.gz /dir==:压缩某个目录
    • ==tar -zxvf test.tar.gz==:解压到当前目录
    • ==tar -zxvf test.tar.gz -C /opt==:解压到/opt目录下

linux组

修改所有者和所在组

linux中的每个文件有所有者、所在组、其它组的概念

  • chown 用户名 文件名:修改文件/目录的所有者
  • chown 用户名:组名 文件/目录:同时修改文件/目录的所有者和所在组
  • chgrp 组名 文件名:修改文件/目录所在的组
  • -R:添加这个选项后,如果是目录,其下所有子文件或目录递归生效

权限

ls -l后,会看到很多信息,如:==-rwxrw-r– 1 root root 1213 Feb 2 09:39 abc==

0-9位说明:

  • 第0位确定文件类型:
    • -:普通文件
    • d:目录
    • l:软链接
    • c:字符设备文件,如鼠标、键盘
    • b:块设备文件,如键盘
  • 第1-3位确定所有者的权限,第4-6位确定所属组的权限,第7-9位确定其他用户的权限

rwx权限:

  • 到文件:
    • r:可读取、查看
    • w:可修改,但不代表可以删除文件,删除文件的前提条件是用户对文件所在的目录有写权限
    • x:可执行
  • 到目录:
    • r:可以用ls查看目录内容
    • w:可在目录内创建和删除(也可以删除目录),可以重命名目录
    • x:可以进入目录

其他说明:

  • 1:如果只有一个文件,则该数为1;如果是目录,该数 = 子目录数 + 目录下文件数(只用找一层)

修改权限

第一种方式:u:所有者,g:所属组,o:其它组,a:所有人

  • chmod u=rwx,g=rx,o=x 文件/目录名:设置权限
  • chmod o+w o+w 文件/目录名:增加权限
  • chmod a-x 文件/目录名:减少权限

第二种方式:r=4,w=2,x=1

  • chmod 751 文件/目录名等价于上方的第一条

实操篇

任务调度

crontab 任务调度

介绍

任务调度:指系统在某个时间执行的特定的命令或程序

分类:

  • 系统工作:有些重要的工作必须周而复始地进行,如病毒扫描等
  • 个别用户工作:个别用户可能希望执行某些程序,比如对mysql数据库的备份(也可以只是执行一条简单指令)

指令:

  • crontab 选项
    • -e:编辑crontab定时任务
    • -l:查询crontab任务(列出当前有哪些任务调度)
    • -r:删除当前用户所有的crontab任务(终止任务调度)
  • service crond restart:重启任务调度

操作:

  • 设置任务调度:crontab -e
  • 输入任务到调度文件,如:==*/1 * * * * ls -l /etc > /tmp/to.txt==,意思是每分钟执行ls -l /etc…这个指令

5个占位符的说明:

项目 含义 范围
第一个 * 一小时中的第几分钟 0-59
第二个 * 一天中的第几小时 0-23
第三个 * 一个月中的第几天 1-31
第四个 * 一年中的第几月 1-12
第五个 * 一周中的星期几 0-7(0和7代表星期日)

星期几和几号最好不要同时出现,容易使人混乱

特殊符号的说明:

特殊符号 含义
* 代表任何时间
, 代表不连续的时间,如”0 8,12,16 * * *”命令,表示在每天8:00,12:00,16:00都执行一次命令
- 代表连续的时间,如”0 5 * * 1-6”命令,表示在周一到周六的凌晨5点执行命令
*/n 代表每隔多久执行一次,如”*/10 * * * *”命令,表示每隔10分钟就执行一次命令

执行脚本

将命令写入脚本,通过执行脚本来执行命令:

  1. vim xxx.sh 写入内容,如 date >> /home/mycal 和 cal >> /home/mycal
  2. 给xxx.sh增加执行权限,chmod u+x xxx.sh
  3. crontab -e增加 ==*/1 * * * * xxx.sh==

at 定时任务

介绍

简介:

  • at命令是一次性定时计划任务,at的守护进程atd会以后台模式运行,检查作业队列来运行
  • 默认情况下,atd守护进程每60s检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业
  • at命令执行完一个任务后,以后不再执行此任务
  • 使用at命令时需要保证atd进程的启动,可以使用ps -ef | grep atd来检测atd是否在运行(ps -ef 用于检测当前运行的所有进程)

at命令格式:

  • at 选项 时间:添加at任务
  • atq:查看系统中没有执行的工作任务
  • atrm 编号:从队列中删除指定编号的任务
选项 含义
-m 当指定的任务被完成后,将给用户发送邮件,即使没有标准输出
-I atq的别名
-d atrm的别名
-v 显示任务将被执行的时间
-c 打印任务的内容到标准输出
-V 显示版本信息
-q <队列> 使用指定队列
-f <文件> 从指定文件读入任务,而不是从标准输入读入
-t <时间参数> 以时间参数的形式提交要运行的任务

at时间定义:

实践

输入at指令开始编辑后,退出时,按两次ctrl + D

  • 案例1:2天后的下午5点执行 ls /home:

    at 5pm +2days

    ls /home

  • 案例2:2分钟后,输出时间到指定文件内:

    at now +2minutes

    date > /root/date.log

磁盘分区与挂载

简介

每块硬盘有多个分区,而linux系统中有多个目录,所谓“挂载”,就是把一个分区和一个目录联系起来

真正存放数据的是分区,比如在下图中,如果在/home下创建文件,就会把该文件存入分区1

硬盘说明:

  • linux硬盘分为IDE硬盘SCSI硬盘,目前以后者为主
  • IDE硬盘的标识为”hdx~“,SCSI硬盘的标识为”sdx~“
  • x为盘号,a为基本盘,b为基本从属盘,c为辅助主盘,d为辅助从属盘(或简单理解为第一个盘、第二个盘…)
  • ~代表分区,前四个分区用1到4表示,它们是主分区或拓展分区。从5开始是逻辑分区

指令:

  • lsblk:查看设备挂载情况
  • lsblk -f:信息更详细,显示磁盘每个分区对应的40位唯一标识符(当且仅当分区格式化后,才会生成该UUID)

增加磁盘实例

步骤:虚拟机添加硬盘→分区→格式化→挂载→设置可以自动挂载

  • 虚拟机添加硬盘:vmware内操作,设置→添加硬盘→一路下一步

    reboot 重启系统才能识别新的硬盘

  • 分区:

    • fdisk /dev/sdb开始对/sdb 分区,具体操作:

      1. 开始分区后输入n,新增分区

      2. 然后选择p,分区类型为主分区

      3. 两次回车,默认剩余全部空间

      4. 输入w

      m:显示命令列表

      p:显示磁盘分区,同 fdisk -l

      n:新增分区

      d:删除分区

      w:写入并退出

      q:不保存退出

  • 格式化磁盘:

    • mkfs -t ext4 /dev/stb1:格式化命令,其中ext4是分区类型
  • 挂载:

    • mount 设备名称 挂载目录:如 mount /dev/sdb1 /newdisk
    • umount 设备名称/挂载目录:卸载命令,如 umount /dev/sdb1 或 umount /newdisk
    • 注意:用命令行挂载,重启后会失效
  • 设置自动挂载:修改/etc/fstab,添加完成后,执行mount -a即刻生效(重启也可生效)

    最前面的UUID也可以填写设备名称,如/dev/sdb1,最后两个参数写 0 0(目前不懂)

取消挂载的情况

情景:当取消挂载后,原文件夹里的文件访问不到了,如何解决?

比如说,先创建了dir1,把/dev/sdb1 挂载到dir1上,并在dir1内创建了几个文件。现在取消挂载,再进入dir1,发现找不到这些文件了。

做法:再创建dir2,把/dev/sdb1 挂载到dir2上,就能找回那些文件了

转移硬盘的情况

(以下内容是自己总结的,未必准确,以后可能修改)

情景:/dev/sdb1此时挂载在dir上,现在我们想让/dev/sdb2挂载到dir上

做法:

  • 创建新的目录/new,使用mv /dir/* /new将dir中的内容剪切过去
  • 取消挂载
  • 将另一块硬盘挂载到/new目录下

磁盘情况查询

  • df -h:查询系统整体磁盘使用情况

  • du -h:查询指定目录的磁盘占用情况,默认为当前目录

    选项:

    • -h:带计量单位
    • -a:带文件,而不仅是子目录
    • –max-depth=1:子目录深度
    • -c:列出明细的同时,增加汇总值

    应用:==du -hac –max-depth=1 /opt==可查询/opt目录的磁盘占用情况,深度为1

磁盘实用指令

grep可以接收一个正则表达式,以下指令如果不加 wc -l,则页面上只显示文件/文件夹:

  1. ls -l /opt | grep "^-" | wc -l:统计/opt目录下文件的个数
  2. ls -l /opt | grep "^d" | wc -l:统计/opt目录下一级子目录的个数
  3. ls -lR /opt | grep "^-" | wc -l:统计/opt目录下全部文件的个数,包括子目录里的
  4. ls -lR /opt | grep "^d" | wc -l:统计/opt目录下全部目录的个数,包括子目录里的
  5. tree 目录:以树状显示目录结构,需要先yum install tree按照tree指令

网络配置

原理

NAT网络配置原理图:

可见,linux虚拟机和vmnet8的ip地址是一样的

指令:

  • ipconfig:查看windows的网络配置
  • ifconfig:查看linux的网络配置
  • ping 目的主机:测试当前服务器是否可以连接目的主机

配置静态ip

默认情况下,linux的ip是自动获取的,每次获取的ip地址可能不一样,因此我们需要指定ip

指定ip的方法:vi /etc/sysconfig/network-scripts/ifcfg-ens33

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
# 从DHCP修改为static
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="49034b55-e0a4-4493-a105-50ab889139ad"
DEVICE="ens33"
ONBOOT="yes"
#IP地址
IPADDR=192.168.200.130
#网关
GATEWAY=192.168.200.2
#域名解析器
DNS1=192.168.200.2

修改后,使用service network restartreboot生效

同时,还要修改vmware中虚拟网络编辑器中的ip,和xshell的属性(见视频)

主机名和hosts映射

Hosts:一个文本文件,用来记录IP和Hostname(主机名)的映射关系

设置主机名

  • hostname:查看主机名
  • vi /etc/hostname:指定主机名
  • 重启生效

设置hosts映射

windows→linux:在C:\Windows\System32\drivers\etc\hosts 文件指定即可,如

1
192.168.200.130 centos7.6

linux→windows:在/etc/hosts 文件指定,如

1
192.168.200.1 win10

进程管理

在linux中,每个执行的程序都称为一个进程,每一个进程都分配一个pid(进程号)

每个进程都可能以前台后台两种方式存在,前台是用户目前的屏幕上可以操作的进程,后台是实际在操作,但屏幕上无法看到的进程

一般系统发服务通常以后台进程的方式存在,常驻系统中,直到关机才结束

查看进程

ps:用于查看目前系统中的进程状况

选项:

  • -a:显示当前终端的所有进程信息(不是所有进程)
  • -u:以用户的格式显示进程信息
  • -x:显示后台进程运行的参数
  • -e:显示所有进程
  • -f:全格式

查看有无特定服务:ps -aux | grep xxx,比如查看有无sshd服务

ps -aux

使用ps -aux:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
用户名称 进程号 占用CPU百分比 占物理内存百分比 占用虚拟内存大小(KB) 占用物理内存大小(KB) 终端名称(缩写,因此显示?) 进程状态 启动时间 使用CPU的时间 启动进程所用的命令和参数(太长会截断显示)

关于进程状态STAT:

  • S:睡眠
  • s:表示该进程是会话的先导进程
  • N:表示进程比普通优先级更低的优先级
  • R:正在运行
  • D:短期等待
  • Z:僵尸进程
  • T:被跟踪或被停止

ps -ef 与父子进程

ps -ef:以全格式显示当前所有的进程

UID PID PPID C STIME TTY TIME CMD
用户名称 进程号 父进程ID 见下方 进程启动的时间 终端名称 使用CPU的时间 启动进程所用的命令和参数

C:CPU用于计算执行优先级的因子。数值越大,表明进程是CPU密集型运算,优先级降低;数值越小,表面进程是I/O密集型运算,优先级升高

父子进程:进程存在父子关系,先有父进程,再由父进程创建子进程,如图所示为sshd(远程登陆服务)的相关进程:

终止进程

指令:

  • kill [选项] 进程号:通过进程号杀死/终止进程;-9选项 表示强迫进程立即停止

  • killall [选项] 进程名称:通过进程名杀死进程;同时,杀死父进程时也会杀死它的子进程;支持通配符

  • pkill [选项] 进程名称:和killall类似,杀死指定名字的所有进程

最佳实践:

  • 踢掉某个非法登录用户:kill 进程号(查看sshd进程,找到进程号)

  • 终止远程登录服务sshd,在适当的时候再次重启sshd服务:

    kill sshd 进程号

    重启:/bin/systemctl start sshd.service

  • 终止多个gedit(文本编辑器):killall gedit

  • 强制杀死一个终端:kill -9 bash的进程号

查看进程树

pstree 选项可以直观查看进程信息

选项:

  • -p:显示进程的PID
  • -u:显示进程的所属用户

动态监控进程

top指令和ps类似,不同之处是它在执行一段时间后可以更新正在运行的进程

top -d 秒数:指定top每隔几秒更新,默认3秒

其他选项:

  • -i:使top不显示任何闲置或僵尸进程
  • -p:通过指定监控进程ID,来仅仅监控某个进程的状态

交互操作:

  • P:以CPU使用率排序,默认就是此项
  • M:以内存使用率排序
  • N:以PID排序
  • q:退出topt

应用实例:

  • 监视特定用户:top → u →输入用户名
  • 终止指定进程,如结束tom登录:top → k → 要结束进程的ID号

监控网络状态

netstat指令:

  • netstat [选项]
    • -an:按一定顺序排列输出
    • -p:显示哪个进程在调用

如:netstat -anp | grep sshd可查看sshd服务的信息

netstat -anp:

Local Address指本机地址,Foreign Address指和本机某端口建立通信的外部地址

两个端口建立通信的示意图:

端口占用情况

命令:lsof -i:port,port为端口号

服务管理

守护进程是一类在后台运行的特殊进程,用于执行特定的系统任务。 很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。 另一些只在需要的时候才启动,完成任务后就自动结束。

后台程序 ~ 服务 ~ 守护进程

service

service管理指令:

  • service 服务名 [start|stop|restart|reload|status]
  • 在centos7.0后,很多服务不再使用service,而是使用systemctl
  • service指令管理的服务在/etc/init.d查看

查看服务名:

  • setup:查看全部系统服务

chkconfig

chkconfig指令:可以给服务的各个运行级别设置自启动/关闭(在centos7.0后,很多服务使用systemctl,管理的服务在/etc/init.d查看)

  • chkconfig --list [|grep xxx]:查看全部服务

  • chkconfig 服务名 --list:查看某项服务

  • chkconfig --level 数字 服务名 on/off:对服务的各个运行级别设置自启动/关闭,需要重启生效

    如:chkconfig –level 3 network off

systemctl

systemctl管理指令:它管理的服务在/usr/lib/systemd/system查看

  • systemctl [start|stop|restart|status] 服务名:如果选择stop,只是临时关闭服务,下次启动还看is-enabled
  • systemctl list-unit-files [|grep 服务名]:查看服务开机启动状态
  • systemctl enable 服务名:设置服务(在3和5级别下)开机启动
  • systemctl disable 服务名:关闭服务(在3和5级别下)开机启动
  • systemctl is-enabled 服务名:查询某个服务是否是自启动的

firewall

防火墙:外界想要访问服务器ip(比如192.168.200.130)下的某个端口(如111),要先经过防火墙。防火墙将一些端口开放,将一些端口关闭,如果外界访问了关闭的端口,则访问失败

比如防火墙未开放111端口,此时在windows telnet 192.168.200.130 111会失败

防火墙指令:

输入netstat -anp | more,最前面一列可以看到端口对应的协议

  • firewall-cmd --permanent --add-port=端口号/协议:打开端口
  • firewall-cmd --permanent --remove-port=端口号/协议:关闭端口
  • firewall-cmd --reload:重新载入,使上方指令生效
  • firewall-cmd --query-port=端口/协议:查询端口是否开放

rpm

rpm类似于windows下的setup,是一个安装程序

rpm包名的基本格式:

指令:

  • rpm -qa:查询已安装的所有rpm软件包,一般使用 | grep xxx 过滤,如rpm -qa | grep firefox
  • rpm -q 软件包名:查询软件包是否安装,如 rpm -q firefox
  • rpm -qi 软件包名:查询软件包详细信息
  • rpm -ql 软件包名:查询软件包中的文件
  • rpm -qf 文件全路径名:查询文件所属的软件包,如 rpm -qf /etc/passwd,rpm -qf /root/install.log
  • rpm -e 软件包名:卸载rpm包,如rpm -e firefox,会将火狐卸载
    • –nodeps:无视依赖提醒,强制删除
  • rpm -ivh RPM包全路径名称:安装rpm包
    • -i:安装
    • -v:提示
    • -h:进度条

删除并安装火狐的全过程:

  1. rpm -e firefox,卸载火狐

  2. 进入桌面上的CentOS 7 x86_64,搜索出firefox的rpm包

  3. 为了方便操作,将其复制到/opt下

  4. 执行rpm -ivh /opt/firefox

yum

yum是一个shell前端软件包管理器,基于rpm包管理,能够从指定的服务器自动下载rpm包并安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包

指令:

  • yum list | grep 软件名:查询yum服务器是否有需要安装的软件
  • yum install 软件名:下载安装

shell

shell是一个命令行解释器,它为用户提供了一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序

执行shell脚本

要求:

  1. 脚本以 #!/bin/bash 开头
  2. 如果不用sh,脚本需要有可执行权限

脚本内容示例:

1
2
#!/bin/bash
echo "hello world"

执行方式:

  1. 首先赋予脚本+x权限,再输入脚本路径
  2. 不需要+x权限,直接sh 脚本路径

shell变量

shell的变量分为:系统变量和自定义变量

系统变量包括:$HOME、$PWD、$SHELL、$PATH、$USER等,可以 echo $HOME

set指令可以显示当前shell中的所有变量

shell变量的定义:

基本语法:

  • 定义变量:变量名=值(等号两边无空格)
  • 撤销变量:unset 变量名
  • 声明静态变量:readonly 变量名,静态变量不能unset
  • A=`命令`(反引号):运行里边的命令,并把结果返回给变量A
  • A=$(命令)与上边等价

定义变量的规则:

  • 规范:变量名为大写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!bin/bash
A=100
#输出变量需要加$,不加当字符串处理
#双引号可加可不加
echo A=$A
echo "A=$A"

readonly B=2
echo B=$B
#unset B 报错
C=`date`
D=$(date)
echo C=$C
echo D=$D

#多行注释
:<<!
D=1
E=2
F=3
!

设置环境变量

现有一个变量,想要在多个脚本中使用,为了避免对其重复定义,应设置为环境变量

基本语法:

  • export 变量名=变量值:将shell变量输出为环境变量/全局变量
  • source 配置文件:让修改后的配置信息立即生效
  • echo $变量名:查询环境变量的值

实践:

  1. 在/etc/profile文件中定义MY_TEST 环境变量

    在行尾添加:export MY_TEST=/opt/test

  2. source /etc/profile 刷新

  3. echo $MY_TEST,输出/opt/test,环境变量设置成功

位置参数变量

用于获取命令行的参数信息

基本语法:

  • $n:n为数字,$0代表命令本身,$1到$9代表第一到第九个参数,十以上的参数需要用括号包含,如${10}

  • $*:该变量代表命令行中所有的参数,$*把所有的参数看作一个整体

  • $@:也代表命令行中所有的参数,但$@会把每个参数区分对待(两者的区别见for循环部分)

  • $#:代表命令行中所有参数的个数

1
2
3
4
5
#!/bin/bash
echo 0=$0 1=$1 2=$2
echo 所有的参数=$*
echo $@
echo 参数的个数=$#

执行情况:

预定义变量

shell设计者事先已经定义好的变量,可以直接在shell脚本中使用

  • $$:当前进程的进程号

  • $!:后台运行的最后一个进程的进程号

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

    如果值为0,说明正确执行;反之不正确

1
2
3
4
5
6
7
8
#!/bin/bash
echo 当前执行的进程id=$$

#以后台的方式运行一个脚本(最后带&),并获取它的进程号
sh /opt/test/a.sh &

echo 最后一个后台方式运行的进程id=$!
echo 执行的结果是$?

执行情况:

运算符

三种方式,只记录前两种:

  • $((运算式)):不推荐
  • $[运算式]:推荐

实践:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
#案例1:计算(2+3)*4

RES1=$(((2+3)*4))
echo res1=$RES1

RES2=$[(2+3)*4]
echo res2=$RES2

#案例2:求出命令行两个参数的和 20 50
SUM=$[$1+$2]
echo sum=$SUM

执行情况:

条件判断

基本语法:[ condition ],注意空格

[ ]为假,[ xxx ]为真(任意字符串)

常用判断条件:

  • =:字符串比较
  • 整数比较:
    • -lt:小于
    • -le:小于等于
    • -eq:等于
    • -gt:大于
    • -ge:大于等于
    • -ne:不等于
  • 按照文件权限进行判断:
    • -r:有读的权限
    • -w:有写的权限
    • -x:有执行的权限
  • 按文件类型进行判断:
    • -f:文件存在并且是一个常规的文件
    • -e:文件存在
    • -d:文件存在并且是一个目录

流程控制

if,elif,else

基本语法:

1
2
3
4
5
6
7
8
9
if [ 条件判断式 ]
then
代码
elif [ 条件判断式 ]
then
代码
else
代码
fi

实践:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
#案例1:"ok"是否等于"ok"
if [ "ok" = "ok" ]
then
echo "equal"
fi

#案例2:23是否大于等于22
if [ 23 -ge 22 ]
then
echo "大于"
fi

#案例3:/opt/test/a.txt 目录中的文件是否存在
if [ -f /opt/test/a.txt ]
then
echo "存在"
fi

执行情况:

case

基本语法:

1
2
3
4
5
6
7
8
9
10
11
case $变量名 in
"值1")
代码
;;
"值2")
代码
;;
*)
代码
;;
esac

实践:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
#案例:当命令行参数是1时输出"周一",是2时输出"周二",其他输出"others"
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "others"
;;
esac

执行情况:

for

基本语法1:

1
2
3
4
for 变量 in 值1 值2 值3...
do
代码
done

基本语法2:

1
2
3
4
for (( 初始值;循环控制条件;变量变化 ))
do
代码
done

实践1:

1
2
3
4
5
6
7
8
9
10
11
12
#!bin/bash
#案例1:打印命令行输入的参数
#$*把参数当整体对待,$@把参数分开对待
for i in "$*"
do
echo "num is $i"
done
echo "======================================="
for j in "$@"
do
echo "num is $j"
done

执行情况:

实践2:

1
2
3
4
5
6
7
8
#!/bin/bash
#案例2:从命令行输入一个数n,将1~n的值累加
SUM=0
for(( i=1; i<=$1; i++ ))
do
SUM=$[$SUM+$i]
done
echo "SUM=$SUM"

while

基本语法:

1
2
3
4
while [ 条件判断式 ]
do
代码
done

实践:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
#案例:从命令行输入一个数n,将1~n的值累加
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "执行结果=$SUM"

数组

定义

定义数组:

1
2
3
4
5
array_name=(value1 value2 ... valuen)
# or
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2

读取

读取数组:${array_name[index]}

1
2
3
4
5
6
my_array=(A B "C" D)

echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"

执行脚本:

1
2
3
4
5
6
$ chmod +x test.sh 
$ ./test.sh
第一个元素为: A
第二个元素为: B
第三个元素为: C
第四个元素为: D

获取所有元素

获取数组内的所有元素:使用@ 或 *

接上例,添加:

1
2
echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"

执行:

1
2
3
4
$ chmod +x test.sh 
$ ./test.sh
数组的元素为: A B C D
数组的元素为: A B C D

获取数组长度

1
2
echo "数组元素个数为: ${#my_array[*]}"
echo "数组元素个数为: ${#my_array[@]}"

读取控制台输入

基本语法:

  • read 选项 参数

    选项:

    • -p:指定读取值时的提示符
    • -t:指定读取值时等待的时间,如果超时则不再等待

    参数:指定读取值的变量名(参数和前边必须用空格隔开)

实践:

1
2
3
4
5
6
7
8
#!/bin/bash
#案例1:读取控制台输入一个NUM1值
read -p "请输入一个数NUM1=" NUM1 #程序会被阻塞在这里,等待输入
echo "你输入的NUM1=$NUM1"

#案例2:读取控制台输入一个NUM2值,在10秒内输入
read -t 10 -p "请输入一个数NUM2=" NUM2
echo "你输入的NUM2=$NUM2"

函数

系统函数

basename:返回完整路径最后 / 的部分,常用于获取文件名

语法:basename [pathname] [suffix]

如果suffix被指定,则文件后缀如.txt也会被去掉

实例:basename /home/aaa/test.txt 返回test.txt,basename /home/aaa/test.txt .txt 返回test

dirname:返回完整路径最后 / 的前面的部分,常用于返回路径部分

语法:dirname [pathname]

实例:dirname /home/aaa/test.txt 返回/home/aaa

自定义函数

基本语法:

1
2
3
4
5
6
7
[ function ] funname[()]
{
Action;
[return int;]
}

调用直接写函数名:funname [值]

实践:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
#案例1:计算输入两个参数的和(动态获取),getSum
function getSum() {
SUM=$[$n1+$n2]
echo "SUM=$SUM"
}

read -p "请输入一个数n1=" n1
read -p "请输入一个数n2=" n2

getSum $n1 $n2

执行情况:

高级篇

日志管理

介绍

日志是用来记录重大事件的工具

/var/log是系统日志文件的保存位置

系统常用的日志:

应用案例:

使用root用户通过xshell6登录,第一次使用错误的密码,第二次使用正确的密码登录成功,可以查看/var/log/secure里记录的相关信息

日志管理服务

centos7使用的日志管理服务是rsyslogd(负责写日志),和以前版本的syslogd是兼容的,/etc/rsyslog.config 可以查看日志服务管理的文件有那些

  • ps aux | grep "rsyslog" | grep -v "grep":查看rsyslogd服务是否启动
  • systemctl list-unit-files | grep rsyslog:查询rsyslogd服务的自启动状态

配置文件 /etc/rsyslog.config:编辑文件时的格式为 *.*,其中第一个*代表日志类型,第二个*代表日志级别

日志类型:

名称 类型
auth pam产生的日志
authpriv ssh、ftp等登录信息的验证信息
corn 时间任务相关
kern 内核
lpr 打印
mail 邮件
mark(syslog)-rsyslog 服务内部的信息,时间标识
news 新闻组
user 用户程序产生的相关信息
uucp 主机之间相关的通信
local 1-7 自定义的日志设备

日志级别:

名称 级别
debug 有调试信息的,日志通信最多
info 一般信息日志,最常用
notice 最具有重要性的普通条件的信息
warning 警告级别
err 错误级别,某个功能或模块不能正常工作的信息
crit 严重级别,整个系统或整个软件不能正常工作的信息
alert 需要立刻修改的信息
emerg 内核崩溃等重要信息
none 什么也不记录

从上到下,级别从低到高,记录信息越来越少

由rsyslogd记录的日志文件,文件的格式包含以下4列:

  1. 事件产生的时间
  2. 产生事件的服务器的主机名
  3. 产生事件的服务名或程序名
  4. 事件的具体信息

自定义日志服务

在/etc/rsyslog.conf中添加一个日志文件/var/log/test.log,当有事件发生时,该文件会接收到信息并保存

生成了test.log,里面保存了全部信息,用grep筛选可以看到有关sshd的信息

日志轮替

介绍

日志轮替:把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围之后,就会进行删除

centos7使用logrotate进行日志轮替管理,配置文件为/etc/logrotate.conf,可以在该文件内进行全局配置,也可以进行局部配置(可以把局部配置写入该文件,也可以用别的方式,见自定义部分)

关于dateext参数:

  • 如果配置文件中有dateext参数,那么日志会用日期来作为日志文件的后缀,例如”secure-20210831”。这样日志名不会重叠,只需要指定保存日志个数,删除多余的日志文件即可

  • 如果没有该参数,日志文件需要改名。

    当第一次进行日志轮替时,当前”secure”日志会自动改名为”secure.1”,然后新建”secure”日志,用来保存新的日志。

    当第一次进行日志轮替时,当前”secure1”日志会自动改名为”secure.2”,以此类推。

其他参数说明:

参数 参数说明
daily 轮替周期为每天
weekly 每周
monthly 每月
rotate 数字 保留的日志文件的个数,0指没有备份
compress 日志轮替时,旧的日志进行压缩
create mode owner group 建立新日志,同时指定新日志的权限与所有者和所属组
mail address 当日志轮替时,输出内容通过邮件发送到指定的邮件地址
missingok 如果日志不存在,则忽略该日志的警告信息
notifempty 如果日志为空文件,则不进行日志轮替
minsize 大小 日志轮替的最小值(达到该最小值才会轮替,否则时间到了也不轮替)
size 大小 日志只有大于指定大小才进行日志轮替,而不是按照时间轮替
dateext 使用日期作为日志轮替文件的后缀
sharedscripts 在此关键字之后的脚本只执行一次
prerotate/endscript 在日志轮替之前执行脚本命令
postrotate/endscript 在日志轮替之后执行脚本命令

自定义日志轮替

把自己的日志加入日志轮替:

  • 方法一:直接在/etc/logrotate.conf中写入该日志的轮替策略(不推荐)
  • 方法二:在/etc/logrotate.d/目录中新建该日志的轮替文件,在该轮替文件中写入正确的轮替策略,因为该目录中的文件都会被”include”到主配置文件中,所以也可以把日志加入轮替(推荐,便于维护)

日志轮替原理

日志轮替依赖系统定时任务

在/etc/cron.daily/目录中,有可执行文件logrotate,logrotate通过这个文件完成定时任务执行

查看内存日志

journalctl可以查看内存日志,重启会清空,指令:

  • journalctl:查看全部

  • journalctl -n 3:查看最新3条

  • journalctl --since 19:00 --until 19:10:00:查看起始时间到结束时间的日志,可加日期

  • journalctl -p err:报错日志

  • journalctl -o verbose:日志详细内容

  • journal _PID=1245 _COMM=sshd:查看包含这些参数的日志

    或者journalctl | grep sshd

备份与恢复

linux的备份和恢复的两种方式:

  1. 把需要的文件(或分区)用TAR打包,下次需要恢复时,解压并覆盖即可
  2. 使用dump和restore命令

数据备份

首先安装dump和restore指令:yum -y install dump,会同时安装2个指令

dump支持分卷和增量备份,语法:

c是一个0到9的数,备份时从0开始,一直到9,然后又从0开始

关于备份层级:如果不理解可以再看看视频P133

实践1:将/boot分区所有内容备份到 /opt/boot.bak0.bz2 文件中,备份层级为”0”:

dump -0uj -f /opt/boot.bak0.bz2 /boot

实践2:在/boot目录下增加新文件,备份层级为”1”(只备份上次使用层次”0”备份后发生过改变的数据):

dump -1uj -f /opt/boot.bak1.bz2 /boot

通过dump命令配合crontab可以实现无人值守备份

查询操作:

  • dump -W:显示需要备份的文件以及最后一次备份的层级、时间、日期
  • dump -w:仅显示需要备份的文件
  • cat /etc/dumpdates:查看备份时间文件

注意,在备份分区时支持增量备份,如果备份文件或目录,不再支持增量备份,此时数字只能写0,也不能提供-u选项

如果是重要的备份文件,建议将文件上传到其他服务器保存,不要将鸡蛋放在同一个篮子里

数据恢复

restore命令用于恢复已备份的文件,可以从dump生成的备份文件中恢复原文件

基本语法:

  • restore [模式选项] [选项]

    模式选项:一次只能指定一种

    • -C:对比模式,将备份的文件与已存在的文件相互对比
    • -i:交互模式,在进行还原操作时,restore指令依序询问用户
    • -r:还原模式
    • -t:查看模式,看备份文件有哪些文件

    选项:

    • -f<备份设备>:从指定的文件中读取备份数据,进行还原操作

实践:

  • 使用对比模式:先将某文件改名,再执行restore -C -f boot.bak1.bz2
  • 使用查看模式,看备份文件有哪些数据/文件:restore -t -f boot.bak0.bz2
  • 使用还原模式,注意:如果有增量备份,需要把增量备份文件也进行恢复,有几个就要恢复几次,并且要按顺序恢复:

    restore -r -f /opt/boot.bak0.bz2:恢复到第1次完全备份状态

    restore -r -f /opt/boot.bak1.bz2:恢复到第1次增量备份状态