前言
- 本文来源于3天搞定Linux,1天搞定Shell,清华学神带你通关_哔哩哔哩_bilibili
- 作者将视频内容进行总结和提炼,由于记笔记时图片使用本机相对路径,所以本篇博客上传时图片无法显示,请谅解,如果有图片需求,可以下载我上方绑定的pdf
入门
简介
-
Linux 是一款操作系统,免费,开源, 安全,高效,稳定, 处理高并发非常强悍,现在很多 的企业级的项目都部署到 Linux/unix服务器运行
-
发行版【最常用的是centOS和ubuntu】
-
ubuntu适合个人学习,且界面比centOS华丽
-
centOS适合企业开发(本课程选择)
-
注意:centOS7.9版本维护支持到2024.6
-
官方打算用centOS stream取代centOS(但稳定性会稍差),以后可以关注rocky
-
-
环境配置
-
安装vm虚拟机软件和centOS的Linux操作系统
创建虚拟机
-
由于虚拟机需要划分内存空间,所有安装位置需要选择内存足够大的磁盘
-
虚拟机要向物理机(主机)获取资源,需要参考本机配置,并确认本机已启用虚拟化
-
插槽1即cpu个数只有一个
-
内核:cpu独立出来的内部处理核心,提升性能的关键
-
逻辑处理器:利用超线程技术,每个内核可以扩展出两个逻辑内核
-
所以虚拟机分配的内核总数(处理器数量*每个处理器的内核数量)不能超过本机的12个
-
-
-
配置虚拟机网络类型
-
桥接:把主机当作桥,可以通过主机访问外部网络,和主机地位是平等的
-
nat:虚拟机完全依托于主机和外部进行网络连接(相当于把主机当成虚拟路由器),和主机对外是一个ip
-
安装linux到虚拟机
-
点开虚拟机设置-》使用iso映像文件-》找到下载好的centOS镜像
-
开启虚拟机,进行系统配置
-
配置软件选择(默认是最小配置,没有桌面环境),选择gnome桌面环境(kde相对华丽,初学先不使用)
-
-
点击安装目标位置,配置磁盘信息
-
linux没有盘符的概念(小拓展 A/B盘是软盘【历史】)
-
有根目录/,分区用文件夹代替(整个系统架构就是一个文件目录)
-
分区分好之后,要将该区域挂载到文件夹(挂载点)
-
如果没有挂载一律认为在根分区下
-
-
-
选定标准分区,+号新增挂载点
-
创建引导分区
-
必须单独设置出来,放在根目录下的boot(规定)
-
系统启动靠引导分区进行快速启动
-
-
文件系统
-
ext4:第四代扩展文件系统,总容量可以到达1EB(1024TB)
-
xfs:新的高性能日志文件系统,最大支持8EB,性能比ext4更强(centos7之后默认选定)
-
-
创建交换分区swap
-
单独设置硬盘中的一块区域,作为扩展内存(虚拟内存)
-
文件系统类型必须是swap类型
-
-
剩下的容量就放在根分区下
-
-
修改网络主机名,便于访问
-
禁用kdump
-
划分系统空间用于安全备份的,学习阶段如果崩了就直接重启,所以这里先禁用掉节省系统资源
-
-
设置密码,然后先创建一个普通用户,默认有root用户(超级管理员)
基础
基础设置
-
左上角的应用程序中可以对系统进行一些基础设置
-
键盘设置中,super即window键
-
文本编辑器可以用于编辑文档(常见)
-
添加输入法
-
在设置中添加汉语拼音输入
-
使用super+空格或者是shift就可以切换输入法
-
终端
-
linux终端本质是命令解释层(学习的重点),核心层即linux内核,命令解释层连接外部的应用和内核
-
打开终端
-
这里打开的终端实际上是命令解释层的仿真器
空白处右键
应用程序中
-
如果要打开正在意义的终端,可以使用ctrl+alt+f2进入,退回到图形化界面使用alt+f1
-
-
终端界面
-
用户@主机名
-
~表示当前所在位置,即当前在哪个目录下,如果~后面没有跟东西就是在主文件夹下
-
#输入命令的提示,普通用户是$为提示符
-
-
终端界面的首选项可以对界面展示进行配置
-
命令
-
tab键可以自动补全目录名
-
常用命令
-
ls:把当前目录下所有的文件和文件夹都列举出来
-
cd:切换目录
-
linux目录结构
-
linux 的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”,然后在此目录下再创建其他的目录
-
windows系统下层级用“\”划分,而linux用“/”划分(正斜杠,因为反斜杠是有转义作用,正斜杠没有转义的问题)
-
具体的目录结构(建议除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 文件名
-
右下角有当前光标位置(第几行第几列,已经当前位置的百分比)
-
编辑器的三种模式转换
具体操作
命令模式
-
保存并退出: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
-
编辑模式
-
进入编辑模式
-
退出:esc
网络配置
本机和虚拟机互相连接
-
查看ip地址
-
本机:可以在windows命令行下使用ipconfig
-
linux:终端使用ifconfig
-
-
连接
-
虚拟机连接主机:linux终端中使用 ping+ip
-
ctrl+c退出连接界面
-
-
主机连接虚拟机:命令行也是使用ping+ip(要确保linux有线已经连接)
-
-
ip地址前三段完全一样才在一个网段内
-
查看网关
-
主机向虚拟机传输文件:scp "文件" 会话名@IP地址:/对应的虚拟机下载目录
vm提供的连接模式
-
桥接模式:虚拟机直接连接外部物理网络的模式,主机起到了网桥的作用。这种模式下,虚拟机可以直接访问外部网络,并且对外部网络是可见的
-
缺点
-
ip地址前三段都要一样,保证和主机在同一局域网内,最后一段不一样,会占用一个ip地址
-
外部网络可以在同一局域网中访问到虚拟机,不安全
-
-
-
NAT 模式:虚拟机和主机构建一个专用网络,并通过虚拟网络地址转换 (NAT)设备对IP进行转换。虚拟机通过共享主机IP可以访问外部网络,但外部网络无法访问虚拟机
-
局域网里面虚拟出了新的局域网
-
为了保证主机可以和虚拟机通信,主机中设置了虚拟网卡vmnet8,用于连接虚拟路由器
-
-
仅主机模式:虚拟机只与主机共享一个专用网络,与外部网络无法通信
修改静态ip
-
windows系统下(主机)指定静态ip
-
虚拟机指定静态ip
-
图形化界面的方式
-
终端修改配置文件:/etc/sysconfig/network-scripts/ifcfg-ens33
-
将BOOTROTO(启动协议)由dhcp(动态分配ip)改成static(静态分配ip)
-
添加ip地址的配置IPADDR,网关GATEWAY,域名解析器DNS1
-
重启当前网络服务 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
-
配置主机名
-
查看当前主机名:hostname
-
配置主机名
-
在/etc/hostname目录中修改信息
-
直接hostnamectl set-hostname 名称
-
-
在hosts文件中(在/etc/hosts目录下)配置主机名和ip的映射关系
-
格式: ip 主机名
-
-
修改主机的hosts文件(C:\Windows\System32\drivers\etc),主机就可以通过主机名访问虚拟机
远程登录
-
命令行进行远程登录:ssh 用户@主机名
-
使用工具xshell进行远程登录
-
配置连接的主机名
-
配置连接的用户及密码
-
直接点击对应的连接即可远程登录
-
-
安装xftp可以进行远程文件传输
-
xftp的主机配置同xshell
-
如果出现中文乱码,在文件-》当前会话属性-》选项中修改字符编码为utf-8
-
系统管理
-
关键词查找对应文件信息:ls 目录对应文件 | grep 关键词
service服务管理
服务定义
-
计算机中,一个正在执行的程序或命令,叫做进程;启动之后一只存在、常驻内存的进程,一般被称作服务
-
守护进程和服务的关系,守护进程守护系统服务
服务管理的语法
-
systemctl start|stop|restart|status 服务名(centos7语法)
-
service 服务名 操作(centos6语法,但是7之后也兼容了)
查看服务
-
ls /usr/lib/systemd/system,其中
-
.service是服务文件
-
.target是一组服务的集合
-
网络服务
-
NetworkManger(centos7)
-
network(6)
-
-
系统服务配置的图形化工具
-
打开:命令行输入setup
-
操作:选中系统服务(tab移动光标),按回车进入
-
sysv标签的是老版本的启动方式
-
systemd是7之后的启动方式
-
-
开机自动启动状态
-
带*的是自动启动
-
修改:选中对应的服务,按空格可以修改启动状态
-
修改服务的运行级别
-
查看服务的运行级别
-
查看所有
-
chkconfig --list(6)
-
systemctl list-unit-files(7)
-
-
查看具体:systemctl status 服务名(7)
-
vendor preset是默认的启动状态
-
service是当前的启动状态
-
-
-
修改服务自动启动(会对该服务的所有级别进行修改)
-
chkconfig 服务名 on/off(6)
-
systemctl enable/disable 服务名(7)
-
-
修改服务的指定级别
-
chkconfig --level 级别 服务 on/off(6)
-
运行级别
linux启动过程
-
init进程是用户级别第一个启动的进程
运行级别
-
Linux系统有7种运行级别(runlevel): 常用的是级别3和5
-
级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
-
级别1:单用户工作状态,只允许root权限,用于系统维护,禁止远程登陆
-
忘记了root密码可以通过该方式进入系统
-
-
级别2:多用户状态(没有NFS【网络文件系统】),不支持网络
-
级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
-
经测试,控制台模式使用小键盘输入数字会出错
-
-
级别4:系统未使用,保留
-
级别5:X11控制台,登陆后进入图形GUI模式
-
级别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 命令
-
常用快捷键
-
ctrl + c:停止进程
-
ctrl+l:清屏,等同于 clear;彻底清屏:reset提示
-
善于用 tab 键:提示(更重要的是可以防止敲错)
-
上下键:查找执行过的命令
-
帮助命令
-
获取内嵌命令帮助信息
-
man -f 内嵌命令
-
查看1p下的解释:man 1p cd
-
-
help 命令
-
缺陷:帮助信息是纯英文、只能获取内嵌命令的帮助信息
-
-
-
获取外部命令帮助信息
-
man [命令或配置文件]
-
使用b/f可以查看下/上一页
-
-
命令 --help
-
!!!文件目录类
!!!查看信息
查看目录信息
-
pwd:显示当前工作目录的绝对路径
-
绝对路径:从根目录开始的路径
-
相对路径:相对于当前位置的路径
-
pwd是内嵌命令
-
-
ls [选项] [目录或文件]:列出目录内容
-
选项
-
-a:显示所有的文件(包括隐藏文件)
-
linux中以.开头的文件都是隐藏文件
-
-
-l:长数据串列出,包含文件的属性与权限等等数据
-
每行列出的信息依次是: 文件类型与权限 链接数 文件属主 文件属组 文件大小用byte来表示 建立或最近修改的时间 名字
-
一般文件的类型以-开头
-
目录类型以d开头
-
-
ls -l命令的别名为ll
-
ls -lh可以用单位表示文件大小
-
-
两个参数可以合并在一起,如-al
-
-
查看文件内容
-
cat [选项] 文件:查看文件内容,从第一行开始显示
-
选项-n:显示包含空行在内的所有行的行号
-
-
more 文件:文件内容分屏查看
-
more指令是一个基于VI编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容
-
具体操作
-
-
!!!less 文件:分屏显示文件内容
-
less指令的功能与 more 指令类似,但是比 more 指令更加强大,支持各种显示终端。less 指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率
-
具体操作(more的操作也适用)
-
-
显示文件头尾部内容
-
head [-n num] 文件:查看文件头num行内容
-
不指定行数则默认显示10行
-
空行也计入
-
-
tail [-n num] 文件:查看文件尾num行内容
-
不指定也是显示10行
-
tail -f 文件:显示文件最新增加的内容,监视文件变化(可用于实时追踪)
-
ctrl+s:暂停监视
-
ctrl+q:继续监视
-
ctrl+c:退出监视
-
如果是通过vim的方式修改文件,则最新增加的内容不会被监视到
-
因为监视本质上是通过文件底层的索引号inode进行监视(ls -i 文件:显示文件索引号)
-
而vim的方式打开文件会赋予一个新的索引号
-
-
-
-
!!!修改目录或文件
-
cd [路径]:切换路径
-
路径
-
以/开头为绝对路径
-
不以/开头为相对路径
-
..:返回上层目录
-
.:表示当前目录
-
-
-
返回上次的目录:cd -
-
回到主文件夹:cd
-
-
mkdir [-p] [路径1] [路径2] ....:创建文件夹(可以创建多个)
-
-p:可以嵌套创建目录(如果创建的目录的父目录不存在,也会将其父目录创建出来,不指定-p则默认无法创建)
-
-
rmdir [-p] [路径1] [路径2] ....:删除文件夹(可以删除多个)
-
删除父目录时,如果父目录中还有子文件/目录,则无法删除
-
-p:可以嵌套删除目录(如果删除目录之后,其父目录不存在资源,则会将该父目录删除)
-
-
cp [-r] source dest :复制文件或目录
-
source:源文件
-
dest:目标路径(可以是文件,如果复制到文件中去则为覆盖)
-
回复y/n即为要/不覆盖
-
如果复制到的目录中有同名文件,也会询问是否要覆盖
-
-
-r:递归复制整个文件夹(复制文件夹时,会将其下的资源一同复制过来)
-
使用\cp则不会询问信息
-
\指使用linux中的原生命令
-
使用alias可以查看linux采用别名的命令
-
-
常用的cp其实是cp -i命令(即提示是否覆盖)
-
-
-
touch [路径]文件名:创建空文件
-
如果文件名不带后缀名,那默认就是文本文件
-
也可以通过vim 文件名来创建文本文件(不同于touch的是,vim创建的文本文件如果没有内容默认不会保存)
-
-
如果不知道路径,则创建在当前目录下
-
-
rm [选项] 文件/目录:删除文件
-
选项
-
-r:递归删除目录所有内容,如果不指定则无法删除目录
-
-f:强制执行删除,不提示信息
-
-v:显示指令的详细执行过程
-
想要删除目录且不提示,可以使用复合选项-rf(之后不一一赘述)
-
-
-
mv移动文件或重命名
-
mv old new:重命名
-
mv 源文件 目标路径:移动文件
-
其它命令
-
echo [-e] [输出内容]:输出内容到控制台
-
可以有空格,多个空格默认当单个空格
-
如果使用" ",则引号里面的内容会原封不动输出
-
-e:可以使用转义功能(转义功能要在引号中才能生效)
-
echo $:查看系统环境变量
-
-
>
输出重定向和>>
追加-
基本语法
-
Is -l > 文件:列表的内容写入文件中(覆盖写)
-
Is -al >> 文件:列表的内容追加到文件的末尾
-
cat 文件1 > 文件2:将文件1的内容覆盖到文件2
-
echo 内容 >> 文件
-
-
-
ln -s [原文件或目录] [软链接路径]:给原文件创建一个软链接
-
软链接也称为符号链接,类似于windows 里的快捷方式,有自己的数据块,主要存放链接到其他文件的路径
-
访问软链接的路径可以跳转到指定位置,相当于指针,访问软连接指向的位置
-
-
软链接的文件类型是以l打头
-
删除软链接:rm -rf 软链接名,而不是rm -rf 软链接名/
-
如果使用
rm -rf 软链接/
,会把软链接对应的真实目录下的内容删掉
-
-
通过软链接跳转之后,使用pwd显示的是软链接所在的路径【而不是真实路径】,如果要显示实际路径需要用pwd -P
-
切换路径的时候也可以指定实际路径 cd -P 软链接
-
-
拓展,硬链接:ln [原文件或目录] [链接路径]
-
硬链接直接指向文件的索引号inode,相当于别名(linux中的链接数指的就是硬链接)
-
而软链接有自己的inode,里面存放的原文件/目录的地址,软链接其实是链接文件
-
-
-
历史操作相关
-
history [num]:查看执行过的num条命令,不指定则全展示
-
history -c:清空历史记录
-
![编号]:查看该编号下执行的命令
-
时间日期类
-
显示当前时间
-
date:显示当前时间
-
date +日期参数【+号不可省】:显示指定格式的日期,如果要使用空格就必须要用引号括起来
-
-
显示非当前时间
-
date -d '1 days ago':显示前天的时间
-
date -d '-1 days ago':显示明天的时间
-
-
设置系统时间
-
date -s 字符串时间
-
-
查看日历
-
cal [-星期首字母小写] [具体年份]:显示该年的日历,不指定则显示本月的日历
-
cal -m:指定从星期一作为开始
-
-
用户管理类
用户管理
-
useradd [选项] 用户名:添加新用户
-
选项
-
-g 组名:将该用户添加到某个组
-
-d 路径:指定该用户的主文件目录的位置(默认在home目录下)
-
-
-
passwd 用户名:设置用户密码
-
userdel [-r] 用户名:删除用户
-
删除用户之后其家目录还存在
-
加上-r选项会把家目录一起删除
-
-
usermod -g 组名 用户名:修改用户的用户组
-
su 用户名:切换用户
-
同级或者下级到上级的用户切换需要输入密码
-
无法访问同级或者上级的家目录
-
exit:登出当前用户,返回到上一个用户
-
-
sudo 命令:临时赋予普通用户root权限,执行该命令
-
前提是该用户要在sudoers文件中存在才可以赋予【sudoers文件中指定了哪些用户有哪些权限】
-
修改/etc/sudoers文件
-
-
查看用户信息
-
查看用户是否存在
-
id 用户名:查看用户是否存在
-
在/etc/passwd文件查看系统所有用户【自定义的用户id从1000开始】
-
每个用户的信息包括 用户名:编号:组号::家目录:与系统交互的方式
-
-
-
who am i:查看原始登录的用户信息【即创建会话的用户】
-
whoami:查看当前用户信息
-
who:查看所有登录的用户信息
用户组管理
-
基础知识
-
每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理,便于赋予权限
-
在/etc/group文件中可以查看系统中的用户组
-
sudoers文件中%标识的是用户组
-
在wheel组的用户可以申请root权限
-
-
-
groups 用户名:查看用户的用户组
-
groupadd 组名:新建组
-
groupmod -n 新组名 原组名:修改组名
-
groupdel 组名:删除用户组
!!!文件权限类
文件类型
-
可以通过
ll
或ls -l
命令来显示一个文件的属性以及所属的用户【属主】和组【属组】-
复制的文件其文件的原信息不变【权限不变】
-
-
补充
-
c为首字母是字符类型的设备文件,b为块设备文件
-
文件类型之后跟的数字为链接数,文件真正意义被删除是指硬链接数为0
-
文件的链接数指的是硬链接个数
-
文件夹的链接数指的是子文件夹【包含当前目录和父目录】个数
-
-
-
如果没有权限,就会出现减号[-]
-
rwx对文件和目录的不同解释
-
作用到文件
-
r代表可读(read):可以读取,查看
-
w代表可写(write):可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限
-
x代表可执行(execute):可以被系统执行
-
-
作用到目录
-
r代表可读(read):可以读取,即通过ls查看目录内容
-
w代表可写(write): 可以修改,目录内创建+删除+重命名
-
x代表可执行(execute):可以进入该目录,即通过cd进入
-
-
chmod改变权限
-
chmod [{ugoa} {+-=} {rwx}] 文件或目录
-
u:属主权限,g:属组权限,o:其它权限,a:所有权限
-
+添加,-删除,=覆盖
-
-
chmod [model=三位数] 文件或目录
-
r=4,w=2,x=1
-
三位数百位到个位分别代表ugo
-
本质上是二进制编码转十进制,0表示没权限,1有权限
-
-
修改目录里面所有文件的权限:chmod -R [上述方式1/2] 目录
更改属主和属组
-
chown [-R] [最终用户] [文件或目录]:更改文件属主
-
-R:递归修改,把目录下的所有子目录/文件一同修改
-
-
chgrp [最终用户组] [文件或目录]:更改文件属组
综合应用
-
创建不同的用户组并为各组添加用户
-
在t1用户下的家目录创建文本文件,然后修改属组权限,让同组的成员可以访问并且操作t1的家目录
-
添加文本文件的属组修改权限
-
修改b1到testing组,检验是否可以查看t1下的文件
搜索查找类
查找文件路径
-
find [指定目录] [选项]
-
find指令将从指定目录向下递归地遍历其各个子目录,将满足条件的文件显示在终端
-
不指定目录则从当前目录查找
-
-
选项
-
-name<查询方式>:按照指定的文件名【查找模式】查找文件
-
指定文件名
-
指定文件名查找模式
-
-
-user<用户名>:查找属于指定用户名所有文件
-
-size<文件大小>:按照指定的文件大小查找文件
-
单位为b-块(512字节)、c-字节、w-字(2字节)、k、M、G
-
可以用+/-表示大/小于某个数
-
文件大小必须为整数
-
-
-
-
locate 搜索文件【关键字】:locate快速定位文件路径
-
locate指令利用事先建立的系统中所有文件名称及路径的locate数据库实现快速定位给定的文件。Locate指令无需遍历整个文件系统,查询速度较快
-
为了保证查询结果的准确度,管理员必须定期更新locate数据库(数据库每天自动更新一次)
-
updatedb:更新locate数据库
-
-
-
which/whereis 命令:查看命令所在的路径
过滤查找
-
grep [-n] 查找内容 源文件:查找文件中匹配的内容
-
-n:显示匹配的行号
-
-
管道符|:将前一个命令的处理结果输出传递给后面的命令处理,配合grep可以进行二次筛选
-
拓展--wc 文件名:显示行数 字符数 总字符的大小
-
显示关键字的出现次数
-
压缩和解压类
-
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 】,必须指定
-
-z:打包同时压缩
-
-x:解包.tar文件,解压缩必须指定
-
-C:解压到指定目录
-
-
磁盘查看和分区类
查看文件或目录的资源使用
-
安装tree插件,通过
tree 目录
查看指定目录下的树状结构
-
du [选项] 目录/文件:查看文件和目录所占硬盘大小
-
如果用ll统计的仅仅是目录的大小,不包括其下的资源,而du会统计目录下的所有资源
-
选项
-
-h:以人们较易阅读的GBytes,MBytes,KBytes等格式自行显示
-
-a:不仅查看子目录大小,还要包括文件和隐藏文件【如果不指定的话只会详细展示目录信息】
-
-c:显示所有的文件和子目录大小后,最后再显示总和(其实没卵用,因为总目录大小就是总和)
-
-s:只显示总和
-
-max-depth=n:指定统计子目录的深度为第n层
-
-
查看系统的资源使用
-
df [-h]:列出文件系统的整体磁盘和内存使用量,检查文件系统的磁盘空间占用情况
-
-h:以人们较易阅读的GBytes,MBytes,KBytes等格式自行显示
-
tmpfs:临时的文件系统类型,基于内存
-
shm:shared memory,共享内存
-
-
devtmpfs:linux内核启动时创建该文件 系统,用于管理所有设备
-
-
free [-h]:查看内存的使用情况
挂载相关
查看挂载情况
-
lsblk [-f]:查看块设备的挂载情况
-
mountpoint:挂载点
-
sda123是sda的三个分区,sr0是光驱的设备名
-
硬盘分类
-
常见
-
SATA特点数据存储容量大且成本低,命名以ad开头
-
SCSI数据传输快,命名以sd开头
-
以字母序表示第几块硬盘,如sda、sdb、sdc....
-
-
传统
-
IDE命名hd开头
-
-
虚拟化模拟设备,命名vd开头
-
-
-f:显示文件性能类型
-
uuid:系统为每一个分区创建的唯一标识符
-
-
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 设备文件名或挂载点:卸载
-
卸载之后挂载点所在目录还存在,只是没了挂载文件
-
-
实操
-
当插入光驱的时候,系统会自动帮我们挂载【上图】,这里先将其弹出
-
弹出之后其挂载点消失,需要手动挂载
-
图形化界面先退出用户【避免自动挂载】,然后连接光驱,连接之后才能使用dev/sr0设备
-
将sr0设备手动挂载/mnt下【linux下的临时挂载目录】
-
检查挂载情况【可以访问到光驱即挂载成功】
-
卸载
-
开机自动挂载配置
-
配置 /etc/fstab文件
-
两个0
-
第一个指是否做(dump)备份,如果为1则每天定时做备份,0就不备份
-
第二个指文件系统检查的优先级,1的优先级最大,数字越大优先级越小,0表示不检查
-
拓展:fsck命令用于检查和修复文件系统
-
-
-
将光驱配置自动挂载
-
指定uuid或者是设备名 挂载点 文件类型 配置
-
挂载成功
-
-
硬盘分区
-
fdisk
-
fdisk -l:查看硬盘分区详情
-
fdisk 硬盘设备名:对新增硬盘进行分区操作
-
只有root用户才能使用该命令
-
-
实操
-
添加一块新硬盘
-
执行reboot重启虚拟机,然后查看新硬盘挂载情况以及系统硬盘信息
-
使用fdisk命令对其进行分区(参考帮助文档)
-
输入n添加分区,然后输入w进行保存
-
primary主分区,一块磁盘最多划分四个主分区,编号1-4
-
如果需要添加更多分区,会把四个主分区的其中一个主分区替换成扩展分区
-
-
extended扩展分区,编号为5-16(最多12个扩展分区)
-
-
给新添加的分区创建文件系统将其格式化
-
-t 文件类型:指定文件类型
-
-
挂载
-
向挂载目录里面添加文件,检查新硬盘的使用情况
-
进程管理类
查看进程信息
-
linux进程按运行方式大致可以分为
-
前台显示
-
后台运行,系统服务往往属于后台进程
-
具体执行系统服务的进程一般叫做守护进程(服务名称会以d结尾)
-
可以认为守护进程和系统服务是一一对应的关系
-
-
查看信息语法
-
ps [选项1/选项2]:查看当前系统进程状态
-
选项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的服务找到远程登录相关进程信息
-
登录一个普通用户,会创建一个进程用于权限分离,该用户使用root权限实际上是通过该进程进行操作
查看进程树
-
命令:pstree [选项]
-
选项
-
-p:显示进程的pid
-
-u:显示进程的所属用户, 如果子进程和父进程的用户一样就不会例外显示
-
-
实时监控进程状态
-
命令:top [选项]
-
选项
-
-d:指定top每个几秒进行更新【默认3秒】
-
-i:不显示任何闲置和僵尸进程
-
-p pid:专门指定某个进程的状态
-
-
操作
-
进程状态默认是按%CPU排序的,使用
-
shift+M按以%MEM排序
-
shift+N按进程号排序
-
shift+P切回以cpu排序
-
-
监控固定用户:u,然后输入想要监控的用户【空格和回车都是监控所有】
-
终止进程:p,然后输入pid
确认发送信号【发具体名称或对应数字】
-
退出top:q
-
-
参数
-
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】
-
pr:任务调度优先级、ni:用户指定的nice优先级
-
VIRT:虚拟内存占用的大小、RES:物理内存占用的大小、SHR:共享内存占用大小
-
S/R:睡眠/运行状态
-
TIME+:已经占用cpu的总时间,精确到0.01秒
-
COMMAND:生成当前进程的命令
-
-
!!!终止进程
-
kill [-9] 进程号:通过进程号杀死进程
-
-9:表示sigkill信号值,即强迫进程立即停止(杀死终端只能靠强行)
-
-
killall 进程名:通过进程名称杀死所有有关进程,也支持通配符,这在系统因负载过大而变得很慢时很有用
-
全杀有风险,对应的守护进程也会被关掉,如果杀死sshd就无法进行远程连接,只能到虚拟机的主机终端systemctl start sshd
-
显示网络状态和端口占用信息
-
netstat -anp:显示网络状态和端口占用信息
-
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分钟就执行一遍命令.
-
-
-
扩展
软件包管理
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 软件名:显示该软件安装的详细信息
-
-
卸载
-
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配置信息
-
系统会判断IP地址的位置,然后在地理上选择一个最近的镜像源,所有没必要修改yum源
克隆虚拟机
克隆步骤
-
右键指定虚拟机,找到管理(开机状态下无法克隆)
-
选择克隆类型,为了服务更加稳定这里选择完整克隆
-
指定名称和克隆虚拟机位置
修改配置
-
克隆的虚拟机与原虚拟机配置是一样的,为了构建集群,便于用户访问不同虚拟机,需要修改相应配置
-
修改网络配置
-
修改静态ip地址:/etc/sysconfig/network-scripts/ifcfg-ens33
-
先关闭旧版的网络systemctl stop network服务避免干扰,然后重启网络服务systemctl restart NetworkManager
-
查看是否修改成功
-
修改主机名,以便于通过主机名访问(其实不用修改主机名,只有修改ip的映射关系即可)
-
然后在主机的hosts文件中添加新的映射
-
-
-
快照:保存了当前机器的重要节点,以备虚拟机故障可以恢复到该节点
-
虚拟机拷贝:找到虚拟机在主机上的存放目录,拷贝到另一台机器后可以使用vm打开
!!!shell
基础知识
-
Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核
-
还是一个功能相当强大的编程语言,易编写、易调试、灵活性强
-
查看shell解析器
-
查看Linux系统支持的shell解析器:cat /etc/shells
-
查看当前系统默认使用的shell解析器
-
echo $SHELL
-
ll /bin/ | grep bash
-
-
shell脚本入门
-
约定shell脚本文件以.sh作为后缀(不加也可以)
-
开头:一般以#!/bin/bash开头(指定解析器)
-
#单行注释
-
执行方式
-
采用bash/sh 加脚本的相对路径或绝对路径(不用赋予脚本x【可执行】权限)
-
系统另起一个bash进程专门用于解析脚本,所以不用赋予x权限
-
-
直接输入脚本的相对路径或绝对路径(前提是脚本要有x权限)
-
给脚本赋予x权限:chmod +x 脚本路径
-
然后输入绝/相对路径调用脚本
-
在脚本所在目录无法通过访问脚本名来调用
-
因为系统把该脚本当作是命令
-
-
如果要调用直接使用相对路径:./脚本名
-
-
-
在脚本的路径前加上
.
或者 source-
子shell:使用bash/sh或者是直接访问脚本路径,本质是打开了一个子shell进程嵌套在当前shell中
-
当脚本内容执行结束,子shell关闭,返回到父shell
-
如果直接使用bash不跟路径就会进入子shell中,按exit退回父shell
-
开不开子shell 的区别就在于环境变量的继承关系,如在子shell中设置的当前变量,父shell 是不可见的
-
-
使用
.
或者 source不会打开子shell,直接在当前shell进程中把shell脚本每一行命令都拿出来逐行解析-
在子shell修改环境变量的时候,父shell不生效,此时就要使用source/
.
-
-
-
!!!变量
-
变量可以认为是内存中存储的一块数据
分类
-
linux中的变量有两种分类方式
-
系统变量(预定义)和用户变量(自定义)
-
全局变量和局部变量(只对当前shell可见)
-
系统预定义变量
-
常用的系统变量:
$HOME、$PWD、$SHELL、$USER
等 -
查看变量
-
查看所有环境变量:env/printenv
-
查看具体系统环境变量
-
echo
$变量
(如果要使用环境变量都要带上$
,例如ls $HOME) -
printenv 变量【不用带$】
-
-
查看当前定义的所有变量:set
-
自定义变量
-
语法
-
定义变量:变量名=变量值,注意=号前后不能有空格,定义的是局部变量
-
export 变量名:将局部变量导出成全局变量
-
注意:对变量的更改只在当前shell生效【子shell修改的父shell变量,在父shell中不改变】
-
-
撤销变量:unset 变量名
-
声明静态变量:readonly 变量,只读变量,不能修改和unset
-
-
定义规则
-
变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
-
等号两侧不能有空格
-
在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算
-
变量的值如果有空格,需要使用双/单引号括起来
-
特殊变量
-
$ n
:n 为数字-
$0
代表该脚本名称 -
$1-$9
代表第一到第九个参数 -
十以上的参数需要用大括号包含,如${10}
-
注意,双引号中有$会当作特殊符号,而单引号会直接输出
$
字符
-
-
$#
:获取所有输入参数个数,常用于循环、判断参数的个数是否正确以及加强脚本的健壮性
-
获取命令行中所有的参数
-
$*
:所有的参数看成一个整体 -
$@
:把每个参数区分对待
-
-
$?
:最后一次执行的命令的返回状态,如果.
-
这个变量的值为0,证明上一个命令正确执行
-
如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确yu
-
运算符
-
计算运算式的结果
-
$((运算式))
或$[运算式]
-
expr 运算式,弊端如下
-
运算式中每个数字和符合需要用空格分开,相当于把数字和符合都作为参数
-
expr 5 + 2
-
-
为变量赋值的时候需要使用命令替换【即把某个命令执行的结果替换过来】
-
a=$(expr 5 + 2)
-
a="expr 5 + 2"
-
-
使用*做乘法时需要转义
-
exper 5 /* 2
-
-
-
-
定义加法运算脚本
-
编写脚本
sum=$[ $1 + $2 ]
-
添加可执行权限
-
测试
-
条件判断
-
语法
-
test 条件
-
[ 条件 ] 【注意要空格】
-
-
捕获条件判断的结果:echo $?
-
通过检验上一条命令是否执行成功,原命令结果成功则返回0,失败返回1
-
与其它编程语言相反
-
-
空值也返回false--》1
-
-
条件
-
=两边
-
有空格是等于
-
没空格是赋值
-
-
整数比较
-
-eq 等于 (equal)、-ne 不等于(not equal)
-
-lt 小于(less than)、-gt大于(greater than)
-
-le 小于等于 (less equal)、-ge 大于等于(greater equal)
-
-
按照文件进行判断
-
-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
-
如果没加x进行拼接,且参数为空会报错
-
-
单分支实现多条件判断
-
中括号内部的逻辑关系用-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
.
多分支
if [ condition ] then 程序 elif [ condition ] then 程序 else 程序 fi
-
实例
if [ $2 -lt 18 ] then echo 未成年 elif [ $2 -lt 35 ] then echo 青年 else echo 中老年 fi
.
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
.
循环流程
for
-
语法1
for (( 初始值;循环控制条件;变量变化 )) do 程序 done
-
测试:计算1加到100
-
shell中有类似有i++的语法,但是没有+=相关语法
-
在双小括号内可以直接使用<=等数学上的运算式
-
#!/bin/bash for (( x=1; x<=$1; x++ )) do sum=$[ $sum + $x ] done echo $sum
.
-
-
语法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的数字
.
.
-
-
$*和$@
的区别-
如果没有被双引号引起来,二者没有区别
-
被双引号引起来,
$*
把所有元素当成一个整体,$@
把所有元素作为独立数据
-
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
.
!!!读取控制台输入
-
read [选项] [指定读取值的变量名]:读取控制台输入的信息,类似于scanner(System.in)
-
选项
-
-p 提示信息:指定读取值时的提示符
-
-t:指定读取值时等待的时间 (秒),不加-t表示一直等待
-
-
-
测试
read -t 10 -p "请输入信息" inf
.
函数
-
函数实际上是简化的脚本,脚本实际上是复杂的函数
系统函数
-
basename [string/pathname] [suffix]:会删掉包含最后一个/之前的所有前缀,然后将字符串显示出来
-
basename可以理解为取路径里的文件名称
-
suffix为后缀,basename 会将pathname 或string 中的指定sufix去掉
.
-
显示当前文件的文件名称:
echo $(basename $0 .sh)
.
-
-
dirname 文件的绝对路径
.
-
显示脚本文件所在目录的绝对路径
cd $(dirname $0) #先切换到脚本文件所在位置 echo $(pwd) #使用pwd命令输出当前的绝对路径
.
-
自定义函数
-
[]表示可省略
[function] funname[()]{ Action [return int;] #只能返回0-255的整数,如果没有return则返回值为最后一条命令的执行情况 }
-
测试
add(){ sum=$[ $1 + $2 ] echo "两数之和"$sum } read -p "请输入第一个数" a read -p "请输入第二个数" b add $a $b
.
-
获取函数结果
add(){ sum=$[ $1 + $2 ] echo $sum } read -p "请输入第一个数" a read -p "请输入第二个数" b sum=$(add $a $b) #利用命令替换将输出的结果赋值给sum echo "和的平方" $[ $sum * $sum ]
.
文本处理工具
cut
使用
-
功能:在文件中负责剪切数据,从文件的每行剪切字节、字符和字段,并将这些字节、字符和字段输出
-
cut [选项] filename
-
选项
-
-f num:num表示列号,提取第几列
-
截取多列用
","
分割 -
截取一个区间用
"-"
,如1-4、-4、4- 分别表示截取第1到4列、第4列之前、第4列之后
-
-
-d:分隔符,按照指定分隔符作为分割列(即分隔符也算一列),默认是制表符"\t"
-
-c num:按字符进行切割,num表示取第几列
-
-
使用grep之后再使用cat不需要指定文本文件
-
测试
-
数据准备
-
cut文本文件
-
passwd文件的bash信息
-
-
按空格分割
-
按
:
进行分割,同时截取-
第1、6、7列
-
1到4列
-
第4列之后
-
第4列之前
-
-
获取ip地址
-
ifconfig ens33 | grep netmask | cut -d " " -f 10
.
-
ifconfig ens33获取ip地址相关信息
-
grep有ip地址的那一行的关键字
-
用空格分割,截取ip地址所在的列
-
-
获取所有ip地址:
ifconfig | grep netmask | cut -d " " -f 10
-
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
-
查询ifconfig输出结果中空行的行号
ifconfig | awk '/^$/{print NR}'
.
-
使用awk获取ip地址
ifconfig | awk '/netmask/{print $2}'
.
-
测试
-
数据准备:/etc/passwd
-
按
:
分割,然后提取所有以root开头的行,输出-
第七列
cat /etc/passwd | awk -F ":" '/^root/{print $7}'
.
-
第六、七列,并以","分割
cat /etc/passwd | awk -F ":" '/^root/{print $6","$7}'
.
-
-
只显示第一、七列,并以","分割,且在开头添加"user,shell",在最后一行添加"dahaige,/bin/zuishuai"
-
BEGIN在所有数据读取行之前执行;END在所有数据执行之后执行
cat /etc/passwd | awk -F ":" 'BEGIN{print "user,shell"} {print $6","$7} END{print "dahaige,/bin/zuishuai"}'
.
-
正则表达式入门
-
正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在 Linux 中grep,sed,awk 等文本处理工具都支持通过正则表达式进行模式匹配
常用特殊字符
-
^:匹配一行的开头
-
$:匹配一行的结束
-
.:匹配一个任意字符
-
*:不单独使用,和上一个字符连用,表示匹配上一个字符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之间的任意字符
.
-
-
\:表示转义,并不会单独使用
-
由于所有特殊字符都有其特定匹配模式,当我们想匹配某一特殊字符本身时(例如找出所有包含$的行),就会碰到困难。此时就要将转义字符和特殊字符连用,来表示特殊字符本身
.
-
-
{num}:配合前一个字符使用,重复num次
-
使用{}是需要用-E,表示使用扩展的正则表达式
-
综合应用
归档文件
-
实际生产应用中,往往需要对重要数据进行归档备份
-
需求:实现一个每天对指定目录归档备份的脚本,输入一个目录名称(末尾不带/),将目录下所有文件按天归档保存,并将归档日期附加在归档文件名上,放在/root/archive下
-
步骤
-
判断输入的归档目录的个数是否只有一个
-
判断目录是否存在
-
获取目录的绝对路径以及目录名称
-
获取当前日期
-
定义生成的归档文件名称和归档路径(/root/archive)
-
使用tar命令进行归档
-
判断是否归档成功
-
给当前用户赋予可执行权限
-
设置定时任务
-
-
归档操作脚本
#!/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 #每天凌晨两点进行任务
.
发送消息
-
可以利用Linux自带的mesg和write工具,向其它用户发送消息
-
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