Linux 笔记
基础篇
网络连接的三种方式
同一网段下(如在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
查看虚拟机ipcmd ping 以上ip,确保互通
xshell和xftp的操作略,需要时看视频
vi和vim
常用快捷键(不声明则在标准模式下):
yy
拷贝当前行,5yy
拷贝当前行向下的5行,p
粘贴至光标处dd
删除当前行,5dd
删除当前行向下的5行- 查找:
/关键字
,回车查找,输入n
查找下一个 - 设置行号:
:set nu
和:set nonu
G
到文档末行,gg
到文档首行ctrl+$
:跳转至某行末尾,ctrl+^
:跳转至某行开头u
撤销- 跳转至第五行:
5gg
或5G
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 目录 用户名
:改变该用户登录的初始目录(该用户必须拥有进入该目录的权限)
相关文件
/etc/passwd
用户的配置文件,记录用户的各种信息
每行的含义:==用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell==
Shell:linux内核是不认识各种指令的,可以认为shell帮助翻译了指令。一般情况下,shell是bash
/etc/shadow
口令的配置文件
每行的含义:==登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志==
/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 -ahcd ~
或cd
:回到自己的家目录,比如你是root,那么cd ~到 /rootmkdir -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 $PATHecho "内容"
:将内容打印在屏幕上,如echo “hello”tail -f 文件
:实时追踪文档的所有更新
>表示覆盖写,>>表示追加写
ls -l > 文件
:将列表内容写入文件(目标文件不存在就会自动创建,下同)cat 文件1 > 文件2
:将文件1的内容覆盖到文件2echo "内容" >> 文件
:将内容追加进文件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分钟就执行一次命令 |
执行脚本
将命令写入脚本,通过执行脚本来执行命令:
vim xxx.sh
写入内容,如 date >> /home/mycal 和 cal >> /home/mycal- 给xxx.sh增加执行权限,
chmod u+x xxx.sh
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 分区,具体操作:开始分区后输入n,新增分区
然后选择p,分区类型为主分区
两次回车,默认剩余全部空间
输入w
m:显示命令列表
p:显示磁盘分区,同
fdisk -l
n:新增分区
d:删除分区
w:写入并退出
q:不保存退出
格式化磁盘:
mkfs -t ext4 /dev/stb1
:格式化命令,其中ext4是分区类型
挂载:
mount 设备名称 挂载目录
:如 mount /dev/sdb1 /newdiskumount 设备名称/挂载目录
:卸载命令,如 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,则页面上只显示文件/文件夹:
ls -l /opt | grep "^-" | wc -l
:统计/opt目录下文件的个数ls -l /opt | grep "^d" | wc -l
:统计/opt目录下一级子目录的个数ls -lR /opt | grep "^-" | wc -l
:统计/opt目录下全部文件的个数,包括子目录里的ls -lR /opt | grep "^d" | wc -l
:统计/opt目录下全部目录的个数,包括子目录里的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 | TYPE="Ethernet" |
修改后,使用service network restart
或reboot
生效
同时,还要修改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-enabledsystemctl 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 firefoxrpm -q 软件包名
:查询软件包是否安装,如 rpm -q firefoxrpm -qi 软件包名
:查询软件包详细信息rpm -ql 软件包名
:查询软件包中的文件rpm -qf 文件全路径名
:查询文件所属的软件包,如 rpm -qf /etc/passwd,rpm -qf /root/install.logrpm -e 软件包名
:卸载rpm包,如rpm -e firefox,会将火狐卸载- –nodeps:无视依赖提醒,强制删除
rpm -ivh RPM包全路径名称
:安装rpm包- -i:安装
- -v:提示
- -h:进度条
删除并安装火狐的全过程:
rpm -e firefox,卸载火狐
进入桌面上的CentOS 7 x86_64,搜索出firefox的rpm包
为了方便操作,将其复制到/opt下
执行rpm -ivh /opt/firefox
yum
yum是一个shell前端软件包管理器,基于rpm包管理,能够从指定的服务器自动下载rpm包并安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包
指令:
yum list | grep 软件名
:查询yum服务器是否有需要安装的软件yum install 软件名
:下载安装
shell
shell是一个命令行解释器,它为用户提供了一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序
执行shell脚本
要求:
- 脚本以 #!/bin/bash 开头
- 如果不用sh,脚本需要有可执行权限
脚本内容示例:
1 | !/bin/bash |
执行方式:
- 首先赋予脚本+x权限,再输入脚本路径
- 不需要+x权限,直接
sh 脚本路径
shell变量
shell的变量分为:系统变量和自定义变量
系统变量包括:$HOME、$PWD、$SHELL、$PATH、$USER等,可以 echo $HOME
set
指令可以显示当前shell中的所有变量
shell变量的定义:
基本语法:
- 定义变量:
变量名=值
(等号两边无空格) - 撤销变量:
unset 变量名
- 声明静态变量:
readonly 变量名
,静态变量不能unset - A=`命令`(反引号):运行里边的命令,并把结果返回给变量A
- A=$(命令)与上边等价
定义变量的规则:
- 规范:变量名为大写
1 | !bin/bash |
设置环境变量
现有一个变量,想要在多个脚本中使用,为了避免对其重复定义,应设置为环境变量
基本语法:
export 变量名=变量值
:将shell变量输出为环境变量/全局变量source 配置文件
:让修改后的配置信息立即生效echo $变量名
:查询环境变量的值
实践:
在/etc/profile文件中定义MY_TEST 环境变量
在行尾添加:export MY_TEST=/opt/test
source /etc/profile 刷新
echo $MY_TEST,输出/opt/test,环境变量设置成功
位置参数变量
用于获取命令行的参数信息
基本语法:
$n
:n为数字,$0代表命令本身,$1到$9代表第一到第九个参数,十以上的参数需要用括号包含,如${10}$*
:该变量代表命令行中所有的参数,$*把所有的参数看作一个整体$@
:也代表命令行中所有的参数,但$@会把每个参数区分对待(两者的区别见for循环部分)$#
:代表命令行中所有参数的个数
1 | !/bin/bash |
执行情况:
预定义变量
shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
$$
:当前进程的进程号$!
:后台运行的最后一个进程的进程号$?
:最后一次执行的命令的返回状态如果值为0,说明正确执行;反之不正确
1 | !/bin/bash |
执行情况:
运算符
三种方式,只记录前两种:
$((运算式))
:不推荐$[运算式]
:推荐
实践:
1 | !/bin/bash |
执行情况:
条件判断
基本语法:[ condition ]
,注意空格
[ ]
为假,[ xxx ]
为真(任意字符串)
常用判断条件:
- =:字符串比较
- 整数比较:
- -lt:小于
- -le:小于等于
- -eq:等于
- -gt:大于
- -ge:大于等于
- -ne:不等于
- 按照文件权限进行判断:
- -r:有读的权限
- -w:有写的权限
- -x:有执行的权限
- 按文件类型进行判断:
- -f:文件存在并且是一个常规的文件
- -e:文件存在
- -d:文件存在并且是一个目录
流程控制
if,elif,else
基本语法:
1 | if [ 条件判断式 ] |
实践:
1 | !/bin/bash |
执行情况:
case
基本语法:
1 | case $变量名 in |
实践:
1 | !/bin/bash |
执行情况:
for
基本语法1:
1 | for 变量 in 值1 值2 值3... |
基本语法2:
1 | for (( 初始值;循环控制条件;变量变化 )) |
实践1:
1 | !bin/bash |
执行情况:
实践2:
1 | !/bin/bash |
while
基本语法:
1 | while [ 条件判断式 ] |
实践:
1 | !/bin/bash |
数组
定义
定义数组:
1 | array_name=(value1 value2 ... valuen) |
读取
读取数组:${array_name[index]}
1 | my_array=(A B "C" D) |
执行脚本:
1 | chmod +x test.sh |
获取所有元素
获取数组内的所有元素:使用@ 或 *
接上例,添加:
1 | echo "数组的元素为: ${my_array[*]}" |
执行:
1 | chmod +x test.sh |
获取数组长度
1 | echo "数组元素个数为: ${#my_array[*]}" |
读取控制台输入
基本语法:
read 选项 参数
选项:
- -p:指定读取值时的提示符
- -t:指定读取值时等待的时间,如果超时则不再等待
参数:指定读取值的变量名(参数和前边必须用空格隔开)
实践:
1 | !/bin/bash |
函数
系统函数
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 | [ function ] funname[()] |
实践:
1 | !/bin/bash |
执行情况:
高级篇
日志管理
介绍
日志是用来记录重大事件的工具
/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 | 打印 |
邮件 | |
mark(syslog)-rsyslog | 服务内部的信息,时间标识 |
news | 新闻组 |
user | 用户程序产生的相关信息 |
uucp | 主机之间相关的通信 |
local 1-7 | 自定义的日志设备 |
日志级别:
名称 | 级别 |
---|---|
debug | 有调试信息的,日志通信最多 |
info | 一般信息日志,最常用 |
notice | 最具有重要性的普通条件的信息 |
warning | 警告级别 |
err | 错误级别,某个功能或模块不能正常工作的信息 |
crit | 严重级别,整个系统或整个软件不能正常工作的信息 |
alert | 需要立刻修改的信息 |
emerg | 内核崩溃等重要信息 |
none | 什么也不记录 |
从上到下,级别从低到高,记录信息越来越少
由rsyslogd记录的日志文件,文件的格式包含以下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的备份和恢复的两种方式:
- 把需要的文件(或分区)用TAR打包,下次需要恢复时,解压并覆盖即可
- 使用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次增量备份状态