ilinux学习笔记
Linux哲学思想
- 一切都是一个文件(包括硬件)
- **小型,单一用途的程序 **
- **链接程序,共同完成复杂的任务 **
- **避免令人困惑的用户界面 **
- 配置数据存储在文本中
第一周 linux基础入门
ps aux
1.查看当前终端设备
- tty
[19:30:06 root@RC ~]#tty
/dev/pts/0
2.当前登录终端设备
- who am i
[19:41:59 root@RC ~]#who am i
root pts/0 2020-07-27 18:14 (10.0.0.1)
3.查看所有终端设备
- who
[19:39:00 root@RC ~]#who
root pts/0 2020-07-27 18:14 (10.0.0.1)
rc tty2 2020-07-27 19:39 (tty2)
- w #查看所有终端设备并显示用户操作
[19:46:08 root@RC ~]#w
19:48:59 up 1:35, 3 users, load average: 0.03, 0.42, 0.40
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 18:14 1.00s 0.53s 0.01s w
rc tty2 tty2 19:39 1:34m 53.10s 0.06s /usr/libexec/g
root pts/2 10.0.0.1 19:48 4.00s 0.02s 0.02s -bash
1.bash shell
GNU Bourne-Again Shell(bash)是GN90U计划中重要的工具软件之一,目前也是 Linux标准的shell,与 sh兼容
1.1显示当前使用的shell
[19:29:18 root@RC ~]#echo $SHELL
/bin/bash
[19:29:24 root@RC ~]#echo ${SHELL}
/bin/bash
1.2显示当前系统使用的所有shell
[19:48:59 root@RC ~]#cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/usr/bin/tmux
/bin/tmux
2.hostname设置主机名
#显示当前主机名
[20:09:09 root@RC ~]#hostname
RC
#临时修改
hostname NAME
#永久保存,因为是一个子进程,需要exit退出保存
hostnamectl set-hostname NAME
#修改文件以设置主机名
vim /ect/hostname
注意:主机名不支持使用下划线,但是支持横线。可使用字母,横线或数字组合
3.命令提示符
#为管理员
$为普通用户
提示符可以被修改,查uid。uid=0为管理员,uid>1000为普通用户
[14:09:38 root@RC profile.d]#id -u
0
[09:54:14 root@RC ~]#id root
uid=0(root) gid=0(root) groups=0(root)
[09:55:41 root@RC ~]#id rc
uid=1000(rc) gid=1000(rc) groups=1000(rc)
3.1 显示提示符格式
[09:55:48 root@RC ~]#echo $PS1
\[\e[1;31m\][\[\e[0m\]\t \[\e[1;32m\]\u\[\e[36m\]@\h\[\e[1;35m\] \W\[\e[1;31m\]]\[\e[0m\]\$
3.2 修改命令提示符
vim /etc/profile.d/env.sh #centos写入此文件可永久保存
:set paste #从Windows复制粘贴格式出错时使用
vim ~/.bashrc #ubuntu写入此文件可永久保存
3.3提示符格式说明
在linux中,PS1是一个全局变量
-
\e:控制符\003
-
\u:当前用户的账户名称
-
\h:主机名简称
-
\H: 完整的主机名称
-
\d: 代表日期,格式为weekday month date,例如:“Mon Aug 1”
-
\w:当前工作目录
-
\t:显示时间为24小时格式,如:HH:MM:SS
-
\T:显示时间为12小时格式
-
\v: BASH的版本信息
-
!:命令历史数
-
#开机后命令历史数
颜色表
前景 背景 颜色 30 40 黑色 30 41 红色 32 42 绿色 33 43 黄色 34 44 蓝色 35 45 紫红色 36 46 青蓝色 37 47 白色
其他
0 OFF
1 高亮显示
4 underline
7 反白显示
8 不可见
4.执行命令
4.1 shell可执行命令分两类:
内部命令:由shell自带,而且通过某命令形式提供
外部命令:在文件系统路径下有对用的可执行程序文件
区分内部命令还是外部命令
type COMMAND
[12:51:09 rc@rc ~]$type echo
echo is a shell builtin
type -a COMMAND
[13:05:20 rc@rc ~]$type -a echo
echo is a shell builtin
echo is /bin/echo
4.2 内部命令相关
help 内部命令列表
enable 管理内部命令
- enable cmd 启用内部命令
- enable -n cmd 禁用内部命令
- enable -n 查看所有禁用的内部命令
4.3外部命令
查看外部命令路径
- which
[15:49:18 root@RC ~]#which date
/usr/bin/date
which -a date
- whereis
[15:49:27 root@RC ~]#whereis date
date: /usr/bin/date /usr/share/man/man1/date.1.gz /usr/share/man/man1p/date.1p.gz
Hash缓存表
系统初始hash表为空,但外部命令执行时, 默认会从PATH路径下寻找命令,找到后会将这条命令的路径保记录到hash表中,当再次使用该命令时shell解释器首先会查看hash表,存在将执行之,如果不存在,将会去PATH路径下寻找,利用hash缓存表可大大提高命令的调用问速率。
常见用法
- hash 显示hash缓存
- hash -l 显示hash缓存,可作为输入使用
- hash -p path name 将命令全路径path起别名为name
- hash -t name 打印缓存中name的路径
- hash -d name 清除name缓存
- hash -r 清除缓存
4.4命令的执行过程
- 1别名
- 2内部
- 3hash
- 4$PASH
- 5command not found
5.命令别名
将较长的命令定义成较短的命令,以方便执行
5.1显示当前shell进程所有可用的命名别名
alias
5.2定义别名NAME,其相当于执行命令VALUE
`alias name= ’value‘`
优先级:别名>内部命令>外部命令
如果别名同原命令同名,如果要执行原命令,可使用
\ALIASNAME
“ALIASNAME”
‘ALIASNAME’
command ALIASNAME
/path/commmand
范例:
[10:22:00 root@RC data]#alias c='cd'
[10:22:28 root@RC data]#c ~
[10:22:36 root@RC ~]#
5.3撤销别名 unalias
unalibs #取消别名
unalias -a #取消所有别名
注意 : 在命令行中定义的别名。仅对当前shell进程有用
如果想永久有效,要定义在配置文件中
- 仅对当前用户: ~/.bashrc
- 对所有用户有效:/etc/bashrc
编辑配置给出的新配置不会立即生效,bash进程重新读取配置文件
source /path/to/config_file
. /path/to/config_file
5.4命令格式
COMMAND [OPTIONS...] [ARGUMENTS...]
选项:用于启用或关闭命令的某个或某些功能
- 短选项:UNIX 风格选项,-c 例如:-l, -h
- 长选项:GNU风格选项,–word 例如:–all, --human
- BSD风格选项: 一个字母,例如:a ;使用相对较少
注意:
- 多个选项以及多参数和命令之间使用空白字符分隔
- 取消和结束命令执行:Ctrl+c,Ctrl+d
- 多个命令可以用 “;” 符号分开
- 一个命令可以用\分成多行
6.常见命令
查看硬件信息
6.1查看cpu lscpu
- lscpu
[10:34:53 root@RC ~]#lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 2
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
- cat /proc/cpuinfo
[10:40:06 root@RC ~]#cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 78
model name : Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz
stepping : 3
microcode : 0xcc
cpu MHz : 2592.003
cache size : 4096 KB
6.2查看硬盘和分区情况 lsblk / df
- lsblk
[10:35:00 root@RC ~]#lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 100G df 0 part /
├─sda3 8:3 0 2G 0 part [SWAP]
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 50G 0 part /data
sr0 11:0 1 1024M 0 rom
- cat /proc/partitions
[10:50:19 root@RC ~]#cat /proc/partitions
major minor #blocks name
8 0 209715200 sda
8 1 1048576 sda1
8 2 104857600 sda2
8 3 2097152 sda3
8 4 1 sda4
8 5 52428800 sda5
11 0 1048575 sr0
6.3查看内核版本 uname -r
- uname -r
[10:50:31 root@RC ~]#uname -r
4.18.0-80.el8.x86_64
6.4查看操作系统发行版本
- cat /etc /os-release
16:28:35 rc@RC data]$cat /etc/os-release
NAME="CentOS Linux"
VERSION="8 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
- cat /etc/redhat-release
[10:52:17 root@RC ~]#cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core)
6.5时间和日期
Linux的两种时钟
- 系统时钟:由Linux内核通过CPU的工作频率进行的
- 硬件时钟:主板
相关命令
date 显示或修改时间
[10:53:09 root@RC ~]#date +%F_%T
2020-07-25_10:58:48
显示前n天的时间
[19:35:39 root@centos8 ~]#date -d '-1 day' +%F
2020-07-28
[19:36:46 root@centos8 ~]#date -d '-3 day' +%F
2020-07-26
修改系统时间
date -s '-1 day' +%F
clock,hwclock: 显示硬件时钟
- -s, --hctosys 以硬件时钟为准,校正系统时钟
- -w, --systohc 以系统 时钟为准,校正硬件时钟
timedatectl set-timezones 州/地点 #修改时区
显示日历
[11:02:04 root@RC ~]#cal -y
时区
/ect/localtime
[14:08:57 root@RC ~]#ll /etc/localtime
lrwxrwxrwx. 1 root root 35 Jul 15 10:53 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai
6.6关机和重启
关机
- halt
- poweroff
- init 0
重启
reboot
- -f: 强制,不调用shutdown
- -p: 切断电源
关机或重启:shutdown -r now 0
- -r: reboot
- -h: halt
- -c:cancel TIME:无指定,默认相当于+1(CentOS7)
- now: 立刻,相当于+0
- +#:相对时间表示法,几分钟之后;例如 +3 hh:mm: 绝对时间表示,指明具体时间
6.7用户登录信息查看命令
- whoami 显示当前登录有效用户
- who 系统当前所有的登录会话
- w 系统当前登录的所有会话及所做的操作
6.8文本编辑
- nano 工具可以实现文本的编辑,上手容易,适合初学者
- gedit 工具是图形工具
- vi vim
6.9会话管理
命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称"窗口"),在里面输入命 令。用户与计算机的这种临时的交互,称为一次"会话"(session) 会话的一个重要特点是,窗口与其 中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终 止,不管有没有运行完 一个典型的例子就是,SSH 登录远程计算机,打开一个远程窗口执行命令。这 时,网络突然断线,再次登录的时候,是找不回上一次执行的命令的。因为上一次 SSH 会话已经终止 了,里面的进程也随之消失了。为了解决这个问题,会话与窗口可以"解绑":窗口关闭时,会话并不终 止,而是继续运行,等到以后需要的时候,再让会话"绑定"其他窗口 终端复用器软件就是会话与窗口的"解绑"工具,将它们彻底分离。 (1)它允许在单个窗口中,同时访 问多个会话。这对于同时运行多个命令行程序很有用。 (2) 它可以让新窗口"接入"已经存在的会话。 (3)它允许每个会话有多个连接窗口,因此可以多人实时共享会话。 (4)它还支持窗口任意的垂直 和水平拆分。 类似的终端复用器还有Screen,Tmux
6.9.1screen
利用screen可以实现会话管理,如新建会话,共享会话等
注意 :centOS7来自于base源,centOS8来自epel源
- centOS7安装screen
[19:08:50 root@centos7 ~]#yum -y install screen
- centOS8安装screen
[11:14:32 root@RC ~]#yum -y instal screen
screen常见用法
- 创建新screen会话 screen –S [SESSION]
- 加入screen会话 screen –x [SESSION]
- 退出并关闭screen会话 exit
- 剥离当前screen会话 Ctrl+a,d
- 显示所有已经打开的screen会话 screen -ls
- 恢复某screen会话 screen -r [SESSION]
6.9.2 tmux
- 安装
[11:14:32 root@RC ~]#yum install tmux
- 启动与退出
[11:24:26 root@RC ~]#tmux
[exited]
[11:26:41 root@RC ~]#exit
logout
mux 窗口有大量的快捷键。所有快捷键都要通过前缀键唤起。默认的前缀键是 Ctrl+b ,即先按下 Ctrl+b ,快捷键才会生效。帮助命令的快捷键是 Ctrl+b ? 然后,按下 q 键,就可以退出帮助 新建会话 第一个启动的 Tmux 窗口,编号是0,第二个窗口的编号是1,以此类推。这些窗口对应的会 话,就是 0 号会话、1 号会话。使用编号区分会话,不太直观,更好的方法是为会话起名。
- 新建一个指定名称的会话
tmux new -s <session-name>
- tmux ls或Ctrl+b,s 可以查看当前所有的 Tmux 会话
tmux ls
tmux list-session
- 分离会话 在 Tmux 窗口中,按下Ctrl+b d或者输入tmux detach命令,就会将当前会话与窗口分离
tmux detach
- 接入会话 tmux attach 命令用于重新接入某个已存在的会话
tmux attach -t <session-name>
- 杀死会话 tmux kill-session命令用于杀死某个会话
tmux kill-session -t <session-name>
- 切换会话 tmux switch命令用于切换会话
tmux switch -t <session-name>
- 可以将窗口分成多个窗格(pane),每个窗格运行不同的命令
上下分窗格
tmux split-window
ctrl+b,"
- 左右分窗格
tmux split-window -h
ctrl+b,%
- 窗格快捷键
Ctrl+b %:划分左右两个窗格。
Ctrl+b ":划分上下两个窗格。
Ctrl+b :光标切换到其他窗格。是指要切换到的窗格的方向键,比如切换到下方窗格,就按方向键↓。
Ctrl+b ;:光标切换到上一个窗格。
Ctrl+b o:光标切换到下一个窗格。
Ctrl+b {:当前窗格左移。
Ctrl+b }:当前窗格右移。
Ctrl+b Ctrl+o:当前窗格上移。
Ctrl+b Alt+o:当前窗格下移。
Ctrl+b x:关闭当前窗格。
Ctrl+b !:将当前窗格拆分为一个独立窗口。
Ctrl+b z:当前窗格全屏显示,再使用一次会变回原来大小。
Ctrl+b Ctrl+:按箭头方向调整窗格大小。
Ctrl+b q:显示窗格编号
窗口管理 除了将一个窗口划分成多个窗格,Tmux 也允许新建多个窗口
- 新建窗口 tmux new-window命令用来创建新窗口
tmux new-window
- 新建一个指定名称的窗口
tmux new-window -n <window-name>
- 切换窗口 tmux select-window命令用来切换窗口
tmux select-window -t <window-number>
- 切换到指定名称的窗口
tmux select-window -t <window-name>
- 窗口快捷键
Ctrl+b c:创建一个新窗口,状态栏会显示多个窗口的信息。
Ctrl+b p:切换到上一个窗口(按照状态栏上的顺序)。
Ctrl+b n:切换到下一个窗口。
Ctrl+b :切换到指定编号的窗口,其中的是状态栏上的窗口编号
Ctrl+b w:从列表中选择窗口
Ctrl+b ,:窗口重命
- 列出所有快捷键,及其对应的 Tmux 命令
tmux list-keys
- 列出所有 Tmux 命令及其参数
tmux list-commands
7.输出信息echo
echo 命令可以将后面跟的字符进行输出
功能:显示字符,echo会将输入的字符串送往标准输出。输出
的字符串间以空白字符隔开, 并在最后加上换行号 语法:
语法:
echo [-n,e,E] [字符串]
选项:
- -E (默认)不支持\解释功能
- -n 不自动换行
- -e 启用\字符串的解释功能
显示变量
echo "SAVR_NAME " #用变量值替换,弱引用
echo ’SAVR_NAME ‘ #变量不会替换,强引用
启用命令选项-e,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出
- \a 发出警告声
- \b 退格键
- \c 最后不加上换行符号
- \e escape,相当于\033
- \n 换行且光标移至行首
- \r 回车,即光标移至行首,但不换行
- \t 插入tab
- \ 插入\字符
- \0nnn 插入nnn(八进制)所代表的ASCII字符
- \xHH插入HH(十六进制)所代表的ASCII数字(man 7 ascii)
8.字符集和编码
许多场合下,字符集与编码这两个概念常被混为一谈,但两者是有差别的。字符集与字符集编码是两个不同层面的概念。 charset是character set的简写,即字符集。 encoding是charset encoding的简写,即字符集编码,简称编码
8.1 ASCII码
计算机内部,所有信息最终都是一个二进制值。上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定,即ASCII(American Standard Code for Information Interchange) 码
ASCII 码一共规定了128个字符的编码,占用了一个字节的后面7位,最前面的一位统一规定为0
8.2 Umicode
由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,即ASCII编码,但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。 全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码为了表示世界上所有语言中的所有字符。每一个符号都给予一个独一无二的编码数字,Unicode 是一个很大的集合,现在的规模可以容纳100多万个符号。Unicode 仅仅只是一个字符集,规定了每个字符对应的二进制代码,至于这个二进制代码如何存储则没有规定
Unicode编码方案:
- UTF-8:变长,1到4个字节
- UTF-16:变长,2或4个字节
- UTF-32:固定长度,4个字节
9.命令行扩展和被括起来的集合
9.1 命令行扩展 : $ ( )和``
把一个命令的输出打印给另一个命令的参数
$(CMD) 或 `CMD`
比较 “ ” ,‘ ’ ,``
[09:47:53 root@RC ~]#echo "echo $SHELL"
echo /bin/bash
[09:53:25 root@RC ~]#echo 'echo $SHELL'
echo $SHELL
[09:54:00 root@RC ~]#echo `echo $SHELL`
/bin/bash
双 引 号:不能识别命令,可以识别变量
单 引 号:六亲不认,变量和命令都不能识别 都当成普通字符串
反向单引号:B变量和命令都识别,并且会将反向单引号的内容当成命令执行后,在交给调用反向单引号的命令继续
9.2 括号扩展:{ }
{ } 可以实现打印重复字符串的简化形式
[09:58:22 root@RC ~]#echo {1..10}
1 2 3 4 5 6 7 8 9 10
[10:09:57 root@RC ~]#echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[10:11:47 root@RC ~]#echo {A..z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z
[10:10:43 root@RC ~]#echo {1,2,3}.txt
1.txt 2.txt 3.txt
9.3 双击tap键补全
tab键可以实现命令及路径等补全,提高输入效率,避免出错
- command 2Tab 所有子命令或文件补全
- string2Tab 以string开头命令
- /2Tab 显示所有根目录下一级目录,包括隐藏目录
- ./2Tab 当前目录下子目录,包括隐藏目录
- *2Tab 当前目录下子目录,不包括隐藏目录
- ~2Tab 所有用户列表
- $2Tab 所有变量
- @2Tab /etc/hosts记录 (centos7不支持)
- =2Tab 相当于ls –A (centos7不支持)
9.4命令行历史
保存你输入的命令历史。可以用它来重复执行命令 登录shell时,会读取命令历史文件中记录下的命令 ~/.bash_history 登录进shell后新执行的命令只会记录在缓存中;这些命令会用户退出时“追加”至命令历 史文件中
命令:history
- -c: 清空命令历史
- -d offset: 删除历史中指定的第offset个命令
- n: 显示最近的n条历史
- -a: 追加本次会话新执行的命令历史列表至历史文件
- -r: 读历史文件附加到历史列表
- -w: 保存历史列表到指定的历史文件
- -n: 读历史文件中未读过的行到历史列表
- -p: 展开历史参数成多行,但不存在历史列表中
- -s: 展开历史参数成一行,附加在历史列表后
命令历史相关环境变量
- HISTSIZE:命令历史记录的条数
- HISTFILE:指定历史文件,默认为~/.bash_history
- HISTFILESIZE:命令历史文件记录历史的条数
- HISTTIMEFORMAT="%F %T " 显示时间
- HISTIGNORE=“str1:str2*:…” 忽略str1命令,str2开头的历史
- HISTCONTROL:控制命令历史的记录方式 ignoredups 是默认值,可忽略重复的命令,连续且相 同为“重复” ignorespace 忽略所有以空白开头的命令 ignoreboth 相当于ignoredups, ignorespace 的组合 erasedups 删除重复命令
持久保存变量
- 以上变量可以 export 变量名=“值” 形式存放在 /etc/profile 或 ~/.bash_profile
调用历史命令行
#重复前一个命令方法
重复前一个命令使用上方向键,并回车执行
按 !! 并回车执行
输入 !-1 并回车执行
按 Ctrl+p 并回车执行
!:0 执行前一条命令(去参数)
!-n 执行history历史中倒数第n个命令
!string 重复前一个以“string”开头的命令
!?string 重复前一个包含string的命令
!string:p 仅打印命令历史,而不执行
!$:p打印输出 !$ (上一条命令的最后一个参数)的内容
!*:p 打印输出 !*(上一条命令的所有参数)的内容
^string 删除上一条命令中的第一个string
^string1^string2 将上一条命令中的第一个string1替换为string2
!:gs/string1/string2 将上一条命令中所有的string1都替换为 string2
使用up(向上)和down(向下)键来上下浏览从前输入的命令
ctrl-r来在命令历史中搜索命令
(reverse-i-search)`’:
Ctrl+g:从历史搜索模式退出
#要重新调用前一个命令中最后一个参数
!$ 表示
Esc , . 点击Esc键后松开,然后点击 . 键
Alt+ . 按住Alt键的同时点击 . 键
command !^ 利用上一个命令的第一个参数做cmd的参数
command !$ 利用上一个命令的最后一个参数做cmd的参数
command !* 利用上一个命令的全部参数做cmd的参数
command !:n 利用上一个命令的第n个参数做cmd的参数
command !n:^ 调用第n条命令的第一个参数
command !n:$ 调用第n条命令的最后一个参数
command !n:m 调用第n条命令的第m个参数
command !n:* 调用第n条命令的所有参数
command !string:^ 从命令历史中搜索以 string 开头的命令,并获取它的第一个参数
command !string:$ 从命令历史中搜索以 string 开头的命令,并获取它的最后一个参数
command !string:n 从命令历史中搜索以 string 开头的命令,并获取它的第n个参数
command !string:* 从命令历史中搜索以 string 开头的命令,并获取它的所有参数执行前一条命令(去除参数
9.5 bash快捷键
Ctrl + l 清屏,相当于clear命令
Ctrl + o 执行当前命令,并重新显示本命令
Ctrl + s 阻止屏幕输出,锁定
Ctrl + q 允许屏幕输出
Ctrl + c 终止命令
Ctrl + z 挂起命令
Ctrl + a 光标移到命令行首,相当于Home
Ctrl + e 光标移到命令行尾,相当于End
Ctrl + f 光标向右移动一个字符
Ctrl + b 光标向左移动一个字符
Alt + f 光标向右移动一个单词尾
Alt + b 光标向左移动一个单词首
Ctrl + xx 光标在命令行首和光标之间移动
Ctrl + u 从光标处删除至命令行首
Ctrl + k 从光标处删除至命令行尾
Alt + r 删除当前整行
Ctrl + w 从光标处向左删除至单词首
Alt + d 从光标处向右删除至单词尾
Ctrl + d 删除光标处的一个字符
Ctrl + h 删除光标前的一个字符
Ctrl + y 将删除的字符粘贴至光标后
Alt + c 从光标处开始向右更改为首字母大写 的单词
Alt + u 从光标处开始,将右边一个单词更改为大写
Alt + l 从光标处开始,将右边一个单词更改 为小写
Ctrl + t 交换光标处和之前的字符位置
Alt + t 交换光标处和之前的单词位置
Alt + # 提示输入指 定字符后,重复显示该字符#次
注意:Alt组合快捷键经常和其它软件冲突
10.获得帮助
多层次的帮助
- whatis
- command --help
- man and info
- /usr/share/doc/
- Red Hat documentation
- 其它网站和搜索
whatis command
whatis 使用数据库来显示命令的简短描述 刚安装后不可立即使用,需要制作数据库
#CentOS 7 版本以后
mandb
#CentOS 6 版本之前
makewhatis
10.1查看命令的帮助
内部命令:
- help COMMAND
[19:57:33 root@centos8 ~]#type cd
cd is a shell builtin
[19:57:43 root@centos8 ~]#help cd
cd: cd [-L|[-P [-e]] [-@]] [dir]
Change the shell working directory.
Change the current directory to DIR. The default DIR is the value of the
HOME shell variable.
- man bash
外部命令和软件帮助:
- COMMAND --help 或 COMMAND -h
- 使用手册(manual) man COMMAND
- 信息页 info COMMAND
- 程序自身的帮助文档 :README, INSTALL, ChangeLog
- 程序官方文档
- 相关网站,技术论坛
10.2 --help或-h选项
显示用法总结和参数列表,大多数命令使用,但并非所有的
[15:36:48 root@RC ~]#date --help
Usage: date [OPTION]... [+FORMAT]
or: date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
Display the current time in the given FORMAT, or set the system date.
[20:05:53 root@centos8 ~]#cd --help
cd: cd [-L|[-P [-e]] [-@]] [dir]
Change the shell working directory.
Change the current directory to DIR. The default DIR is the value of the
HOME shell variable.
格式说明:
-
[ ]表示可选项
-
CAPS或 <> 表示变化的数据
-
… 表示一个列表
-
x |y| z 的意思是“ x 或 y 或 z ”
-
-abc的 意思是-a -b –c
-
{ } 表示分组
10.3 man命令
man 提供命令帮助的文件,手册页存放在/usr/share/man
几乎每个命令都有man的“页面”
中文man需安装包
- man-pages
- man-pages-zh-CN
man页面分组为不同的“章节”,统称为Linux手册,man 1 man
- 1:用户命令
- 2:系统调用
- 3:C库调用
- 4:设备文件及特殊文件
- 5:配置文件格式
- 6:游戏
- 7:杂项
- 8:管理类的命令
- 9:Linux 内核API
man命令的配置文件:
#centos6之前版man的配置文件
/etc/man.config
#centos7之后版man的配置文件
/etc/man_db.conf
#ubuntu man 的配置文件
/etc/manpath.config
查看man 手册页
man [OPTION...] [SECTION] PAGE..
man [章节] keyword
man帮助段落说明
- NAME 名称及简要说明
- SYNOPSIS 用法格式说明
- 可选内容
- <> 必选内容
- a|b 二选一
- { } 分组
- … 同一内容可出现多次
- DESCRIPTION 详细说明
- OPTIONS 选项说明
- EXAMPLES 示例
- FILES 相关文件
- AUTHOR 作者
- COPYRIGHT 版本信息
- REPORTING BUGS bug信息
- SEE ALSO 其它帮助参考
man命令的操作方法:使用less命令实现
-
space, ^v, ^f, ^F: 向文件尾翻屏
-
b, ^b: 向文件首部翻屏
-
d, ^d: 向文件尾部翻半屏
-
u, ^u: 向文件首部翻半屏
-
RETURN, ^N, e, ^E or j or ^J: 向文件尾部翻一行
-
y or ^Y or ^P or k or ^K:向文件首部翻一行
-
q: 退出
-
#:跳转至第#行
-
1G: 回到文件首部
-
G:翻至文件尾部
-
/KEYWORD 以KEYWORD指定的字符串为关键字,从当前位置向文件尾部搜索;不区分字符大小写
n: 下一个
N:上一个
-
?KEYWORD 以KEYWORD指定的字符串为关键字,从当前位置向文件首部搜索;不区分字符大小写
n: 跟搜索命令同方向,下一个
N:跟搜索命令反方向,上一个
常用选项
- 列出所有帮助
man -a keyword
- 相当于whatis
man -f keyword
10.4系统及第三方应用官方文档
1.通过在线文档获取帮助
http://httpd.apache.org
http://www.nginx.org
https://mariadb.com/kb/en
https://dev.mysql.com/doc/
http://tomcat.apache.org
http://www.python.org
2.红帽知识库和官方在线文档
通过发行版官方的文档光盘或网站可以获得安装指南、部署指南、虚拟化指南等
http://kbase.redhat.com
http://www.redhat.com/docs
http://access.redhat.com
https://help.ubuntu.com/lts/serverguide/index.html
3.红帽全球技术支持服务
rhn.redhat.com或者本地卫星服务器/代理服务器
RHN账户为及其注册和基于网络管理的RHN用户
sosreport 收集所有系统上的日志信息的工具,并自动打成压缩包,方便技术支持人员和红帽全球支持提供分析问题依据
4.网站和搜索
http://tldp.org
http://www.slideshare.net
http://www.google.com
第一周 文件管理和IO重定向
1.文件系统目录结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3kzUFQz5-1598174225427)(C:\Users\RC\Pictures\Saved Pictures\QQ截图20200807115935.png)]
-
文件和目录被组织成一个单根倒置树结构
-
文件系统从根目录下开始,用“/”表示
-
根文件系统(rootfs):root filesystem
-
标准Linux文件系统(如ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL
-
以.开头的文件为隐藏文件
-
路径分隔的 /
-
文件名最长255个字节
-
包括路径在内文件名称最长4095个字节
-
蓝色–>目录 绿色–>可执行文件 红色–>压缩文件 浅蓝色–>链接文件 灰色–>其他文件
-
除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用
-
每个文件都有两类相关数据:
元数据:metadata
数据:dataLinux的文件系统分层结构:FHS Filesystem Hierarchy Standard
1.2常见的文件系统目录功能
-
/boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub)都存放于此目录
-
/bin:所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
-
/sbin:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序
-
/lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
-
/lib64:专用于x86_64系统上的辅助共享库文件存放位置
-
/etc:配置文件目录
-
/home/USERNAME:普通用户家目录
-
/root:管理员的家目录
-
/media:便携式移动设备挂载点
-
/mnt:临时文件系统挂载点
-
/dev:设备文件及特殊文件存储位置
b: block device,随机访问
c: character device,线性访问
-
/opt:第三方应用程序的安装位置
-
/srv:系统上运行的服务用到的数据
-
/tmp:临时文件存储位置
-
/usr: universal shared, read-only data
bin: 保证系统拥有完整功能而提供的应用程序
sbin:
lib:32位使用
lib64:只存在64位系统
include: C程序的头文件(header files)
share:结构化独立的数据,例如doc, man等
local:第三方应用程序的安装位置
bin, sbin, lib, lib64, etc, share
-
/var: variable data files
cache: 应用程序缓存数据目录
lib: 应用程序状态信息数据
local:专用于为/usr/local下的应用程序存储可变数据
lock: 锁文件
log: 日志目录及文件
opt: 专用于为/opt下的应用程序存储可变数据
run: 运行中的进程相关数据,通常用于存储进程pid文件
spool: 应用程序数据池
tmp: 保存系统两次重启之间产生的临时数据
-
/proc: 用于输出内核与进程信息相关的虚拟文件系统
-
/sys:用于输出当前系统上硬件设备相关信息虚拟文件系统
-
/selinux: security enhanced Linux,selinux相关的安全策略等信息的存储位置
CentOS 7 以后版本目录结构变化
-
/bin 和 /usr/bin
-
/sbin 和 /usr/sbin
-
/lib 和/usr/lib
-
/lib64 和 /usr/lib64
1.3 应用程序的组成部分
二进制程序:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin
库文件:/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64
配置文件:/etc, /etc/DIRECTORY, /usr/local/etc
帮助文件:/usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/doc
1.4 Linux下的文件类型(7种)
- -普通文件
- d 目录文件directory
- b 块设备black
- c 字符设备character
- l 符号链接文件link
- p 管道文件pipe
- s 套接字文件socket
2.文件操作命令
2.1显示当前工作目录
每个shell和系统进程都有一个当前的工作目录 CWD:current work directory
显示当前shell CWD的绝对路径
pwd命令: printing working directory
- -P 显示真实物理路径
- -L 显示链接路径(默认)
2.2绝对路径和相对路径
-
绝对路径
以正斜杠开始
完整的文件的位置路径
可用于任何想指定一个文件名的时候 -
相对路径名
不以斜线开始
一般情况下,指定相对于当前工作目录或某目录的位置。特殊情况下,是相对于某目录的位置
可以作为一个简短的形式指定一个文件名基名:basename,只取文件名而不要路径
目录名:dirname,只取路径,不要文件名
2.3更改目录
命令 cd : change directory 改变目录
选项:-P 切换至物理路径,而非软链接目录
可以使用绝对或相对路径
- 切换至父目录: cd …
- 切换至当前用户主目录: cd
- 切换至以前的工作目录: cd -
相关的环境变量:
- PWD:当前目录路径
- OLDPWD:上一次目录路径
2.4列出目录内容
ls 命令可以列出当前目录的内容或指定目录
常见选项:
- -a 包含隐藏文件
- -l 显示额外的信息
- -R 目录递归
- -ld 目录和符号链接信息
- -1 文件分行显示
- -S 按从大到小排序
- -t 按mtime排序
- -u 配合-t选项,显示并按atime从新到旧排序
- -U 按目录存放顺序显示
- -X 按文件后缀排序
- -d 查看文件夹自身的属性
2.5查看文件的状态stat
文件相关信息:metadata (元数据,文件属性信息), data(数据本身)
每个文件有三个时间戳:
- access time 访问时间,atime,读取文件内容
- modify time 修改时间,mtime,改变文件内容(数据)
- change time 改变时间,ctime,元数据发生改变
[14:45:06 root@centos8 ~]#stat anaconda-ks.cfg
File: anaconda-ks.cfg
Size: 1535 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 201720846 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:admin_home_t:s0
Access: 2020-07-29 10:40:51.028884220 +0800
Modify: 2020-07-29 10:40:51.112886162 +0800
Change: 2020-07-29 10:40:51.112886162 +0800
Birth: -
2.6确定文件内容
文件可以包含多种类型的数据,使用file命令检查文件的类型,然后确定适当的打开命令或应用程序使用
file [OPTION...] [FILE...]
常用选项:
- -b 列出文件辨识结果时,不显示文件名称
- -f filelist 列出文件filelist中文件名的文件类型
- -F 使用指定分隔符号替换输出文件名后默认的”:”分隔符
- -L 查看对应软链接对应文件的文件类型
- –help 显示命令在线帮助
2.7文件通配符模式
文件通配符可以用来匹配符合条件的多个文件,方便批理管理文件
通配符采有特定的符号,表示特定的含义,此特符号称为元字符
常见的通配符如下:
* 匹配零个或多个字符
? 匹配任何单个字符
~ 当前用户家目录
~mage 用户mage家目录
~+和. 当前工作目录
~- 前一个工作目录
[0-9] 匹配数字范围
[a-z] 字母
[A-Z] 字母
[wang] 匹配列表中的任何的一个字符
[^wang] 匹配列表中的所有字符以外的字符
[15:39:53 root@centos8 data]#ls f[a-c].txt
fa.txt fA.txt fb.txt fB.txt fc.txt
[15:40:53 root@centos8 data]#ls f[a-C].txt
fa.txt fA.txt fb.txt fB.txt fc.txt fC.txt
别外还有在Linux系统中预定义的字符类:man 7 glob
[:digit:]:任意数字,相当于0-9
[:lower:]:任意小写字母,表示 a-z
[:upper:]: 任意大写字母,表示 A-Z
[:alpha:]: 任意大小写字母
[:alnum:]:任意数字或字母
[:blank:]:水平空白字符
[:space:]:水平或垂直空白字符
[:punct:]:标点符号
[:print:]:可打印字符
[:cntrl:]:控制(非打印)字符
[:graph:]:图形字符
[:xdigit:]:十六进制字符
2.8 创建空文件和刷新时间
touch命令可以用来创建空文件或刷新文件的时间
touch [OPTION]... FILE...
选项说明:
- -a 仅改变 atime和ctime
- -m 仅改变 mtime和ctime
- -t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的时间戳
- -c 如果文件不存在,则不予创建
2.9复制文件和目录
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
常用选项
-
-i 覆盖前提示
-
-n不覆盖,注意两者顺序
-
-r, -R 递归复制目录及内部的所有内容
-
-a 归档,相当于-dR --preserv=all,常用于备份
-
-d --no-dereference --preserv=links 不复制原文件,只复制链接名
-
–preserv[=ATTR_LIST]
mode: 权限 ownership: 属主属组 timestamp:
links
xattr
context
all
-
-p (保留属性,权限所有者)等同–preserv=mode, ownership, timestamp
-
-v --verbose (详细过程)
-
-f --force
-
-u --update 只复制源比目标更新文件或目标不存在的文件
-
-b 目标存在,覆盖前先备份,形式为 filename~
-
–backup=numbered 目标存在,覆盖前先备份加数字后缀
2.10 移动和重命名文件
mv 命令可以实现文件或目录的移动和改名
同一分区移动数据,速度很快:数据位置没有变化
不同分区移动数据,速度相对慢:数据位置发生了变化
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...
常用选项:
-
-i 交互式
-
-f 强制
-
-b 目标存在,覆盖前先备份
利用rename 可以批量修改文件名
rename [options] <expression> <replacement> <file>...
#为所有的conf文件加上.bak后缀:
rename 'conf' 'conf.bak' f*
#去掉所有的bak后缀:
rename '.bak' '' *.bak
2.11删除文件
使用rm 命令可以删除文件
rm [OPTION]... [FILE]...
常用选项:
- -i 交互式
- -f 强制删除
- -r 递归
- –no-preserve-root 删除/
rm虽然删除了文件,但是被删除的文件仍然可能被恢复,在安全要求较高的场景下,可以使用shred安全删除文件
格式
shred [OPTION]... FILE...
常见选项:
- -z 最后一次覆盖添加0,以隐藏覆盖操作
- -v 能够显示操作进度
- -u 覆盖后截断并删除文件
- -n # 指定覆盖文件内容的次数(默认值是3次)
[20:24:49 root@centos8 data]#shred -zvun 4 df.txt
shred: df.txt: pass 1/5 (random)...
shred: df.txt: pass 2/5 (ffffff)...
shred: df.txt: pass 3/5 (000000)...
shred: df.txt: pass 4/5 (random)...
shred: df.txt: pass 5/5 (000000)...
shred: df.txt: removing
shred: df.txt: renamed to 000000
shred: 000000: renamed to 00000
shred: 00000: renamed to 0000
shred: 0000: renamed to 000
shred: 000: renamed to 00
shred: 00: renamed to 0
shred: df.txt: removed
2.12目录操作
2.12.1 显示目录树 tree
-
常见选项:
-
-d: 只显示目录
-
-L level:指定显示的层级数目
-
-P pattern: 只显示由指定wild-card pattern匹配到的路径
2.12.2 创建目录mkdir
-
常见选项:
-
-p: 存在于不报错,且可自动创建所需的各目录
-
-v: 显示详细信息
-
-m MODE: 创建目录时直接指定权限
2.11.3 删除空目录rmdir
-
常见选项:
-
-p 递归删除父空目录
-
-v 显示详细信息
注意:rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树
练习
(1) 如何创建/testdir/dir1/x, /testdir/dir1/y, /testdir/dir1/x/a, /testdir/dir1/x/b, /testdir/dir1/y/a, /testdir/dir1/y/b
[20:37:12 root@centos8 data]#mkdir -p testdir/dir1/{x/{a,b},y/{a,b}}
[20:38:10 root@centos8 data]#tree testdir
testdir
└── dir1
├── x
│ ├── a
│ └── b
└── y
├── a
└── b
(2) 如何创建/testdir/dir2/x, /testdir/dir2/y, /testdir/dir2/x/a, /testdir/dir2/x/b
[20:46:32 root@centos8 data]#mkdir -p testdir/dir2/{x/{a,b},y}
[20:46:45 root@centos8 data]#tree testdir/
testdir/
├── dir1
│ ├── x
│ │ ├── a
│ │ └── b
│ └── y
│ ├── a
│ └── b
└── dir2
├── x
│ ├── a
│ └── b
└── y
(3) 如何创建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6, /testdir/dir5/dir7
[21:00:58 root@centos8 data]#mkdir -p testdir/dir{3,4,5/dir{6,7}}
[21:01:37 root@centos8 data]#tree testdir/
testdir/
├── dir1
│ ├── x
│ │ ├── a
│ │ └── b
│ └── y
│ ├── a
│ └── b
├── dir2
│ ├── x
│ │ ├── a
│ │ └── b
│ └── y
├── dir3
├── dir4
└── dir5
├── dir6
└── dir7
3.文件元数据和节点表结构
3.1 inode表结构
每个文件的属性信息,比如:文件的大小,时间,类型等,称为文件的元数据(meta data)。这此元数据是存放在inode(index node)表中。node 表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息
第一个node表记录对应的保存了以下信息:
- inode number 节点号
- 文件类型
- 权限
- UID
- GID
- 链接数(指向这个文件名路径名称个数)
- 该文件的大小和不同的时间戳
- 指向磁盘上文件的数据块指针
- 有关文件的其他数据
目录
目录是个特殊文件,文件内容保存了目录中文件的列表及inode number
- 文件引用一个是 inode号
- 人是通过文件名来引用一个文件
- 一个目录是目录下的文件名和文件inode号之间的映射
cp和inode
cp 命令:
- 分配一个空闲的inode号,在inode表中生成新条目
- 在目录中创建一个目录项,将名称与inode编号关联
- 拷贝数据生成新的文件
rm和inode
rm 命令:
- 链接数递减,从而释放的inode号可以被重用
- 把数据块放在空闲列表中
- 删除目录项
- 数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
mv和inode
- 如果mv命令的目标和源在相同的文件系统,作为mv 命令
用新的文件名创建对应新的目录项
删除旧目录条目对应的旧的文件名
不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动! - 如果目标和源在一个不同的文件系统, mv相当于cp和rm
3.2 硬链接 ln
硬链接本质上就给一个文件起一个新的名称,实质是同一个文件
硬链接特性
- 创建硬链接会增加额外的记录项以引用文件
- 对应于同一文件系统上一个物理文件
- 每个目录引用相同的inode号
- 创建时链接数递增
- 删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文件被删除
- 不能跨越驱动器或分区
- 不支持对目录创建硬链接
格式
ln filename [linkname ]
3.3 符号(或软)链接
一个符号链接指向另一个文件,就像windows中快捷方式,软链接文件和原文件本质上不是同一个文件
软链接特点
- 一个符号链接的内容是它引用文件的名称
- 可以对目录创建软链接
- 可以跨分区的文件实现
- 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的 引用计数
- 软链接如果使用相对路径,是相对于原文件的路径,而非相对于当前目录
格式:
ln -s filename [linkname ]
3.4硬链接和软链接区别总结
硬链接 | 软链接 | |
---|---|---|
本质 | 本质是同一个文件 | 本质不是同一个文件 |
跨设备 | 不支持 | 支持 |
inode | 相同 | 不同 |
链接数 | 创建新的硬链接,链接数会增加,删除硬链接,链接数会减少 | 创建或删除,链接数不会变化 |
文件夹 | 不支持 | 支持 |
相对路径 | 原始文件相对路径是相对于当前工作目录 | 原始文件相对路径是相对于链接文件的相对路径 |
删除文件源 | 只是链接数减一,但链接文件的访问不受影响 | 链接文件将无法访问 |
文件类型 | 和源文件相同 | 链接文件,和源文件无关 |
文件大小 | 和源文件相同 | 源文件的路径的长度 |
案例1:提示空间满 NO space left on device ,但是df可以看到空间很多,为什么?
答:节点编号用光了
案例2:提示空间快满,使用rm删除了很大的无用文件后,df仍然看到空间不足,为什么?如何解决?
答:被删除文件被某个进程打开或使用。可以通过kill命令将进程杀掉从而释放空间
4. IO重定向
4.1标准输入和输出
程序:指令加数据
读入数据:Input
输出数据:Output
打开的文件都有一个fd: file descriptor (文件描述符)
Linux给程序提供三种 I/O 设备
- 标准输入(STDIN) -0 默认接受来自终端窗口的输入
- 标准输出(STDOUT) -1 默认输出到终端窗口
- 标准错误(STDERR) -2 默认输出到终端窗口
4.2 I/O重定向redirect
I/O重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标
4.2.1标准输出和错误重新定向
STDOUT和STDERR可以被重定向到指定文件,而非默认的当前终端
- 格式:
命令 操作符号 文件名
- 支持的操作符号包括:
1> 或 > 把STDOUT重定向到文件
>| 强制覆盖
2> 把STDERR重定向到文件
&> 把所有输出重定向到文件
以上如果文件已存在,文件内容会被覆盖
以上如果文件已存在,文件内容会被覆盖
set -C 禁止将内容覆盖已有文件,但可追加
set +C 允许覆盖
- 追加
>> 可以在原有内容基础上,追加内容
把输出和错误重新定向追加到文件
>> 追加标准输出重定向至文件
2>> 追加标准错误重定向至文件
- 标准输出和错误输出各自定向至不同位置
COMMAND > /path/to/file.out 2> /path/to/error.out
- 合并标准输出和错误输出为同一个数据流进行重定向
&> 覆盖重定向
&>> 追加重定向
COMMAND > /path/to/file.out 2>&1 (顺序很重要)
COMMAND >> /path/to/file.out 2>&1
- 合并多个程序
(CMD1,CMD2…)或者{CMD1,CMD2…} 合并多个程序的STDOUT
范例
4.3 标准输入重定向
从文件中导入STDIN,代替当前终端的输入设备,使用 < 来重定向标准输入 某些命令能够接受从文件中导入的STDIN
4.3.1 tr命令
tr转换或删除字符
tr [OPTION]... SET1 [SET2]
选项:
-c –C --complement:取字符集的补集
-d --delete:删除所有属于第一字符集的字符
-s --squeeze-repeats:把连续重复的字符以单独一个字符表示,即去重
-t --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符
[:alnum:]:字母和数字
[:alpha:]:字母
[:digit:]:数字
[:lower:]:小写字母
[:upper:]:大写字母
[:space:]:空白字符
[:print:]:可打印字符
[:punct:]:标点符号
[:graph:]:图形字符
[:cntrl:]:控制(非打印)字符
[:xdigit:]:十六进制字符
#范例:把/etc/os-release文件中的小写字母转换为大写字母转换
[20:50:17 root@centos8 data]#tr [a-z] [A-Z] < /etc/os-release
NAME="CENTOS LINUX"
VERSION="8 (CORE)"
ID="CENTOS"
ID_LIKE="RHEL FEDORA"
VERSION_ID="8"
PLATFORM_ID="PLATFORM:EL8"
PRETTY_NAME="CENTOS LINUX 8 (CORE)"
ANSI_COLOR="0;31"
CPE_NAME="CPE:/O:CENTOS:CENTOS:8"
HOME_URL="HTTPS://WWW.CENTOS.ORG/"
BUG_REPORT_URL="HTTPS://BUGS.CENTOS.ORG/"
CENTOS_MANTISBT_PROJECT="CENTOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"
REDHAT_SUPPORT_PRODUCT="CENTOS"
REDHAT_SUPPORT_PRODUCT_VERSION="8"
范例:压缩df.txt文件里重复的空格
[16:35:03 root@centos8 data]#cat df.txt
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 910244 0 910244 0% /dev
tmpfs 924700 0 924700 0% /dev/shm
tmpfs 924700 8852 915848 1% /run
tmpfs 924700 0 924700 0% /sys/fs/cgroup
/dev/sda2 104806400 2091232 102715168 2% /
/dev/sda5 52403200 398592 52004608 1% /data
/dev/sda1 999320 122172 808336 14% /boot
tmpfs 184940 0 184940 0% /run/user/0
[16:35:09 root@centos8 data]#tr -s ' ' < df.txt
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 910244 0 910244 0% /dev
tmpfs 924700 0 924700 0% /dev/shm
tmpfs 924700 8852 915848 1% /run
tmpfs 924700 0 924700 0% /sys/fs/cgroup
/dev/sda2 104806400 2091232 102715168 2% /
/dev/sda5 52403200 398592 52004608 1% /data
/dev/sda1 999320 122172 808336 14% /boot
tmpfs 184940 0 184940 0% /run/user/0
4.3.2多行重定向
使用 “<<终止词” 命令从键盘把多行重导向给STDIN,直到终止词位置之前的所有文本都发送给STDIN,有时被称为就地文本(here documents)
其中终止词可以是任何一个或多个符号,比如:!,@,$,EOF(End Of File),magedu等,其中EOF
比较常用
3.管道
3.1管道
管道(使用符号“|”表示)用来连接多个命令
格式:
命令1 | 命令2 | 命令3 | …
功能说明:
-
将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN
-
所有命令会在当前shell进程的子shell进程中执行
-
组合多种工具的功能
注意:STDERR默认不能通过管道转发,可利用2>&1 或 |& 实现,格式如下
命令1 2>&1 | 命令2
命令1 |& 命令2
3.2tee命令
利用tee命令可以重定向到多个目标,经常配合管道符一起使用
格式:
命令1 | tee [-a ] 文件名 | 命令2
以上可以把命令1的STDOUT保存在文件中,做为命令2的输入
选项:
-a 追加
功能:
- 保存不同阶段的输出
- 复杂管道的故障排除
- 同时查看和记录输出
第二周 用户组和权限管理
1.linux安全模型
资源分派:
-
Authentication:认证,验证用户身份
-
Authorization:授权,不同的用户设置不同权限
-
Accouting|Audition:审计
当用户登录时,系统会自动分配令牌token,包括用户标识和组成员等信息
1.1 用户
Linux中每个用户是通过User Id (UID)来唯一标识的。
-
管理员:root, 0
-
普通用户:1-60000 自动分配
系统用户:1-499 (CentOS 6以前), 1-999 (CentOS7以后)
对守护进程获取资源进行权限分配
登录用户:500+ (CentOS6以前), 1000+(CentOS7以后)
给用户进行交互式登录使用
1.2 用户组
Linux中可以将一个或多个用户加入用户组中,用户组是通过Group ID(GID) 来唯一标识的。
- 管理员组:root, 0
- 普通组:
系统组:1-499(CentOS 6以前), 1-999(CentOS7以后), 对守护进程获取资源进行权限分
配
普通组:500+(CentOS 6以前), 1000+(CentOS7以后), 给用户使用
1.3 用户和组的关系
- 用户的主要组(primary group):用户必须属于一个且只有一个主组,默认创建用户时会自动创建和用户名同名的组,做为用户的主要组,由于此组中只有一个用户,又称为私有组
- 用户的附加组(supplementary group): 一个用户可以属于零个或多个辅助组
1.4安全上下文
Linux安全上下文Context:运行中的程序,即进程 (process),以进程发起者的身份运行,进程所能够访问资源的权限取决于进程的运行者的身份
比如:root 身份运行/bin/cat /etc/shadow和 wang的身份运行/bin/cat /etc/shadow ,得到的结果是不同的,shadow能否能被访问是由运行者的身份决定,非程序本身
2 用户和组的配置文件
2.1 用户和组的主要配置文件
- /etc/passwd:用户及其属性信息(名称、UID、主组ID等)
- /etc/shadow:用户密码及其相关属性
- /etc/group:组及其属性信息
- /etc/gshadow:组密码及其相关属性
2.2 passwd文件格式
login name:登录用名(wang)
passwd:密码 (x)
UID:用户身份编号 (1000)
GID:登录默认所在组编号 (1000)
GECOS:用户全名或注释
home directory:用户主目录 (/home/wang)
shell:用户默认使用shell (/bin/bash)
2.3 shadow文件格式
登录用名
用户密码:一般用sha512加密
从1970年1月1日起到密码最近一次被更改的时间
密码再过几天可以被变更(0表示随时可被变更)
密码再过几天必须被变更(99999表示永不过期)
密码过期前几天系统提醒用户(默认为一周)
密码过期几天后帐号会被锁定
从1970年1月1日算起,多少天后帐号失效
更改密码加密算法:
authconfig --passalgo=sha256 --update
密码的安全策略
- 足够长
- 使用数字、大写字母、小写字母及特殊字符中至少3种
- 使用随机密码
- 定期更换,不要使用最近曾经使用过的密码
2.4 group文件格式
群组名称:就是群组名称
群组密码:通常不需要设定,密码是被记录在 /etc/gshadow
GID:就是群组的 ID
以当前组为附加组的用户列表(分隔符为逗号)
2.5 gshdow文件格式
群组名称:就是群的名称
群组密码:
组管理员列表:组管理员的列表,更改组密码和成员
以当前组为附加组的用户列表:多个用户间用逗号分隔
2.6 文件操作
- vipw和vigr
- pwck和grpck
3 用户和组管理命令
用户管理命令
- useradd
- usermod
- userdel
组帐号维护命令
- groupadd
- groupmod
- groupdel
3.1 用户创建
useradd 命令可以创建新的Linux用户
格式:
useradd [options] LOGIN
常见选项:
-u UID
-o 配合-u 选项,不检查UID的唯一性
-g GID 指明用户所属基本组,可为组名,也可以GID
-c "COMMENT“ 用户的注释信息
-d HOME_DIR 以指定的路径(不存在)为家目录
-s SHELL 指明用户的默认shell程序,可用列表在/etc/shells文件中
-G GROUP1[,GROUP2,...] 为用户指明附加组,组须事先存在
-N 不创建私用组做主组,使用users组做主组
-r 创建系统用户 CentOS 6之前: ID<500,CentOS 7以后: ID<1000
-m 创建家目录,用于系统用户
-M 不创建家目录,用于非系统用户
显示或更改默认设置
useradd -D
useradd –D -s SHELL
useradd –D –b BASE_DIR
useradd –D –g GROUP
新建用户的相关文件
- /etc/default/useradd
- /etc/skel/*
- /etc/login.defs
批量创建用户
newusers passwd格式文件
批量修改用户口令
echo username:passwd | chpasswd
3.2 用户属性修改
usermod 命令可以修改用户属性
格式:
usermod [OPTION] login
常见选项:
-u UID: 新UID
-g GID: 新主组
-G GROUP1[,GROUP2,...[,GROUPN]]]:新附加组,原来的附加组将会被覆盖;若保留原有,则要同时使用-a选项
-s SHELL:新的默认SHELL
-c 'COMMENT':新的注释信息
-d HOME: 新家目录不会自动创建;若要创建新家目录并移动原家数据,同时使用-m选项
-l login_name: 新的名字
-L: lock指定用户,在/etc/shadow 密码栏的增加 !
-U: unlock指定用户,将 /etc/shadow 密码栏的 ! 拿掉
-e YYYY-MM-DD: 指明用户账号过期日期
-f INACTIVE: 设定非活动期限
3.3删除用户
userdel可以删除linux用户
格式:
userdel [OPTION]... Login
常见选项
f, --force 强制
-r, --remove 删除用户家目录和邮箱
3.4查看用户相关的ID信息
id命令可以查看用户的UID,GID等相关信息
id [OPTION]... [USER]
常见选项:
-u: 显示UID
-g: 显示GID
-G: 显示用户所属的组的ID
-n: 显示名称,需配合ugG使用
3.5切换用户或以其它用户身份执行命令
su: 即switch user,命令可以切换用户身份,并且以指定用户的身份执行命令
格式:
su [options...] [-] [user [args...]]
切换用户的方式:
- su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录
- su - UserName:登录式切换,会读取目标用户的配置文件,切换至家目录,完全切换
说明:root su至其他用户无须密码;非root用户切换时需要密码
换个身份执行命令:
su [-] UserName -c 'COMMAND
常见选项:
-l --login su -l UserName 相当于 su - UserName
3.6设置密码
passwd可以修改用户密码
格式:
passwd [OPTIONS] UserName
常用选项:
-d:删除指定用户密码
-l:锁定指定用户
-u:解锁指定用户
-e:强制用户下次登录修改密码
-f:强制操作
-n mindays:指定最短使用期限
-x maxdays:最大使用期限
-w warndays:提前多少天开始警告
-i inactivedays:非活动期限
--stdin:从标准输入接收用户密码
3.7修改用户密码策略
chage可以修改用户密码策略
格式:
chage [OPTION]... LOGIN
常见选项:
-d LAST_DAY
-m --mindays MIN_DAYS
-M --maxdays MAX_DAYS
-W --warndays WARN_DAYS
-I --inactive INACTIVE 密码过期后的宽限期
-E --expiredate EXPIRE_DATE 用户的有效期
-l 显示密码策略
3.8用户相关的其他命令
- chfn 指定个人信息
- chsh 指定shell
- finger 可看用户个人信息
3.9创建组
groupadd实现创建组
格式:
groupadd [OPTION]... group_name
常见选项:
-g GID 指明GID号;[GID_MIN, GID_MAX]
-r 创建系统组,CentOS 6之前: ID<500,CentOS 7以后: ID<1000
3.10修改组
组属性修改:groupmod
格式:
groupmod [OPTION]... group
常见选项:
-n group_name: 新名字
-g GID: 新的GID
3.11删除组
groupctl可以删除组
格式:
groupdel [options] GROUP
常见选项:
-f, --force 强制删除,即使是用户的主组也强制删除组
3.12更改组密码
组密码:passwd
格式:
gpasswd [OPTION] GROUP
常见选项:
-a user 将user添加至指定组中
-d user 从指定组中移除用户user
-A user1,user2,... 设置有管理权限的用户列表
3.13临时切换主组
newgrp命令可以临时切换主组, 如果用户本不属于此组,则需要组密码
格式:
newgrp [-] [group]
如果使用 - 选项,可以初始化用户环境
3.14更改和查看组成员
groupmems可以管理组成员关系
格式:
groupmems [options] [action]
常见选项:
-g, --group groupname 更改为指定组 (只有root)
actions:
-a, --add username 指定用户加入组
-d, --delete username 从组中删除用户
-p, --purge 从组中清除所有成员
-l, --list 显示组成员列表
groups 可查看用户组关系
格式
#查看用户所属组列表
groups [OPTION].[USERNAME]...
4.文件权限管理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3HiyMorG-1598174225429)(C:\Users\12550\Pictures\Camera Roll\45.png)]
4.1文件所有者和属组属性操作
- 设置文件的所有者chown
chown 命令可以修改文件的属主,也可以修改文件属组
格式:
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
用法说明:
OWNER 只修改所有者
OWNER:GROUP 同时修改所有者和属组
:GROUP 只修改属组,冒号也可用 . 替换
-R: 递归
--reference=RFILE 参考指定的的属性,来修改
- 设置文件的属组信息chgrp
chgrp 命令可以只修改文件的属组
格式:
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
-R递归
4.2文件权限
- 文件权限说明
文件的权限主要针对三类对象进行定义
owner 属主, u
group 属组, g
other 其他, o
注意:用户的最终权限是从左向右顺序匹配的,即,所有者,所属组,其他人,一旦匹配权限立即生效,不再向右查看其权限
每个文件针对每类访问者都定义了三种权限
- 对文件的权限
r Readable #可使用文件查看类工具,比如cat可以查看其内容
w Writable #可修改其内容
x eXcutable #可以把此文件提请内核启动为一个进程,即可以执行(运行)此文件(此文件的内容必须是可执行的)
- 对目录的权限说明
r 可以使用ls查看此目录中文件列表
w 可在此目录中创建文件,也可删除此目录中的文件
x 可以使用ls -l查看此目录中文件元数据(须配合r),可以cd进入此目录
X 只给目录x权限,不给无执行权限的文件x权限
- 数字法的权限
八进制数字
--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7
- 修改文件权限chmod
格式:
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
说明:
MODE:who opt permission
who=u,g,o,a
opt:+,-,=
permission:r,w,x
修改一类用户的所有权限
u= g= o= ug= a= u=,g=
修改一类用户某位或某些位权限
u+ u- g+ g- o+ o- a+ a- + -
-R: 递归修改权限
4.3新建文件和目录的默认权限
umask的值可以用来保留在创建文件权限
实现方式:
- 新建文件的默认权限: 666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶数不变
- 新建目录的默认权限: 777-umask
- 非特权用户umask默认是 002
- root的umask 默认是 022
查看umask
umask #模式方式显示
umask -S #输出可被调用
umask -p
修改umask
umask #
持久保存umask
- 全局设置:/etc/bashrc
- 用户设置:~/.bashrc
4.4linux系统上的特殊权限
前面介绍了三种常见的权限:r, w, x 还有三种特殊权限:SUID, SGID, Sticky
4.4.1 特殊权限SUID
前提:进程有属主和属组;文件有属主和属组
- 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
- 进程访问文件时的权限,取决于进程的发起者
(a) 进程的发起者,同文件的属主:则应用文件属主权限
(b) 进程的发起者,属于文件属组;则应用文件属组权限
© 应用文件“其它”权限
二进制的可执行文件上SUID权限功能:
- 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为原程序文件的属主
- SUID只对二进制可执行程序有效
- SUID设置在目录上无意义
SUID权限设定:
chmod u+s FILE...
chmod 6xxx FILE
chmod u-s FILE...
4.4.2 特殊权限SGID
二进制的可执行文件上SGID权限功能:
- 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属组为原程序文件的属组
SGID权限设定:
chmod g+s FILE...
chmod 2xxx FILE
chmod g-s FILE...
目录上的SGID权限功能:
默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录
4.4.3 特殊权限 Sticky 位
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
sticky 设置在文件上无意义
Sticky权限设定:
chmod o+t DIR...
chmod 1xxx DIR
chmod o-t DIR.
4.4.4 特殊权限数字法
SUID SGID STICKY
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
范例;
chmod 4777 /tmp/a.txt
权限位映射
SUID: user,占据属主的执行权限位
- s:属主拥有x权限
- S:属主没有x权限
SGID: group,占据属组的执行权限位
- s: group拥有x权限
- S:group没有x权限
Sticky: other,占据other的执行权限位
- t:other拥有x权限
- T:other没有x权限
4.5设置文件的特殊属性
设置文件的特殊属性,可以防止root用户误操作删除或修改文件
不能删除,改名。更改
chattr +i
只能追加内容,不能删除,改名
chattr +a
显示特定属性
lsattr
4.6访问控制列表
- ALC权限功能
ACL:Access Control List,实现灵活的权限管理
除了文件的所有者,所属组和其它人,可以对更多的用户设置权限
CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
tune2fs –o acl /dev/sdb1
mount –o acl /dev/sdb1 /mnt/test
ACL生效顺序:
所有者,自定义用户,所属组|自定义组,其他人
ACL相关命令
setfacl 可以设置ACL权限
getfacl 可查看设置的ACL权限
mask 权限
- mask只影响除所有者和other的之外的人和组的最大权限
- mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)
- 用户或组的设置必须存在于mask权限设定范围内才会生效
备份和还原ACL
主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息
第二周 文本处理工具和正则表达式
1.文本编辑工具之神VIM
1.1使用vim初步
vim命令格式
vim [OPTION]... FILE...
常用选项:
+# 打开文件后,让光标处于第#行的行首,+默认行尾
+/PATTERN 让光标处于第一个被PATTERN匹配到的行行首
-b file 二进制方式打开文件
-d file1 file2… 比较多个文件,相当于 vimdiff
-m file 只读打开文件
-e file 直接进入ex模式,相当于执行ex file
-y file Easy mode (like “evim”,modeless),直接可以操作文件,ctrl+o;wq|q! 保存和不保存退出
说明:
- 如果该文件存在,文件被打开并显示内容
- 如果该文件不存在,当编辑后第一次存盘时创建它
三种主要模式和切换
三种常见模式:
- 命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本
- 插入(Insert)或编辑模式:用于修改文本
- 扩展命令(extended command )或命令(末)行模式:保存,退出等
模式转换
- 命令模式 --> 插入模式
i insert, 在光标所在处输入
I 在当前光标所在行的行首输入
a append, 在光标所在处后面输入
A 在当前光标所在行的行尾输入
o 在当前光标所在行的下方打开一个新行
O 在当前光标所在行的上方打开一个新行 - 插入模式 — ESC-----> 命令模式
- 命令模式 ---- : ----> 扩展命令模式
- 扩展命令模式 ----ESC,enter----> 命令模式
1.2扩展命令模式
1.2.1扩展命令模式基本命令
w 写(存)磁盘文件
wq 写入并退出
x 写入并退出
X 加密
q 退出
q! 不存盘退出,即使更改都将丢失
r filename 读文件内容到当前文件中
w filename 将当前文件内容写入另一个文件
!command 执行命令
r!command 读入命令的输出
1.2.2地址定界
格式:
:start_pos,end_pos cmd
# # 具体第#行,例如2表示第2行
#,# 从左侧#表示起始行,到右侧#表示结尾行
#,+# 从左侧#表示的起始行,加上右侧#表示的行数,范例:2,+3 表示2到5行
. 当前行
$ 最后一行
.,$-1 当前行到倒数第二行
% 全文, 相当于1,$
/pattern/ 从当前行向下查找,直到匹配pattern的第一行,即:正则表达式
/pat1/,/pat2/ 从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束
#,/pat/ 从指定行开始,一直找到第一个匹配patttern的行结束
/pat/,$ 向下找到第一个匹配patttern的行到整个文件的结尾的所有行
地址定界后跟一个编辑命令
d 删除
y 复制
w file: 将范围内的行另存至指定文件中
r file:在指定位置插入指定文件中的所有内容
1.2.3查找并替换
格式:
s/要查找的内容/替换为的内容/修饰符
要查找的内容:可使用正则表达式模式
替换为的内容:不能使用模式,但可以使用\1, \2, …等后向引用符号;还可以使用“&”引用前面查找时查找到的整个内容
修饰符:
i #忽略大小写
g #全局替换,默认情况下,每一行只替换第一次出现
gc #全局替换,每次替换前询问
说明:查找替换中的分隔符/可替换为其它字符,如:#,@
1.2.4定制vim的工作特性
扩展命令模式的配置只是对当前vim进程有效,可以将配置存放在文件中持久保存
- 配置文件:
/etc/vimrc #全局
~/.vimrc #个人
-
行号
显示:set number,简写 set nu
取消显示:set nonumber, 简写 set nonu -
忽略字符的大小写
启用:set ignorecase,简写 set ic
不忽略:set noic -
自动缩进
启用:set autoindent,简写 set ai
禁用:set noai -
复制保留格式
启用:set paste
禁用:set nopaste -
显示Tab和换行符 ^I 和$显示
启用:set list
禁用:set nolist -
高亮搜索
启用:set hlsearch
禁用:set nohlsearch -
语法高亮
启用:syntax on
禁用:syntax off -
文件格式
启用windows格式:set fileformat=dos
启用unix格式:set fileformat=unix
简写 set ff=dos|unix -
设置文本宽度
set textwidth=65 (vim only)
set wrapmargin=15 -
设置光标所在行的标识线
启用:set cursorline,简写 set cul
禁用:set nocursorline -
加密
启用: set key=password
禁用: set key= -
了解更多
set 帮助
:help option-list
:set or :set all
1.3命令模式
命令模式功能强大,只是按键时,看不到输入,所以需要大量的记忆才能更好的使用。
1.31退出VIM
ZZ 保存退出
ZQ 不保存退出
1.3.2 光标跳转
-
字符间跳转:
h: 左 L: 右 j: 下 k: 上
#COMMAND:跳转由#指定的个数的字符 -
单词间跳转:
w:下一个单词的词首
e:当前或下一单词的词尾
b:当前或前一个单词的词首
#COMMAND:由#指定一次跳转的单词数 -
当前页跳转:
H:页首 M:页中间行 L:页底
zt:将光标所在当前行移到屏幕顶端
zz:将光标所在当前行移到屏幕中间
zb:将光标所在当前行移到屏幕底端 -
行首行尾跳转:
^ 跳转至行首的第一个非空白字符
0 跳转至行首
$ 跳转至行尾 -
行间移动:
#G 或者扩展命令模式下:# 跳转至由第#行
G 最后一行
1G, gg 第一行 -
句间移动:
) 下一句 ( 上一句
-
段落间移动:
} 下一段 { 上一段
-
命令模式翻屏操作
Ctrl+f 向文件尾部翻一屏
Ctrl+b 向文件首部翻一屏
Ctrl+d 向文件尾部翻半屏
Ctrl+u 向文件首部翻半屏
1.4.3 字符编辑
x 删除光标处的字符
#x 删除光标处起始的#个字符
xp 交换光标所在处的字符及其后面字符的位置
~ 转换大小写
J 删除当前行后的换行符
1.3.4 替换命令(replace)
r 替换光标所在处的字符
R 切换成REPLACE模式(在末行出现–REPLACE–提示),按ESC回到命令模式
1.3.5 删除命令(delete)
d 删除命令,可结合光标跳转字符,实现范围删除
d$ 删除到行尾
d^ 删除到非空行首
d0 删除到行首
dw
de
db
#COMMAND
#dd 多行删除
D:从当前光标位置一
直删除到行尾,等同于d$
1.3.6 复制命令(yank)
y 复制,行为相似于d命令
y$
y0
y^
ye
yw
yb
#COMMAND
yy:复制行
#yy 复制多行
Y:复制整行
1.3.7 信息粘贴命令(paste)
p 缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面
P 缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面
1.3.8 改变命令(change)
c: 删除后切换成插入模式
c$
c^
c0
cb
ce
cw
#COMMAND
cc:删除当前行并输入新内容,相当于S
#cc
C:删除当前光标到行尾,并切换成插入模式,相当于c$
1.3.9查找
/PATTERN:从当前光标所在处向文件尾部查找
?PATTERN:从当前光标所在处向文件首部查找
n:与命令同方向
N:与命令反方向
1.3.10 撤销更改
u 撤销最近的更改
#u 撤销之前多次更改
U 撤消光标落在这行后所有此行的更改
Ctrl - r 重做最后的“撤消”更改
. 重复前一个操作
#. 重复前一个操作#次
1.3.11 高级用法
<start position><command><end position>
常见Command:y 复制、d 删除、gU 变大写、gu 变小写
范例:
0y$ 命令
0 → 先到行头
y → 从这里开始拷贝
$ → 拷贝到本行最后一个字符
di" 光标在”“之间,则删除”“之间的内容
yi( 光标在()之间,则复制()之间的内容
vi[ 光标在[]之间,则选中[]之间的内容
dtx 删除字符直到遇见光标之后的第一个 x 字符
ytx 复制字符直到遇见光标之后的第一个 x 字符
1.4可视化模式
允许选择的文本块
- v 面向字符
- V 面向整行
- ctrl-v 面向块
可视化键可用于与移动键结合使用
w ) } 箭头等
突出显示的文字可被删除,复制,变更,过滤,搜索,替换等
范例:
输入ctrl+v 进入可视化模式
输入 G 跳到最后1行,选中第一行
输入 I 切换至插入模式
输入 #
按 ESC 键
1.5多文件模式
vim FILE1 FILE2 FILE3 …
:next 下一个
:prev 前一个
:first 第一个
:last 最后一个
:wall 保存所有
:qall 不保存退出所有
:wqall保存退出所有
1.6 多窗口模式
-
多文件分割
vim -o|-O FILE1 FILE2 …
-o: 水平或上下分割
-O: 垂直或左右分割(vim only)
在窗口间切换:Ctrl+w, Arrow -
单文件窗口分割
Ctrl+w,s:split, 水平分割
Ctrl+w,v:vertical, 垂直分割
ctrl+w,q:取消相邻窗口
ctrl+w,o:取消全部窗口
:wqall 退出
1.7vim的寄存器
有26个命名寄存器和1个无命名寄存器,常存放不同的剪贴版内容,可以不同会话间共享
寄存器名称a,b,…,z,格式:“寄存器 放在数字和命令之间
范例:
3"tyy 表示复制3行到t寄存器中
"tp 表示将t寄存器内容粘贴
未指定,将使用无命名寄存器
有10个数字寄存器,用0,1,…,9表示,0存放最近复制内容,1存放最近删除内容。当新的文本变更
和删除时,1转存到2,2转存到3,以此类推。数字寄存器不能在不同会话间共享
1.8 标记和宏(macro)
ma 将当前位置标记为a,26个字母均可做标记, mb 、 mc 等等
'a 跳转到a标记的位置,实用的文档内标记方法,文档中跳跃编辑时很有用
qa 录制宏 a,a为宏的名称
q 停止录制宏
@a 执行宏 a
@@ 重新执行上次执行的宏
1.9编辑二进制文件
#以二进制方式打开文件
vim -b binaryfile
#扩展命令模式下,利用xxd命令转换为可读的十六进制
:%!xxd
#插入模式下,编辑二进制文件
#扩展命令模式下,利用xxd命令转换回二进制
:%!xxd -r
#保存退出
1.10帮助
:help
:help topic
Use :q to exit help
vimtutor
2.文本常见处理工具
2.1文件内容查看命令
- 查看文本文件内容 cat
格式:
cat [OPTION]... [FILE]...
常见选项
-E:显示行结束符$
-A:显示所有控制符
-n:对显示出的每一行进行编号
-b:非空行编号
-s:压缩连续的空行成一行
nl 显示行号,相当于cat -b
tac 逆向显示文本内容
rev 将同一行的内容逆向显示
-
查看非文本内容
hexdump
od 即dump files in octal and other formats
xxd
2.2分页查看文件内容
more 可以实现分页查看文件,可以配合管道实现输出信息的分页
格式:
more [options] file...
选项:
-d: 显示翻页及退出提示
less 也可以实现分页查看文件或STDIN输出
查看时有用的命令包括:
/文本 搜索 文本
n/N 跳到下一个 或 上一个匹配
less 命令是man命令使用的分页器
2.3显示文本前或后行内容
head 可以显示文件或标准输入的前面行
格式:
head [OPTION]... [FILE]...
选项:
-c # 指定获取前#字节
-n # 指定获取前#行
-# 同上
tail 和head 相反,查看文件或标准输入的倒数行
格式:
tail [OPTION]... [FILE]...
选项:
-c # 指定获取后#字节
-n # 指定获取后#行
-# 同上
-f 跟踪显示文件fd新追加的内容,常用日志监控,相当于 --follow=descriptor,当文件删除再新建同名文
件,将无法继续跟踪文件
-F 跟踪文件名,相当于--follow=name --retry,当文件删除再新建同名文件,将可以继续跟踪文件
tailf 类似tail –f,当文件不增长时并不访问文件
2.4 按列抽取文本
cut 命令可以提取文本文件或STDIN数据的指定列
格式:
cut [OPTION]... [FILE]...
选项:
-d DELIMITER: 指明分隔符,默认tab
-f FILEDS:
#: 第#个字段,例如:3
#,#[,#]:离散的多个字段,例如:1,3,6
#-#:连续的多个字段, 例如:1-6
混合使用:1-3,7
-c 按字符切割
--output-delimiter=STRING指定输出分隔符
2.5合并多个文件
paste 合并多个文件同行号的列到一行
格式:
paste [OPTION]... [FILE]...
选项:
d 分隔符:指定分隔符,默认用TAB
-s : 所有行合成一行显示
2.6分析文本的工具
文本数据统计:wc
整理文本:sort
比较文件:difpatch
2.6.1 收集文本统计数据
wc 命令可用于统计文件的行总数、单词总数、字节总数和字符总数 可以对文件或STDIN中的数据统计
常用选项 :
-l 只计数行数
-w 只计数单词总数
-c 只计数字节总数
-m 只计数字符总数
-L 显示文件中最长行的长度
2.6.2文本排序sort
把整理过的文本显示在STDOUT,不改变原始文件
格式:
sort [options] file(s)
常用选项:
r 执行反方向(由上至下)整理
-R 随机排序
-n 执行按数字大小整理
-f 选项忽略(fold)字符串中的字符大小写
-u 选项(独特,unique)删除输出中的重复行
-t c 选项使用c做为字段界定符
-k # 选项按照使用c字符分隔的 # 列来整理能够使用多次
2.6.3去重uniq
uniq命令从输入中删除前后相接的重复的行
格式:
uniq [OPTION]... [FILE]...
常见选项:
-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行
uniq常和sort 命令一起配合使用:
2.6.4比较文本
diff 命令比较两个文件之间的区别
3.正则表达式
REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)
不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能
正则表达式被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql 等
正则表达式分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块,如:PCRE(Perl Compatible Regular
Expressions)
正则表达式的元字符分类:字符匹配、匹配次数、位置锚定、分组
帮助:man 7 regex
3.1基本正则表达式元字符
3.1.1字符匹配
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符,示例:[^wang]
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
3.1.2匹配次数
用在要指定次数的字符后面,用于指定前面的字符要出现的次数
* 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
\? 匹配其前面的字符0或1次,即:可有可无
\+ 匹配其前面的字符至少1次,即:肯定有
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
3.1.3位置锚定
位置锚定可以用于定位出现的位置
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定,用于单词模式的右侧
\<PATTERN\> 匹配整个单词
范例:
3.1.4分组其它
分组:() 将一个或多个字符捆绑在一起,当作一个整体处理,如:(root)+ 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, …
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
或者:\
3.2扩展正则表达式
3.2.1字符匹配元字符
. 任意单个字符
[wang] 指定范围的字符
[^wang] 不在指定范围的字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
3.2.2次数匹配
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
3.2.3位置锚定
^ 行首
$ 行尾
\<, \b 语首
\>, \b 语尾
3.2.4分组其它
() 分组
后向引用: \1, \2, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat
扩展正则表达式练习
1、显示三个用户root、mage、wang的UID和默认shell
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
4、使用egrep取出上面路径的目录名
5、统计last命令中以root登录的每个主机IP地址登录次数
6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
7、显示ifconfig命令结果中所有IPv4地址
8、将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面
4.文本处理三剑客
grep 命令主要对文本的(正则表达式)行基于模式进行过滤
sed:stream editor,文本编辑工具
awk:Linux上的实现gawk,文本报告生成器
4.1文本处理三剑客之grep
grep: Global search REgular expression and Print out the line
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
格式:
grep [OPTIONS] PATTERN [FILE...]
常见选项:
--color=auto 对匹配到的文本着色显示
-m # 匹配#次后停止
-v 显示不被pattern匹配到的行
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ’ -e ‘dog’ file
-w 匹配整个单词
-E 使用ERE,相当于egrep
-F 相当于fgrep,不支持正则表达式
-f file 根据模式文件处理
-r 递归目录,但不处理软链接
-R 递归目录,但处理软链接
范例:
[20:03:29 root@centos8 ~ ]#grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[20:09:52 root@centos8 ~ ]#grep "rc" /etc/passwd
rc:x:1000:1000:RC:/home/rc:/bin/bash
[20:10:14 root@centos8 ~ ]#grep 'rc' /etc/passwd
rc:x:1000:1000:RC:/home/rc:/bin/bash
范例:
[20:10:18 root@centos8 ~ ]#df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 394148 0 394148 0% /dev
tmpfs 408604 0 408604 0% /dev/shm
tmpfs 408604 5780 402824 2% /run
tmpfs 408604 0 408604 0% /sys/fs/cgroup
/dev/sda2 104806400 2091052 102715348 2% /
/dev/sda5 52403200 398740 52004460 1% /data
/dev/sda1 999320 122076 808432 14% /boot
tmpfs 81720 0 81720 0% /run/user/0
[20:11:01 root@centos8 ~ ]#df|grep '^/dev/sd' | tr -s ' ' %|cut -d% -f5
2
1
14
[20:12:20 root@centos8 ~ ]#df|grep '^/dev/sd' | tr -s ' ' %|cut -d% -f5|sort -n
1
2
14
[20:12:45 root@centos8 ~ ]#df|grep '^/dev/sd' | tr -s ' ' %|cut -d% -f5|sort -n|tail -1
14
范例:
[20:32:20 root@centos8 ~ ]#ifconfig |grep -Eo '([0-9]{1,3}\.){3}[1-9]{1,3}'
10.0.0.8
10.0.0.255
127.0.0.1
[20:38:19 root@centos8 ~ ]#ifconfig |grep -Eo '([0-9]{1,3}\.){3}[1-9]{1,3}'|head -1
10.0.0.8
[20:38:41 root@centos8 ~ ]#ifconfig |grep -Eo '([0-9]{1,3}\.){3}[1-9]{1,3}'|head -2
10.0.0.8
10.0.0.255
范例:
[20:38:50 root@centos8 ~ ]#grep -E 'root|bash' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rc:x:1000:1000:RC:/home/rc:/bin/bash
[20:41:41 root@centos8 ~ ]#grep -e 'root' -e 'bash' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rc:x:1000:1000:RC:/home/rc:/bin/bash
4.2文本处理三剑客之 sed
4.2.1 sed 工作原理
sed 即 stream EDitor,和 vi 不同,sed是行编辑器
Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到 最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(Pattern Space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下 一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时 不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为 vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理, 打开速度非常快,执行速度也很快
参考网站:http://www.gnu.org/software/sed/manual/sed.html
4.2.2sed 基本用法
格式:
sed [option]... 'script;script;...' inputfile...
常见选项:
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f FILE 从指定文件中读取编辑脚本
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑
script格式:
“地址命令”
地址格式:
1. 不给地址:对全文进行处理
2. 单地址:
#:指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行
3. 地址范围:
#,# #从#行到#行,3,6 从第三行到第六行
#,+# #从#行到+#行,3,+4 表示从第三行到第七行
/pat1/,/pat2/
#,/pat/
4. 步进:~
1~2 奇数行
2~2 偶数行
命令:
p 打印当前模式空间内容,追加到默认输出之后
Ip 忽略大小写
d 删除模式空间匹配的行,并立即启用下一轮循环
a [\]text 在指定行后面追加文本,支持使用\n实现多行追加
i [\]text 在行前面插入文本
c [\]text 替换行为单行或多行文本
w file 保存模式匹配的行至指定文件
r file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
s/pattern/string/ 修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###替换修饰符:
g 行内全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中
I,i 忽略大小写
范例:
[20:58:18 root@centos8 ~ ]#sed -n ' ' /etc/issue
[20:58:40 root@centos8 ~ ]#sed 'p' /etc/issue
FBI warning
FBI warning
[20:58:56 root@centos8 ~ ]#sed -n ' ' /etc/issue
[20:59:02 root@centos8 ~ ]#sed -n 'p' /etc/issue
FBI warning
范例:
[21:01:25 root@centos8 ~ ]#seq 10|sed -n 'p'
1
2
3
4
5
6
7
8
9
10
[21:00:52 root@centos8 ~ ]#seq 10|sed -n '1~2p'
1
3
5
7
9
[21:01:20 root@centos8 ~ ]#seq 10|sed -n '2~2p'
2
4
6
8
10
范例:
[21:01:54 root@centos8 ~ ]#sed -n '1p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[21:02:54 root@centos8 ~ ]#sed -n '1,3p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
范例:
[21:04:01 root@centos8 ~ ]#ifconfig |sed -n '2p'
inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255
范例:
#删除所有以#开头的行
[11:05:22 root@centos8 data ]#sed -i '/^#/d' /data/f1.txt
[11:08:50 root@centos8 data ]#cat f1.txt
UUID=f4649a8a-7afd-411b-977a-60f93851dfe9 / xfs defaults 0 0
UUID=b97bc31f-c03d-4fe9-8715-c1c198790fcb /boot ext4 defaults 1 2
UUID=53ef4f7b-6dfb-4966-8d53-4e821d68d5d1 /data xfs defaults 0 0
UUID=038ae1c0-0d16-4088-8a15-0f41829c30ea swap swap defaults 0 0
#只显示非#开头的行
[11:12:29 root@centos8 data ]#sed -n '/^#/!p' /data/f1.txt
UUID=f4649a8a-7afd-411b-977a-60f93851dfe9 / xfs defaults 0 0
UUID=b97bc31f-c03d-4fe9-8715-c1c198790fcb /boot ext4 defaults 1 2
UUID=53ef4f7b-6dfb-4966-8d53-4e821d68d5d1 /data xfs defaults 0 0
UUID=038ae1c0-0d16-4088-8a15-0f41829c30ea swap swap defaults 0 0
范例:在文本后面追加内容
[21:10:12 root@centos8 ~ ]#sed '/root/a line1\nline2' /etc/passwd
root:x:0:0:root:/root:/bin/bash
line1
line2
[21:10:23 root@centos8 ~ ]#sed '/root/a\ line1\n line2' /etc/passwd
root:x:0:0:root:/root:/bin/bash
line1
line2
范例:替换行文本
[21:21:45 root@centos8 data ]#sed -n '/enforcing$/p' /etc/selinux/config
SELINUX=enforcing
[21:24:20 root@centos8 data ]#sed -i '/enforcing$/cSELINUX=disabled' /etc/selinux/config
[21:25:49 root@centos8 data ]#cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
范例:文本搜索替代
[09:10:53 root@centos8 data ]#sed -n '/root/p' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[09:13:34 root@centos8 data ]#sed -n '/r..t/s@r..t@admin@p' passwd
admin:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin
ftp:x:14:50:FTP User:/vaadminp:/sbin/nologin
[09:18:06 root@centos8 data ]#sed -n '/r..t/s@r..t@admin@gp' passwd
admin:x:0:0:admin:/admin:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin
ftp:x:14:50:FTP User:/vaadminp:/sbin/nologin
范例:
[10:40:37 root@centos8 data ]#df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 394148 0 394148 0% /dev
tmpfs 408604 0 408604 0% /dev/shm
tmpfs 408604 10888 397716 3% /run
tmpfs 408604 0 408604 0% /sys/fs/cgroup
/dev/sda2 104806400 2090000 102716400 2% /
/dev/sda5 52403200 398744 52004456 1% /data
/dev/sda1 999320 122076 808432 14% /boot
tmpfs 81720 0 81720 0% /run/user/0
[10:42:28 root@centos8 data ]#df |sed -rn '/^\/dev\/sd/s@.*([0-9]+)%@\1@p'
2% /
1% /data
4% /boot
[10:42:30 root@centos8 data ]#df |sed -rn '/^\/dev\/sd/s@.*([0-9]+)%.*@\1@p'
2
1
4
范例:在搜索到的文本后/前追加文本
[09:20:07 root@centos8 data ]#sed -n '/r..t/s@r..t@&er@gp' passwd
rooter:x:0:0:rooter:/rooter:/bin/bash
operator:x:11:0:operator:/rooter:/sbin/nologin
ftp:x:14:50:FTP User:/var/fterp:/sbin/nologin
[09:22:12 root@centos8 data ]#sed -n '/r..t/s@r..t@er&@gp' passwd
erroot:x:0:0:erroot:/erroot:/bin/bash
operator:x:11:0:operator:/erroot:/sbin/nologin
ftp:x:14:50:FTP User:/vaerr/ftp:/sbin/nologin
范例:取基名和目录名
[09:22:18 root@centos8 data ]#echo /etc/sysconfig/network-scripts/
/etc/sysconfig/network-scripts/
[09:29:12 root@centos8 data ]#echo /etc/sysconfig/network-scripts/ |sed -rn 's#(^/.*/)([^/]+/?)#\2#p' #取基名
network-scripts/
[09:29:33 root@centos8 data ]#echo /etc/sysconfig/network-scripts/ |sed -rn 's#(^/.*/)([^/]+/?)#\1#p' #取目录名
/etc/sysconfig/
范例:取文件的前缀和后缀
[09:41:15 root@centos8 data ]#echo a.c.x.txt |sed -rn 's/(.*)\.([^.]+)$/\2/p'
txt
[09:41:35 root@centos8 data ]#echo a.c.x.txt |sed -rn 's/(.*)\.([^.]+)$/\1/p'
a.c.x
[09:41:39 root@centos8 data ]#echo a.c.x.txt |grep -Eo '[^.]+$'
txt
[09:46:19 root@centos8 data ]#echo a.c.x.txt |grep -Eo '.*\.'
a.c.x.
范例:取 IP地址
[10:11:42 root@centos8 data ]#ifconfig ens160|sed -n '2p'|sed 's/^.*inet//'|sed 's/ netmask.*//'
10.0.0.8
[10:17:49 root@centos8 data ]#ifconfig ens160 |sed -ne '2s/^.*inet //' -e 's/ netmask.*//p'
10.0.0.8
[10:30:37 root@centos8 data ]#ifconfig ens160 |sed -rn '2s/[^0-9]+([0-9.]+).*/\1/p' #通用方式
10.0.0.8
4.2.3 sed 高级用法
sed 中除了模式空间,还另外还支持保持空间(Hold Space),利用此空间,可以将模式空间中的数 据,临时保存至保持空间,从而后续接着处理,实现更为强大的功能。
常见高级命令:
P 打印模式空间开端至\n内容,并追加到默认输出之前
h 把模式空间中的内容覆盖至保持空间中
H 把模式空间中的内容追加至保持空间中
g 从保持空间取出数据覆盖至模式空间
G 从保持空间取出内容追加至模式空间
x 把模式空间中的内容与保持空间中的内容进行互换
n 读取匹配到的行的下一行覆盖至模式空间
N 读取匹配到的行的下一行追加至模式空间
d 删除模式空间中的行
D 如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环
练习:
1、删除centos7系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符
2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
3、在centos6系统/root/install.log每一行行首增加#号
4、在/etc/fstab文件中不以#开头的行的行首增加#号
5、处理/etc/fstab路径,使用sed命令取出其目录名和基名
6、利用sed 取出ifconfig命令中本机的IPv4地址
7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
8、统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现) 9、将文本文件的n和n+1行合并为一行,n为奇数行
第三周 SHELL脚本编程
1.编程基础
1.1程序组成
- 程序:算法+数据结构
- 数据:是程序的核心
- 数据结构:数据在计算机中的类型和组织方式
- 算法:处理数据的方式
1.2程序编程风格
面向过程语言
- 做一件事,排出个步骤,第一步干什么,第二步干什么,如果出现情况A,做什么处理,如果出现情况B,做什么处理
- 问题规模小,可以步骤化,按部就班处理
- 一直指令为中心,数据服务于指令
- C,shell
面向对象语言
- 一种认识世界、分析世界的方法论。将万事万物抽象为各种对象
- 类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合
- 对象是类的具象,是一个实体
- 问题规模大,是一个实体
- 以数据为中心,指令服务于数据
- java,c#,python,golang等
1.3编程语言
计算机:运行二进制指令
编程语言:人与计算机之间交互的语言。分为两种:低级语言和高级语言
-
低级编程语言:
机器:二进制的0和1的序列,称为机器指令。与自然语言差异太大,难懂、难写
汇编:用一些助记符号替代机器指令,称为汇编语言
如:ADD A,B 将寄存器A的数与寄存器B的数相加得到的数放到寄存器A中
汇编语言写好的程序需要汇编程序转换成机器指令
汇编语言稍微好理解,即机器指令对应的助记符,助记符更接近自然语言 -
高级编程语言:
编译:高级语言–>编译器–>机器代码文件–>执行,如:C,C++
解释:高级语言–>执行–>解释器–>机器代码,如:shell,python,php,JavaScript,perl
1.4编程逻辑处理方式
三种逻辑处理方式
- 顺序执行:程序从上到下顺序执行
- 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
- 循环执行:程序执行过程中需要重复执行多次某段语句
2.shell脚本语言的基础用法
2.1shell脚本的用途
- 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
- 减少手工命令的重复输入,一定程度上避免人为错误
- 将软件或应用的安装及配置实现标准化
- 用于实现日常性的、重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警
2.2shell脚本基本结构
shell脚本编程:是基于过程式、解释执行的语言
编程语言的基本结构:
- 各种系统命令的组合
- 数据存储、变量、数组
- 表达式:a+b
- 控制语句: if
shell脚本:包含一些命令或声明,并符合一定格式的文本文件
格式要求:首行shebang机制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
2.2创建shell脚本的过程
第一步:使用文本编辑器来创建文本文件
第一行必须包括shell声明序列:#!
示例:
#!/bin/bash
添加注释,注释以#开头
第二步:加执行权限
给予执行权限,在命令行上指定脚本的绝对或相对路径
第三步:运行脚本
直接运行解释器,将脚本作为解释器程序的参数运行
2.3脚本注释规范
1、第一行一般为调用使用的语言
2、程序名,避免更改文件名为无法找到正确的文件
3、版本号
4、更改后的时间
5、作者相关信息
6、该程序的作用,及注意事项
7、最后是各版本的更新简要说明
2.4shell脚本调试
只检测脚本中的语法错误,但无法检查出错误命令,但不真正执行脚本
bash -n /path/to/some_script
t调试并执行
bash -x /path/to/some_script
脚本常见的三种错误:
语法错误:会导致后续的命令不继续执行,可以用bash -n检查错误,提示的出错行不一定是准确的
命令错误:默认后续的命令还会继续执行,用bash -n无法检查出来,可以使用bash -x进行观察
逻辑错误:只能使用bash -x进行观察
第一个脚本:备份etc文件:
[17:30:42 root@centos8 data ]$cat backup.sh
#!/bin/bash
COLOR='echo -e \e[1;33m'
END='\e[0m'
SRC=/etc
BACKUP=backup
DATE=`date +%F_%T`
${COLOR}starting backup....$END
sleep 2
cp -av $SRC /data${SRC}_${BACKUP}_${DATE}
${COLOR}backup is finished$END
2.5变量
变量表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据
2.5.1 变量类型
**变量类型:**普通变量,内置变量,环境变量,位置变量,只读变量
- 内置变量,如:PS1,PATH,HISTSIZE
- 用户自定义变量
不同的变量存放的数据不同,决定了以下
- 数据存储方式
- 参与的运算
- 表示的数据范围
变量数据类型:
- 字符
- 数值:整型、浮点型,bash 不支持浮点数
2.5.2 编程语言分类
静态和动态语言
- 静态编译语言:使用变量前,先声明变量类型,之后类型不能改变,在编译时检查,如:java,c
- 动态编译语言:不用事先声明,可随时改变类型2.5.3,如:bash,Python
强类型和弱类型语言
- 强类型语言:不同类型数据操作,必须经过强制转换才同一类型才能运算,如java , c# ,python
如:以下python代码
print(‘magedu’+ 10) 提示出错,不会自动转换类型
print(‘magedu’+str(10)) 结果为magedu10,需要显示转换类型 - 弱类型语言:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会
自动进行隐式类型转换;变量无须事先定义可直接调用
如:bash ,php,javascript
2.5.3shell中变量命名法则
- 不能使程序中的保留字:如:if, for
- 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”
- 见名知义,用英文名字,并体现出实际作用
- 统一命名规则:驼峰命名法, studentname,大驼峰StudentName 小驼峰studentName
- 变量名大写
- 局部变量小写
- 函数名小写
2.5.4变量定义和引用
变量的生效范围等标准划分变量类型
- 普通变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
- 环境变量:生效范围为当前shell进程及其子进程
- 本地变量:生效范围为当前shell进程中某代码片断,通常指函数
变量赋值
name='value'
value可以是以下多种形式
直接字串:name='root'
变量引用:name="$USER"
命令引用:name=`COMMAND` 或者 name=$(COMMAND)
变量引用:
$name
${name}
弱引用和强引用
- "$name " 弱引用,其中的变量引用会被替换为变量值
- '$name ’ 强引用,其中的变量引用不会被替换为变量值,而保持原字符串
范例:变量的赋值方法和引用
[10:39:37 root@centos8 ~ ]$NAME=rc
[10:45:20 root@centos8 ~ ]$echo $NAME
rc
[10:45:32 root@centos8 ~ ]$echo I am $NAME
I am rc
[10:45:55 root@centos8 ~ ]$echo "I am $NAME"
I am rc
[10:46:07 root@centos8 ~ ]$echo 'I am $NAME'
I am $NAME
[10:46:19 root@centos8 ~ ]$NAME=$USER
[10:48:11 root@centos8 ~ ]$echo $NAME
root
[10:49:34 root@centos8 ~ ]$seq 10
1
2
3
4
5
6
7
8
9
10
[10:51:02 root@centos8 ~ ]$NUM=`seq 10`
[10:51:13 root@centos8 ~ ]$echo $NUM
1 2 3 4 5 6 7 8 9 10
[10:51:15 root@centos8 ~ ]$echo "$NUM"
1
2
3
4
5
6
7
8
9
10
[10:52:46 root@centos8 ~ ]$NAME="
> rc
> ruchao
> "
[10:54:01 root@centos8 ~ ]$echo $NAME
rc ruchao
[10:54:10 root@centos8 ~ ]$echo "$NAME"
rc
ruchao
范例:变量引用
[10:54:23 root@centos8 ~ ]$NAME=RC
[11:11:16 root@centos8 ~ ]$AGE=24
[11:11:29 root@centos8 ~ ]$echo $NAME
RC
[11:11:36 root@centos8 ~ ]$echo $AGE
24
[11:11:42 root@centos8 ~ ]$echo $NAME $AGE
RC 24
[11:11:54 root@centos8 ~ ]$echo $NAME$AGE
RC24
[11:12:02 root@centos8 ~ ]$echo $NAME_$AGE
24
[11:12:09 root@centos8 ~ ]$echo ${NAME}_$AGE
RC_24
范例:变量追加赋值
[11:12:16 root@centos8 ~ ]$echo $NAME
RC
[11:14:44 root@centos8 ~ ]$NAME+=:CEO
[11:15:21 root@centos8 ~ ]$echo $NAME
RC:CEO
范例:利用变量实现动态命令
[11:16:23 root@centos8 ~ ]$CMD=hostname
[11:16:39 root@centos8 ~ ]$$CMD
centos8
[11:17:12 root@centos8 ~ ]$echo `$CMD`
centos8
显示已定义的所有变量:
set
删除变量
unset name
2.5.5 环境变量
环境变量:
- 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
- 一般子进程修改从父进程继承的变量,会将新的值床底给子进程的变量
- 一般只在系统配置文件中使用,在脚本中较少使用
#观察进程的父子关系
pstree -p
#查看当前所在shell
echo $BASHPID
#取代当前进程
exec CDM
变量声明和赋值
#声明和赋值
export name=VALUE
declare -x name=VALUE
#或者分两步实现
name=VALUE
expot name
变量引用
$name
${name}
显示所有环境变量
env
printenv
export
declare -x
删除变量:
unset name
bash内建的环境变量:
PATH
SHELL
USER
UID
HOME
PWD
SHLVL
LANG
MAIL
HOSTNAME
HISTSIZE
_ 下划线 表示前一命令的最后一个参数
2.5.6 只读变量
只读变量:只能声明定义,但后续不能修改和删除
声明只读变量:
readonly name
declare -r name
查看只读变量:
readonly [-p]
declare -r
2.5.7位置变量
位置变量:在bash shell中内置的变量, 在脚本代码中调用通过命令行传递给脚本的参数
$1, $2, ... 对应第1个、第2个等参数,shift [n]换位置
$0 命令本身,包括路径
$* 传递给脚本的所有参数,全部参数合为一个字符串
$@ 传递给脚本的所有参数,每个参数为独立字符串
$# 传递给脚本的参数的个数
注意:$@ $* 只在被双引号包起来的时候才会有差异
清空所有位置变量
set --
2.5.8退出状态码变量
进程执行后,将使用变量 ? 保 存 状 态 码 的 相 关 数 字 , 不 同 的 值 反 应 成 功 或 失 败 , ? 保存状态码的相关数字,不同的值反应成功或失败, ?保存状态码的相关数字,不同的值反应成功或失败,?取值范例 0-255
$?的值为0 代表成功
$?的值是1到255 代表失败
用户可以在脚本中使用以下命令自定义退出状态码
exit [n]
注意:
- 脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
- 如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
2.5.9展开命令行
展开命令执行顺序
把命令行分成单个命令词
展开别名
展开大括号的声明({})
展开波浪符声明(~)
命令替换$() 和 ``
再次把命令行分成命令词
展开文件通配(*、?、[abc]等等)
准备I/0重导向(<、>)
运行命令
防止扩展
反斜线(\)会使随后的字符按原意解释
加引号来防止扩展
单引号(’’)防止所有扩展
双引号(”“)也可防止扩展,但是以下情况例外:$(美元符号)
变量扩展
`` : 反引号,命令替换
\:反斜线,禁止单个字符扩展
!:叹号,历史命令替换
2.5.10脚本安全和set
set 命令:可以用来定制shell环境
$- 变量
- h:hashall,打开选项后,Shell 会将命令所在的路径hash下来,避免每次都要查询。通过set +h将h选项关闭
- i:interactive-comments,包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互式shell,在脚本中,i选项是关闭的
- m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执行等
- B:braceexpand,大括号扩展
- H:history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回上最近的一个历史命令,“!n”返回第 n 个历史命令
set 命令实现脚本安全
-
-u 在扩展一个没有设置的变量时,显示错误信息, 等同set -o nounset
-
-e 如果一个命令返回一个非0退出状态值(失败)就退出, 等同set -o errexit
-
-o option 显示,打开或者关闭选项
显示选项:set -o
打开选项:set -o 选项
关闭选项:set +o 选项 -
-x 当执行命令时,打印命令及其参数,类似 bash -x
2.6格式化输出printf
格式:
printf "指定的格式" "文本1" ”文本2“……
常用格式替换符
替换符 | 功能 |
---|---|
%s | 字符串 |
%f | 浮点格式 |
%b | 相对应的参数中包含转义字符时,可以使用此替换符进行替换,对应的转义字符会被转 义 |
%c | ASCII字符,即显示对应参数的第一个字符 |
%d,%i | 十进制整数 |
%o | 八进制值 |
%u | 不带正负号的十进制值 |
%x | 十六进制值(a-f) |
%X | 十六进制值(A-F) |
%% | 表示%本身 |
说明:%s 中的数字代表此替换符中的输出字符宽度,不足补空格,默认是右对齐,%-10s表示10个字 符宽,- 表示左对齐
常用转义字符
转义符 | 功能 |
---|---|
\a | 警告字符,通常为ASCII的BEL字符 |
\b | 后退 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ | 表示\本身 |
2.7算术运算
shell允许在某些情况下对算数表达式进行求值,比如:le和declare内置命令,(())复合命令和算数扩展。
注意:bash只支持整数,不支持小数
bash中的算术运算:
+, -, *, /, %取模(取余), **(乘方)
乘法符号有些场景中需要转义
实现算术运算:
(1) let var=算术表达式
(2) var=$[算术表达式]
(3) var=$((算术表达式))
(4) var=$(expr arg1 arg2 arg3 ...)
(5) declare –i var = 数值
(6) echo ‘算术表达式’ | bc
内建的随机数生成器变量
$RANDOM 取值范围:0-32767
范例:
#生成0-49之间的随机数
[16:20:22 root@centos8 ~ ]$echo $[RANDOM%50]
16
[16:20:37 root@centos8 ~ ]$echo $[RANDOM%50]
31
#随机颜色
[16:42:30 root@centos8 ~ ]$echo -e "\e[1;$[RANDOM%7+31]mRC\e[0m"
RC
[16:42:32 root@centos8 ~ ]$echo -e "\e[1;$[RANDOM%7+31]mRC\e[0m"
RC
增强型赋值
+= i+=10 相当于 i=i+10
-= i-=j 相当于 i=i-j
*=
/=
%=
++ i++,++i 相当于 i=i+1
-- i--,--i 相当于 i=i-1
#格式:
let varOPERvalue
#范例:
[18:38:50 root@centos8 ~ ]$let i=10*2
[19:16:47 root@centos8 ~ ]$echo $i
20
[19:16:59 root@centos8 ~ ]$((j=i+10))
[19:17:25 root@centos8 ~ ]$echo $j
30
#范例:自加,自减
[08:53:21 root@centos8 ~ ]$unset i j;i=1;let j=i++;echo "i=$i j=$j"
i=2 j=1
[09:06:19 root@centos8 ~ ]$unset i j;i=1;let j=++i;echo "i=$i j=$j"
i=2 j=2
2.8 逻辑运算
true ,false
1,真
0,假
**与:&:**和0相与,结果为0,和1相与,结果保留原值
1 与 1 = 1
1 与 0 = 0
0 与 1 = 0
0 与 0 = 0
**或:|:**和1相或,结果为1 ,和0相或,结果保留原值
1 或 1 = 1
1 或 0 = 1
0 或 1 = 1
0 或 0 = 0
非:!
!1 = 0
!0 =1
异或:^
相同为假,不同为真
两个数字X、Y异或得到结果Z,Z再和任意两者之一异或,将得到另外一个值
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
范例:
[09:56:33 root@centos8 ~ ]#vi /etc/profile.d/env.sh
[10:06:13 root@centos8 ~ ]#x=110
[10:06:59 root@centos8 ~ ]#y=120
[10:07:02 root@centos8 ~ ]#temp=$x
[10:07:14 root@centos8 ~ ]#x=$y
[10:08:13 root@centos8 ~ ]#y=$temp
[10:08:57 root@centos8 ~ ]#echo $x
120
[10:09:03 root@centos8 ~ ]#echo $y
110
范例:
[10:13:38 root@centos8 ~ ]#x=110 y=120;let x=$[x^y];let y=$[x^y];let x=$[x^y];echo x=$x y=$y
x=120 y=110
短路运算
-
短路与&&
CMD1 短路与 CMD2 第一个CMD1结果为 0 (假 ),总的结果必定为0,因此不需要执行CMD2 第一个CMD1结果为 1 (真),第二个CMD2必须要参与运算,才能得到最终的结果
-
短路或 ||
CMD1 短路或 CMD2 第一个CMD1结果为1 (真),总的结果必定为1,因此不需要执行CMD2 第一个CMD1结果为0 (假 ),第二个CMD2 必须要参与运算,,才能得到最终的结果
2.9条件测试命令
条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成测试过程
评估布尔声明,以便用在条件性执行中
若真,则状态码变量 $?返回 0
若假,则 状态码变量$?返回 1
条件测试命令
- test EXPRESSIO
- [ EXPRESSION ] #和test等价,建议使用[ ]
- [[ EXPRESSION ]] 增强版[ ] ,包含[ ]的功能,需要使用正则表达式或通配符的时候使用 [[ ]]
注意:EXPRESSION前后必须有空白字符
[10:16:29 root@centos8 ~ ]#help [
[: [ arg... ]
Evaluate conditional expression.
This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.
[11:08:57 root@centos8 ~ ]#help \[\[
[[ ... ]]: [[ expression ]]
Execute conditional command.
Returns a status of 0 or 1 depending on the evaluation of the conditional
expression EXPRESSION. Expressions are composed of the same primaries used
by the `test' builtin, and may be combined using the following operators:
( EXPRESSION ) Returns the value of EXPRESSION
! EXPRESSION True if EXPRESSION is false; else false
EXPR1 && EXPR2 True if both EXPR1 and EXPR2 are true; else false
EXPR1 || EXPR2 True if either EXPR1 or EXPR2 is true; else false
When the `==' and `!=' operators are used, the string to the right of
the operator is used as a pattern and pattern matching is performed.
When the `=~' operator is used, the string to the right of the operator
is matched as a regular expression.
The && and || operators do not evaluate EXPR2 if EXPR1 is sufficient to
determine the expression's value.
Exit Status:
0 or 1 depending on value of EXPRESSION.
2.9.1变量测试
#判断 NAME变量是否定义
[-v NAME]
3判断 NAME 变量是否定义并且是名称引用,bash4.4新特性
[-R NAME]
2.9.2数值测试
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于
算数表达比较:
== 相等
!= 不相等
<=
>=
<
>
2.9.3 字符串测试
test和[ ]用法
-z STRING 字符串是否为空,空为真,不空为假
-n STRING 字符串是否不空,不空为真,空为假
STRING 同上
STRING1 = STRING2 是否等于,注意 = 前后有空格
STRING1 != STRING2 是否不等于
> ascii码是否大于ascii码
< 是否小于
[[]]用法:
[[expression]]用法
== 左侧字符串是否和右侧的PATTERN相同
注意:此表达式用于[[ ]]中,PATTERN为通配符
=~ 左侧字符串是否能够被右侧的PATTERN所匹配
注意: 此表达式用于[[ ]]中;扩展的正则表达式
建议:当使用正则表达式或通配符时使用[[ ]],其他情况一般使用[ ]
范例:在比较字符串时,建议将变量放在" "中
[12:25:48 root@centos8 ~ ]#NAME="I LOVE YOU"
[12:26:01 root@centos8 ~ ]#[ $NAME ]
-bash: [: LOVE: binary operator expected
[12:26:18 root@centos8 ~ ]#[ "$NAME" ]
[12:26:24 root@centos8 ~ ]#echo $?
0
范例:[[ ]]和通配符
[12:26:44 root@centos8 ~ ]#FILE=txt.log
[12:33:22 root@centos8 ~ ]#[[ $FILE=*.log ]]
[12:33:58 root@centos8 ~ ]#echo $?
0
[[ ]]中如果不想使用通配符*,只想表达*本身,可以用""引起来,也可以使用转义符\
范例:判断合理的考试成绩
[12:51:53 root@centos8 ~ ]#SCORE=101
[12:52:03 root@centos8 ~ ]#[[ $SCORE =~ ^(100|[0-9]{1,2})$ ]]
[12:52:09 root@centos8 ~ ]#echo $?
1
2.9.4文件测试
存在性测试
-a FILE:同 -e
-e FILE: 文件存在性测试,存在为真,否则为假
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE 或 -L FILE:存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件
文件权限测试
-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
-u FILE:是否存在且拥有suid权限
-g FILE:是否存在且拥有sgid权限
-k FILE:是否存在且拥有sticky权限
注意:最终结果由用户对文件的实际权限决定,而非文件属性决定
文件属性测试
-s FILE: 是否存在且非空
-t fd: fd 文件描述符是否在某终端已经打开
-N FILE:文件自从上一次被读取之后是否被修改过
-O FILE:当前有效用户是否为文件属主
-G FILE:当前有效用户是否为文件属组
FILE1 -ef FILE2: FILE1是否是FILE2的硬链接
FILE1 -nt FILE2: FILE1是否新于FILE2(mtime)
FILE1 -ot FILE2: FILE1是否旧于FILE2
2.10 关于()和{ }
(CMD1;CMD2;…) 和 {CMD1;CMD2;…}都可以将多个命令组合在一起,批量执行
( list ) 会开启子shell,并且list中变量赋值及内部命令执行后,将不再影响后续的环境, 帮助参看:man bash 搜索(list)
{ list; } 不会启子shell, 在当前shell中运行,会影响当前shell环境, 帮助参看:man bash 搜索{ list; }
范例:
[12:17:23 root@centos8 ~ ]#name=mage;(echo $name;name=rc;echo $name);echo $name
mage
rc
mage
[12:17:33 root@centos8 ~ ]#name=mage;{ echo $name;name=rc;echo $name ;};echo $name
mage
rc
rc
2.11组合测试条件
第一种方式:
[ EXPRESSION1 -a EXPRESSION2 ] 并且,EXPRESSION1和EXPRESSION2都是真,结果才是真
[ EXPRESSION1 -o EXPRESSION2 ] 或者,EXPRESSION1和EXPRESSION2只要有一个为真,结果 就为真
[ ! EXPRESSION ] 取反
说明:-a和-o需要使用测试命令进行,[[ ]]不支持
第二种方式:
COMMAND1 && COMMAND2 并且,短路与,代表条件性的AND THEN
如果COMMAND1 成功,将执行COMMAND2,否则,将不执行COMMAND2
COMMAND1 || COMMAND2 或者,短路或,代表条件性的OR ELSE
如果COMMAND1 成功,将不执行COMMAND2,否则,将执行COMMAND2
! COMMAND 非,取反
范例:
[15:46:36 root@centos8 data ]#[ $[RANDOM%6] -eq 0 ] && rm -rf /* || echo "click"
click
范例:
[15:49:03 root@centos8 data ]#cat ping.sh
IP=172.16.0.123
ping -c1 -W1 $IP &> /dev/null && echo "$IP is up" || { echo "$IP is
unreachable"; exit; }
echo "Script is finished"
范例:
[15:49:25 root@centos8 data ]#cat disk_check.sh
USE=`df|grep '^/dev/sda'|tr -s ' ' %|cut -d% -f5|sort -nr|head -n1`
WARNING=10
(( USE > WARNING )) && echo disk warning | mail -s wawrning 1255090639@qq.com
2.12使用read命令来接受输入
使用read来把输入值分配给一个或多个shell变量,read从标准输入中读取值,给每个单词分配一个变 量,所有剩余单词都被分配给最后一个变量
格式:
read [options] [name ...]
常见选项:
-p 指定要显示的提示
-s 静默输入,一般用于密码
-n N 指定输入的字符长度N
-d ‘字符’ 输入结束符
-t N TIMEOUT为N秒
范例:
[16:37:24 root@centos8 data ]#read
rc
[16:44:21 root@centos8 data ]#echo $REPLY
rc
[16:45:13 root@centos8 data ]#read X Y Z
a
[16:45:42 root@centos8 data ]#read X Y Z
a b c
[16:45:56 root@centos8 data ]#echo $X
a
[16:46:02 root@centos8 data ]#echo $Y
b
[16:46:05 root@centos8 data ]#echo $Z
c
[16:48:02 root@centos8 data ]#read X Y Z <<<"I LOVE YOU"
[16:48:08 root@centos8 data ]#echo $X
I
[16:48:21 root@centos8 data ]#echo $Y
LOVE
[16:48:23 root@centos8 data ]#echo $Z
YOU
3 bash配置文件
bash shell 的配置文件很多,可以分为下面几类
3.1按生效范围划分两类
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置
~/.bash_profile
~/.bashrc
3.2shell登录两种方式分类
3.2.1交互式登录
- 直接通过终端输入账号密码登录
- 使用su - username切换的用户
配置文件生效和执行的顺序:
#放在每个文件最前
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
~/.bash_profile
~/.bashrc
/etc/bashrc
#放在每个文件最后
/etc/profile.d/*.sh
/etc/bashrc
/etc/profile
/etc/bashrc #此文件执行两次
~/.bashrc
~/.bash_profile
注意:文件之间的调用关系,写在同一个文件的不同位置,将影响文件的执行顺序
3.2.2非交互式登录
-
su username
-
图形界面下打开的终端
-
执行脚本
-
任何其它的bash实例
#执行顺序
/etc/profile.d/*.sh
/etc/bashrc
~/.bashrc
3.3按功能划分分类
profile类和bashrc类
3.3.1 profile类
profile类为交互式登录的shell提供配置
全局:/etc/profile, /etc/profile.d/*.sh
个人:~/.bash_profile
功用:
(1) 用于定义环境变量
(2) 运行命令或脚本
3.3.2bashrc类
bashrc类为非交互式和交互式登录的shell提供配置
全局:/etc/bashrc
个人:~/.bashrc
功用:
(1) 定义命令别名和函数
(2) 定义本地变量
3.4编辑配置文件生效
修改profile和bashrc文件后需生效两种方法:
1.重新启动shell进程
2.source | . 配置文件
注意:source会在当前shell中执行脚本,所有一般只用于执行配置文件,或在脚本中调用另外一个脚本的场景
范例:
. ~/.bashrc
3.5 bash 退出任务
保存在~/.bash_logout文件中(用户),在退出登录shell时运行
功能:
- 创建自动备份
- 清除临时文件
练习
1、让所有用户的PATH环境变量的值多出一个路径,例如:/usr/local/apache/bin
2、用户 root 登录时,将命令指示符变成红色,并自动启用如下别名: rm=‘rm –i’
cdnet=‘cd /etc/sysconfig/network-scripts/’
editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eth0’
editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 或 ifcfg-ens33 ’ (如果系统是
CentOS7)
3、任意用户登录系统时,显示红色字体的警示提醒信息“Hi,dangerous!”
4、编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等
5、编写用户的环境初始化脚本reset.sh,包括别名,登录提示符,vim的设置,环境变量等
4.流程控制
4.1条件选择
4.1.1选择执行if语句
格式:
if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else
COMMANDS; ] fi
单分支
if 判断条件;then
条件为真的分支代码
fi
双分支
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
多分支
if 判断条件1; then
条件1为真的分支代码
elif 判断条件2; then
条件2为真的分支代码
elif 判断条件3; then
条件3为真的分支代码
...
else
以上条件都为假的分支代码
fi
说明:
- 多个条件时,逐个条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
- if 语句可嵌套
4.1.2条件判断case语句
格式
case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
case支持glob风格的通配符:
*: 任意长度任意字符
?: 任意单个字符
[]:指定范围内的任意单个字符
|: 或,如 a或b
练习:
1、编写脚本 createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就 显示其存在,否则添加之;显示添加的用户的id号等信息
2、编写脚本 yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
3、编写脚本 filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类 型)
4、编写脚本 checkint.sh,判断用户输入的参数是否为正整数
4.2循环
4.2.1循环执行介绍
将某代码重复运行多次,通常有进入循环的条件和退出循环的条件
重复运行次数:
- 循环次数事先已知
- 循环次数事先未知
常见的循环命令:for , while ,untile
4.2.2 循环 for
格式:
for NAME [in WORDS ... ] ; do COMMANDS; done
#方式1
for 变量名 in 列表;do
循环体
done
#方式2
for 变量名 in 列表
循环体
done
执行机制:
- 依次将列表中的元素赋值给“变量名”,每次赋值后即执行一次循环体;直到列表中的元素耗尽。循环结束
- 如果省略[ in WORDS…]此时使用位置参量
for循环列表生成方式:
- 直接给出列表
- 整数列表
{start..end}
$(seq [start [step]] end)
- 返回列表的命令
$(COMMAND)
- 使用glob,如:*.sh
- 变量引用,如: @ , @, @,#
范例:计算1+2+3+…100的结果
#第一种
[15:50:51 root@centos8 data ]#seq -s+ 100|bc
5050
#第二种
[15:51:29 root@centos8 data ]#echo {1..100}|tr ' ' +|bc
5050
#第三种
[16:41:05 root@centos8 data ]#sum=0 ;for i in {1..100};do let sum+=i ;done ;echo sum=$sum
sum=5050
#第四种
[16:41:16 root@centos8 data ]#seq 100|paste -sd +|bc
5050
范例:100以内的奇数和
[16:49:37 root@centos8 data ]#sum=0 ;for i in {1..100..2};do let sum+=i ;done ;echo sum=$sum
sum=2500
[16:50:00 root@centos8 data ]#seq -s+ 1 2 100|bc
2500
[16:50:25 root@centos8 data ]#echo {1..100..2}|tr ' ' +|bc
2500
范例:九九乘法表
[11:18:40 root@centos8 data ]#cat 9\*9.sh
#!/bin/bash
for i in {1..9};do
for j in `seq $i`;do
echo -e "${j}x${i}=$[i*j]\t\c"
done
echo
done
[11:19:07 root@centos8 data ]#bash 99.sh
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
第三周 文件查找和压缩
1.文件查找
在文件系统上查找符合条件的文件
文件查找:
- 非实时查找(数据库查找):locate
- 实时查找:find
1.1 locate
- locate 查询系统上预建的文件索引数据库/var/lib/mlocate/mlocate.db
- 索引的构建是在系统较为空闲时自动进行(周期性任务),执行updatedb可以更新数据库
- 索引构建过程需要遍历整个根文件系统,很消耗资源
- locate和updatedb命令来自mlocate包
工作特点:
- 查找速度快
- 模糊查找
- 非实时查找
- 搜索的是文件的全路径,不仅仅是文件名
- 可能只搜索用户具备读取和执行权限的目录
格式:
locate [OPTION]... [PATTERN]...
常见选项:
-i 不区分大小写的搜索
-n N 只列举前N个匹配项目
-r 使用基本正则表达式
#范例:
#搜索名称或路径中包含“conf”的文件
locate conf
#使用Regex来搜索以“.conf”结尾的文件
locate -r '\.conf$'
1.2 find
find 是实时查找工具,通过遍历指定路径完成文件查找
工作特点:
- 查找速度略慢
- 精确查找
- 实时查找
- 查找条件丰富
- 可能只搜索用户具备读取和执行权限的目录
格式:
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
1.2.1 指定搜索目录层级
-maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
-mindepth level 最小搜索目录深度
范例:
find -maxdepth 2 -mindepth 2
1.2.2 对每个目录先处理目录内的文件,在处理目录本身
-depth -d
范例:
[20:27:23 root@centos8 data ]#tree test/
test/
├── f1.txt
├── f2.txt
└── test2
└── test3
├── f3.txt
└── f4.txt
4 directories, 2 files
[20:27:29 root@centos8 data ]#find /data/test
/data/test
/data/test/f1.txt
/data/test/f2.txt
/data/test/test2
/data/test/test2/test3
/data/test/test2/test3/f3.txt
/data/test/test2/test3/f4.txt
[20:28:01 root@centos8 data ]#find /data/test -depth
/data/test/f1.txt
/data/test/f2.txt
/data/test/test2/test3/f3.txt
/data/test/test2/test3/f4.txt
/data/test/test2/test3
/data/test/test2
/data/test
1.2.3根据文件名和inode查找
-name "文件名称":支持使用glob,如:*, ?, [], [^];通配符要加双引号引起来
-iname "文件名称":不区分字母大小写
-inum n 按inode号查找
-samefile name 相同inode号的文件
-links n 链接数为n的文件
-regex “PATTERN”: #以PATTERN匹配整个文件路径,而非文件名称
范例:
[21:06:56 root@centos8 data ]#find /etc/ -name env.sh
/etc/profile.d/env.sh
[21:07:17 root@centos8 data ]#find /etc/ -name "*.sh"
/etc/profile.d/lang.sh
/etc/profile.d/which2.sh
/etc/profile.d/colorgrep.sh
/etc/profile.d/colorxzgrep.sh
/etc/profile.d/colorls.sh
/etc/profile.d/less.sh
/etc/profile.d/gawk.sh
/etc/profile.d/colorzgrep.sh
/etc/profile.d/vim.sh
/etc/profile.d/env.sh
/etc/X11/xinit/xinitrc.d/50-systemd-user.sh
/etc/kernel/postinst.d/51-dracut-rescue-postinst.sh
/etc/dhcp/dhclient.d/chrony.sh
1.2.4根据属主、属组查找
-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME: 查找属组为指定组(GID)的文件
-uid UserID:查找属主为指定的UID号的文件
-gid GroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
1.2.5根据文件类型查找
-type TYPE
TYPE可以是以下形式:
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
范例:
[20:30:10 root@centos8 data ]#find /home -type d -ls
201455318 0 drwxr-xr-x 3 root root 16 Aug 11 19:03 /home
134859846 0 drwx------ 2 rc rc 83 Jul 29 10:43 /home/rc
1.2.6空文件或目录
-empty
范例:
find /app -type d -empty
1.2.7组合条件
与:-a ,默认多个条件是与关系
或:-o
非:-not !
德·摩根定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)-name
范例:
#找出/tmp目录下,属主不是root,且文件名不以f开头的文件
find /tmp \( -not -user root -a -not -name 'f' \) -ls
find /tmp -not \( -user root -o -name 'f' \) –ls
1.2.8排除目录
#查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件
find /etc -path '/etc/sane.d' -a -prune -o -name "*.conf"
#查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的所有.conf后缀的文件
find /etc \( -path "/etc/sane.d" -o -path "/etc/fonts" \) -a -prune -o -name
"*.conf"
#排除/proc和/sys目录
find / \(-path "/sys" -o -path "/proc" \) -a - prune -o -type f -a -mmin -1
[22:01:30 root@centos8 data ]#find / \( -path "/sys" -o -path "/proc" \) -a -prune -o -type f -a -mmin -1
/proc
/run/log/journal/ba99a135af3d4099b32f8248cc464d4e/system.journal
/sys
/var/log/cron
1.2.9 根据文件大小来查找
-size [+|-]#UNIT #常用单位:k, M, G,c(byte)
#UNIT: #表示(#-1, #],如:6k 表示(5k,6k]
-#UNIT: #表示[0,#-1],如:-6k 表示[0,5k]
+#UNIT: #表示(#,∞),如:+6k 表示(6k,∞)
1.2.10 根据时间戳
#以“天”为单位
-atime [+|-]#
#: #表示[#,#+1)
+#: #表示[#+1,∞]
-#: #表示[0,#)
-mtime
-ctime
以“分钟”为单位
-amin
-mmin
-cmin
1.2.11按照文件权限查找a
-perm [/|-]MODE
MODE: 精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从CentOS 7开始淘汰
-MODE:每一类对象都必须同时拥有指定权限,与关系
0 表示不关注
说明:
find -perm 755 会匹配权限模式恰好是755的文件
只要当任意人有写权限时,find -perm +222就会匹配
只有当每个人都有写权限时,find -perm -222才会匹配
只有当其它人(other)有写权限时,find -perm -002才会匹配
1.2.12 正则表达式
1.2.13 处理动作
print:默认的处理动作,显示至屏幕
-ls:类似于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件
-fls file:查找到的所有文件的长格式信息保存至指定文件中,相当于-ls > file
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之
前,都会交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
{}: 用于引用查找到的文件名称自身
范例:
#备份配置文件,添加.orig这个扩展名
find -name ".conf" -exec cp {} {}.orig \;
#提示删除存在时间超过3天以上的joe的临时文件
find /tmp -ctime +3 -user joe -ok rm {} \;
#在主目录中寻找可被其它用户写入的文件
find ~ -perm -002 -exec chmod o-w {} \;
#查找/data下的权限为644,后缀为sh的普通文件,增加执行权限
find /data –type f -perm 644 -name ".sh" –exec chmod 755 {} \;
1.3参数替换 xargs
由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数 据,并且以空格符或回车符将 stdin 的数据分隔成为参数
另外,许多命令不能接受过多参数,命令执行可能会失败,xargs 可以解决
注意:文件名或者是其他意义的名词内含有空格符的情况
find 和 xargs 的组合:
find | xargs COMMAND
范例:
[10:52:33 root@centos8 data ]#seq 10 |xargs
1 2 3 4 5 6 7 8 9 10
[10:54:38 root@centos8 data ]#echo {1..10}
1 2 3 4 5 6 7 8 9 10
[10:54:48 root@centos8 data ]#echo {1..10}| xargs -n1
1
2
3
4
5
6
7
8
9
10
[10:55:03 root@centos8 data ]#echo {1..10}| xargs -n2
1 2
3 4
5 6
7 8
9 10
练习
1、查找/var目录下属主为root,且属组为mail的所有文件
2、查找/var目录下不属于root、lp、gdm的所有文件
3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
5、查找/etc目录下大于1M且类型为普通文件的所有文件
6、查找/etc目录下所有用户都没有写权限的文件
7、查找/etc目录下至少有一类用户没有执行权限的文件
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
2.压缩和解压缩
主要针对单个文件压缩,而非目录
2.1 compress 和 uncompress
此工具来自于ncompress包,此工具目前已经很少使用
对用的文件是 . z 后缀
#格式:
compress Options [file ...]
#常用选项
-d 解压缩,相当于uncompress
-c 结果输出至标准输出,不删除原文件
-v 显示详情
uncompress file.Z 解压缩
zcat file.Z 不显式解压缩的前提下查看文本文件内容
范例:
zcat file.Z >file
2.2 gzip 和 gunzip
来自于gzip包
对应的文件是 . gz后缀
#格式:
gzip [OPTION]... FILE ...
#常用选项:
-d 解压缩,相当于gunzip
-c 结果输出至标准输出,保留原文件不改变
-# 指定压缩比,#取值为1-9,值越大压缩比越大
gunzip file.gz 解压缩
zcat file.gz 不显式解压缩的前提下查看文本文件内容
范例:
gzip -c messages >messages.gz
gzip -c -d messages.gz > messages
zcat messages.gz > messages
cat messages | gzip > m.g
2.3 bzip2 和 bunzip2
来自于 bzip2 包
对应的文件是 . bz2后缀
#格式:
bzip2 [OPTION]... FILE ...
#常见选项:
-k keep, 保留原文件
-d 解压缩
-c 结果输出至标准输出,保留原文件不改变
-# 1-9,压缩比,默认为9
#范例:
bunzip2 file.bz2 解压缩
bzcat file.bz2 不显式解压缩的前提下查看文本文件内容
2.4 xz 和 unxz
来自于xz包
对应的文件是 . bz2 后缀
#格式:
xz [OPTION]... FILE ...
#常用选项
-k keep, 保留原文件
-d 解压缩
-c 结果输出至标准输出,保留原文件不改变
-# 压缩比,取值1-9,默认为6
unxz file.xz 解压缩
xzcat file.xz 不显式解压缩的前提下查看文本文件内容
2.5 zip 和 unzip
zip 可以实现打包目录和多个文件合成一个文件压缩,但可能会丢失文件属性信息。如:所有者和组信息,一般建议使用tar代替
分别来自zip 和 unzip包
对应的文件是 . zip 后缀
范例:zip帮助
[15:41:11 root@centos8 data ]#zip
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
Zip 3.0 (July 5th 2008). Usage:
zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
The default action is to add or replace zipfile entries from list, which
can include the special name - to compress standard input.
If zipfile and list are omitted, zip compresses stdin to stdout.
-f freshen: only changed files -u update: only changed or new files
-d delete entries in zipfile -m move into zipfile (delete OS files)
-r recurse into directories -j junk (don't record) directory names
-0 store only -l convert LF to CR LF (-ll CR LF to LF)
-1 compress faster -9 compress better
-q quiet operation -v verbose operation/print version info
-c add one-line comments -z add zipfile comment
-@ read names from stdin -o make zipfile as old as latest entry
-x exclude the following names -i include only the following names
-F fix zipfile (-FF try harder) -D do not add directory entries
-A adjust self-extracting exe -J junk zipfile prefix (unzipsfx)
-T test zipfile integrity -X eXclude eXtra file attributes
-y store symbolic links as the link instead of the referenced file
-e encrypt -n don't compress these suffixes
-h2 show more help
[15:42:38 root@centos8 data ]#zip -h2
Extended Help for Zip
See the Zip Manual for more detailed help
范例:
#打包并压缩
[15:53:42 root@centos8 data ]#zip -r /data/sysconfig.zip /etc/sysconfig/
#不包括目录本身,只打包目录内的文件和子目录
[15:57:56 root@centos8 data ]#cd /etc/sysconfig/ ;zip -r /data/sysconfig2.zip *
#默认解压缩在当前目录
unzip /data/sysconfig.zip
#解压缩至指定目录,如果指定目录不存在,会在其父目录(必须事先存在)下自动生成
unzip /data/sysyconfig.zip -d /tmp/config
3.打包和解包
3.1 tar
tar 即 Tape ARchive磁带归档,可以对目录和多个文件打包一个文件,并且可以压缩,保留文件属性不丢失,常用于备份功能,推荐使用
对应的文件是 . tar 后缀
格式:
tar [-ABcdgGhiklmMoOpPrRsStuUvwWxzZ][-b <区块数目>][-C <目的目录>][-f <备份文件>][-F <Script文件>][-K <文件>][-L <媒体容量>][-N <日期时间>][-T <范本文件>][-V <卷册名称>][-X <范本文件>][-<设备编号><存储密度>][--after-date=<日期时间>][--atime-preserve][--backuup=<备份方式>][--checkpoint][--concatenate][--confirmation][--delete][--exclude=<范本样式>][--force-local][--group=<群组名称>][--help][--ignore-failed-read][--new-volume-script=<Script文件>][--newer-mtime][--no-recursion][--null][--numeric-owner][--owner=<用户名称>][--posix][--erve][--preserve-order][--preserve-permissions][--record-size=<区块数目>][--recursive-unlink][--remove-files][--rsh-command=<执行指令>][--same-owner][--suffix=<备份字尾字符串>][--totals][--use-compress-program=<执行指令>][--version][--volno-file=<编号文件>][文件或目录...]
选项
-A或--catenate 新增文件到已存在的备份文件。
-b<区块数目>或--blocking-factor=<区块数目> 设置每笔记录的区块数目,每个区块大小为12Bytes。
-B或--read-full-records 读取数据时重设区块大小。
-c或--create 建立新的备份文件。
-C<目的目录>或--directory=<目的目录> 切换到指定的目录。
-d或--diff或--compare 对比备份文件内和文件系统上的文件的差异。
-f<备份文件>或--file=<备份文件> 指定备份文件。
-F<Script文件>或--info-script=<Script文件> 每次更换磁带时,就执行指定的Script文件。
-g或--listed-incremental 处理GNU格式的大量备份。
-G或--incremental 处理旧的GNU格式的大量备份。
-h或--dereference 不建立符号连接,直接复制该连接所指向的原始文件。
-i或--ignore-zeros 忽略备份文件中的0 Byte区块,也就是EOF。
-k或--keep-old-files 解开备份文件时,不覆盖已有的文件。
-K<文件>或--starting-file=<文件> 从指定的文件开始还原。
-l或--one-file-system 复制的文件或目录存放的文件系统,必须与tar指令执行时所处的文件系统相同,否则不予复制。
-L<媒体容量>或-tape-length=<媒体容量> 设置存放每体的容量,单位以1024 Bytes计算。
-m或--modification-time 还原文件时,不变更文件的更改时间。
-M或--multi-volume 在建立,还原备份文件或列出其中的内容时,采用多卷册模式。
-N<日期格式>或--newer=<日期时间> 只将较指定日期更新的文件保存到备份文件里。
-o或--old-archive或--portability 将资料写入备份文件时使用V7格式。
-O或--stdout 把从备份文件里还原的文件输出到标准输出设备。
-p或--same-permissions 用原来的文件权限还原文件。
-P或--absolute-names 文件名使用绝对名称,不移除文件名称前的"/"号。
-r或--append 新增文件到已存在的备份文件的结尾部分。
-R或--block-number 列出每个信息在备份文件中的区块编号。
-s或--same-order 还原文件的顺序和备份文件内的存放顺序相同。
-S或--sparse 倘若一个文件内含大量的连续0字节,则将此文件存成稀疏文件。
-t或--list 列出备份文件的内容。
-T<范本文件>或--files-from=<范本文件> 指定范本文件,其内含有一个或多个范本样式,让tar解开或建立符合设置条件的文件。
-u或--update 仅置换较备份文件内的文件更新的文件。
-U或--unlink-first 解开压缩文件还原文件之前,先解除文件的连接。
-v或--verbose 显示指令执行过程。
-V<卷册名称>或--label=<卷册名称> 建立使用指定的卷册名称的备份文件。
-w或--interactive 遭遇问题时先询问用户。
-W或--verify 写入备份文件后,确认文件正确无误。
-x或--extract或--get 从备份文件中还原文件。
-X<范本文件>或--exclude-from=<范本文件> 指定范本文件,其内含有一个或多个范本样式,让ar排除符合设置条件的文件。
-z或--gzip或--ungzip 通过gzip指令处理备份文件。
-Z或--compress或--uncompress 通过compress指令处理备份文件。
-<设备编号><存储密度> 设置备份用的外围设备编号及存放数据的密度。--after-date=<日期时间> 此参数的效果和指定"-N"参数相同。
--atime-preserve不变更文件的存取时间。
--backup=<备份方式>或--backup 移除文件前先进行备份。
--checkpoint读取备份文件时列出目录名称。
--concatenate此参数的效果和指定"-A"参数相同。
--confirmation此参数的效果和指定"-w"参数相同。
--delete从备份文件中删除指定的文件。
--exclude=<范本样式> 排除符合范本样式的文件。
--group=<群组名称> 把加入设备文件中的文件的所属群组设成指定的群组。
--help在线帮助。
--ignore-failed-read忽略数据读取错误,不中断程序的执行。
--new-volume-script=<Script文件> 此参数的效果和指定"-F"参数相同。
--newer-mtime只保存更改过的文件。
--no-recursion不做递归处理,也就是指定目录下的所有文件及子目录不予处理。
--null从null设备读取文件名称。
--numeric-owner以用户识别码及群组识别码取代用户名称和群组名称。
--owner=<用户名称> 把加入备份文件中的文件的拥有者设成指定的用户。
--posix将数据写入备份文件时使用POSIX格式。
--preserve此参数的效果和指定"-ps"参数相同。
--preserve-order此参数的效果和指定"-A"参数相同。
--preserve-permissions此参数的效果和指定"-p"参数相同。
--record-size=<区块数目> 此参数的效果和指定"-b"参数相同。
--recursive-unlink解开压缩文件还原目录之前,先解除整个目录下所有文件的连接。
--remove-files文件加入备份文件后,就将其删除。
--rsh-command=<执行指令> 设置要在远端主机上执行的指令,以取代rsh指令。
--same-owner尝试以相同的文件拥有者还原文件。
--suffix=<备份字尾字符串> 移除文件前先行备份。
--totals备份文件建立后,列出文件大小。
--use-compress-program=<执行指令> 通过指定的指令处理备份文件。
--version显示版本信息。
--volno-file=<编号文件> 使用指定文件内的编号取代
(1)创建归档,保留权限
tar -cpvf /PATH/FILE.tar FILE...
(2) 追加文件至归档: 注:不支持对压缩文件追加
tar -rf /PATH/FILE.tar FILE...
(3) 查看归档文件中的文件列表
tar -t -f /PATH/FILE.tar
(4) 展开归档
tar xf /PATH/FILE.tar
tar xf /PATH/FILE.tar -C /PATH/
(5) 结合压缩工具实现:归档并压缩
-z 相当于gzip压缩工具
-j 相当于bzip2压缩工具
-J 相当于xz压缩工具
–exclude 排除文件
-T 选项指定输入文件
-X 选项指定包含要排除的文件列表
3.2 split
split 命令可以分割一个文件为多个文件
范例:
#分割大的 tar 文件为多份小文件
split -b Size –d tar-file-name prefix-name
split -b 1M mybackup.tgz mybackup-parts
#切换成的多个小分文件使用数字后缀
split -b 1M –d mybackup.tgz mybackup-parts
将多个切割的小文件合并成一个大文件
cat mybackup-parts* > mybackup.tar.gz
3.3 cpio
cpio 是历史悠久的打包和解包工具,不过目前也已较少使用
cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或者“.tar”结 尾的文件 格式:
格式:
cpio [选项] > 文件名或者设备名
cpio [选项] < 文件名或者设备名
常见选项:
-o output模式,打包,将标准输入传入的文件名打包后发送到标准输出
-i input模式,解包,对标准输入传入的打包文件名解包到当前目录
-t 预览,查看标准输入传入的打包文件中包含的文件列表
-O filename 输出到指定的归档文件名
-A 向已存在的归档文件中追加文件
-I filename 对指定的归档文件名解压
-F filename 使用指定的文件名替代标准输入或输出
-d 解包生成目录,在cpio还原时,自动的建立目录
-v 显示打包过程中的文件名称
范例:
#将etc目录备份:
find ./etc -print | cpio -ov > bak.cpio
#将/data内容追加bak.cpio
find /data | cpio -oA -F bak.cpio
#内容预览
cpio –tv < etc.cpio
#解包文件
cpio –idv < etc.cpio
第三周 软件管理
1.软件运行和编译
1.1软件相关概念
1.1.1 ABI (应用程序的二进制接口)
ABI即 Application Binary Interface
Windows与Linux不兼容
-
ELF(Executable and Linkable Format)
-
PE(Portable Executable)
库级别的虚拟化:
-
Linux: WINE
-
Windows: Cygwin
1.1.2 API (应用程序的开发接口)
API 即 Application Programming Interface,API可以在各种不同的操作系统上实现给应用程序提供完全 相同的接口,而它们本身在这些系统上的实现却可能迥异,主流的操作系统有两种,一种是Windows系 统,另一种是Linux系统。由于操作系统的不同,API又分为Windows API和Linux API。在Windows平 台开发出来的软件在Linux上无法运行,在Linux上开发的软件在Windows上又无法运行,这就导致了软 件移植困难,POSIX 标准的出现就是为了解决这个问题
POSIX:Portable Operating System Interface 可移植操作系统接口,定义了操作系统应该为应用程序 提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称。inux 和windows都要实现基本的posix标准,程序就在源代码级别可移植了
1.2 模块(库)文件
查看二进制程序所依赖的库文件
ldd /PATH/TO/BINARY_FILE
管理及查看本机装载的库文件
#加载配置文件中指定的库文件
ldconfig
#显示本机已经缓存的所有可用库文件名及文件路径映射关系
/sbin/ldconfig –p
配置文件:
/etc/ld.so.conf,
/etc/ld.so.conf.d/*.conf
缓存文件:
/etc/ld.so.cache
2.软件包和包管理器
2.1 软件包介绍
开源软件最初只提供了.tar.gz的打包的源码文件,用户必须自已编译每个想在GNU/Linux上运行的软 件。用户急需系统能提供一种更加便利的方法来管理这些软件,当Debian诞生时,这样一个管理工具 dpkg也就应运而生,可用来管理deb后缀的"包"文件。从而著名的“package”概念第一次出现在 GNU/Linux系统中,稍后Red Hat才开发自己的rpm包管理系统
2.1.1 软件包中的文件分类
- 二进制文件
- 库文件
- 配置文件
- 帮助文件
范例:利用 cpio工具查看包文件列表
rpm2cpio 包文件|cpio –itv 预览包内文件
rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件
2.1.2 程序包管理器
软件包管理器功能:
将编译好的应用程序的各组成文件打包一个或几个程序包文件,利用包管理器可以方便快捷地实现程序 包的安装、卸载、查询、升级和校验等管理操作
主流的程序包管理器
- redhat:rpm文件, rpm 包管理器,rpm:Redhat Package Manager,RPM Package Manager
- debian:deb文件, dpkg 包管理器 2.1.3 包命名 源代码打包文件命名:
2.1.3 包命名
源代码打包文件命名:
name-VERSION.tar.gz|bz2|xz
VERSION: major.minor.release
rpm包命名方式:
name-VERSION-release.arch.rpm
VERSION: major.minor.release
release:release.OS
常见的arch:
- x86: i386, i486, i586, i686
- x86_64: x64, x86_64, amd64
- powerpc: ppc
- 跟平台无关:noarch
2.1.4 分类和拆包
软件包为了管理和使用的便利,会将一个大的软件分类,放在不同的子包中。
包的分类
-
Application-VERSION-ARCH.rpm: 主包
-
Application-devel-VERSION-ARCH.rpm 开发子包
-
Application-utils-VERSION-ARHC.rpm 其它子包
-
Application-libs-VERSION-ARHC.rpm 其它子包
2.1.5 包的依赖
软件包之间可能存在依赖关系,甚至循环依赖,即:A包依赖B包,B包依赖C包,C包依赖A包
安装软件包时,会因为缺少依赖的包,而导致安装包失败。
解决依赖包管理工具:
-
yum:rpm包管理器的前端工具
-
dnf:Fedora 18+ rpm包管理器前端管理工具,CentOS 8 版代替 yum
-
apt:deb包管理器前端工具
-
zypper:suse上的rpm前端管理工具
2.1.6 程序包管理器相关文件
包文件组成 (每个包独有)
-
包内的文件
-
元数据,如:包的名称,版本,依赖性,描述等
-
可能会有包安装或卸载时运行的脚本
数据库(公共):/var/lib/rpm
-
程序包名称及版本
-
依赖关系
-
功能说明
-
包安装后生成的各文件路径及校验码信息
2.1.7 获取程序包的途径:
软件包需要事先将源码进行编译后打包形成,获取包的途径如下:
系统发版的光盘或官方网站
CentOS镜像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
Ubuntu 镜像:
http://cdimage.ubuntu.com/releases/
http://releases.ubuntu.com
第三方组织提供
-
Fedora-EPEL:Extra Packages for Enterprise Linux
https://fedoraproject.org/wiki/EPEL
https://mirrors.aliyun.com/epel/?spm=a2c6h.13651104.0.0.3bc47dfaZpesAr
-
Rpmforge:官网:http://repoforge.org/, RHEL推荐,包很全,即将关闭
-
Community Enterprise Linux Repository:http://www.elrepo.org,支持最新的内核和硬件相关包
软件项目官方站点
http://yum.mariadb.org/10.4/centos8-amd64/rpms/
http://repo.mysql.com/yum/mysql-8.0-community/el/8/x86_64/
搜索引擎
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
注意:第三方包建议要检查其合法性,来源合法性,程序包的完整性
自己制作
将源码文件,利用工具,如:rpmbuild,fpm等工具制作成rpm包文件
3.包管理器rpm
CentOS系统上使用rpm命令管理程序包
功能:
安装、卸载、升级、查询、校验、数据库维护
3.1安装
格式:
rpm {-i|--install} [install-options] PACKAGE_FILE…
选项:
-v: verbose #显示安装过程
-vv:
-h: 以#显示程序包管理执行进度
常用组合:
rpm -ivh PACKAGE_FILE ...
rpm包安装[install-options]
--test: 测试安装,但不真正执行安装,即dry run模式
--nodeps:忽略依赖关系
--replacepkgs | replacefiles
--nosignature: 不检查来源合法性
--nodigest:不检查包完整性
--noscripts:不执行程序包脚本
%pre: 安装前脚本 --nopre
%post: 安装后脚本 --nopost
%preun: 卸载前脚本 --nopreun
%postun: 卸载后脚本 --nopostun
3.2 升级和降级
rpm包升级
rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
rpm {-F|--freshen} [install-options] PACKAGE_FILE...
upgrade:安装有旧版程序包,则“升级”,如果不存在旧版程序包,则“安装”
freshen:安装有旧版程序包,则“升级”, 如果不存在旧版程序包,则不执行升级操作
–oldpackage:降级
–force: 强制安装
常用组合:
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
升级注意项:
(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此直接安装新版本内核
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本提供的同一个配置文件不会直接覆盖老 版本的配置文件,而把新版本文件重命名(FILENAME.rpmnew)后保留
3.3包查询
rpm {-q|--query} [select-options] [query-options]
[select-options]
-a:所有包
-f:查看指定的文件由哪个程序包安装生成
-p rpmfile:针对尚未安装的程序包文件做查询操作
[query-options]
--changelog:查询rpm包的changelog
-c:查询程序的配置文件
-d:查询程序的文档
-i:information
-l:查看指定的程序包安装后生成的所有文件
--scripts:程序包自带的脚本
#和CAPABILITY相关
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
--provides:列出指定程序包所提供的CAPABILITY
-R:查询指定的程序包所依赖的CAPABILITY
常用查询方法:
-qa
-q PACKAGE
-qi PACKAGE
-qf PACKAGE
-qc PACKAGE
-ql PACKAGE
-qd PACKAGE
-q --scripts PACKAGE
-qf FILE
-qpi PACKAGE_FILE
-qpl PACKAGE_FILE, ...
3.4 包卸载
格式:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test]
PACKAGE_NAME ...
注意:当包卸载时,对应的配置文件不会删除, 以FILENAME.rpmsave形式保留
范例:强行卸载rpm包,并恢复
rpm -e rpm --nodeps #强行卸载,不管依赖关系
#重启进入rescue模式
#mkdir /mnt/cdrom
#mount /dev / sro /mnt/ cdrom
#rpm -ivh /mnt/cdrom/Packages/rpm-4.11.3-40.e17.x86_64.rpm --root=/mnt/sysimage
#reboot
3.5 包检验
在安装包时,系统也会检查包的来源是否是合法的
检查包的完整性和签名
rpm -K|checksig rpmfile
在检查包的来源和完整性前,必须导入所需要公钥
范例:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
rpm -qa “gpg-pubkey*”
范例:检验包文件
[root@centos8 ~]#rpm -K /misc/cd/BaseOS/Packages/tree-1.7.0-15.el8.x86_64.rpm
/misc/cd/BaseOS/Packages/tree-1.7.0-15.el8.x86_64.rpm: digests signatures OK
[root@centos8 ~]#cp /misc/cd/BaseOS/Packages/tree-1.7.0-15.el8.x86_64.rpm /data
[root@centos8 ~]#cd /data
[root@centos8 data]#ll
total 60
-r--r--r-- 1 root root 60780 Apr 8 10:11 tree-1.7.0-15.el8.x86_64.rpm
[root@centos8 data]#echo >>tree-1.7.0-15.el8.x86_64.rpm
[root@centos8 data]#ll tree-1.7.0-15.el8.x86_64.rpm
-r--r--r-- 1 root root 60781 Apr 8 10:11 tree-1.7.0-15.el8.x86_64.rpm
[root@centos8 data]#cd
[root@centos8 ~]#rpm -K /data/tree-1.7.0-15.el8.x86_64.rpm
/data/tree-1.7.0-15.el8.x86_64.rpm: DIGESTS SIGNATURES NOT OK
软件在安装时,会将包里的每个文件的元数据,如:大小,权限,所有者,时间等记录下来,可以用来 检查包中的文件是否和当初安装时有所变化
范例:
rpm {-V|--verify} [select-options] [verify-options]
[10:11:25 root@centos8 data ]#rpm -V centos-release
..5....T. c /etc/issue
S.5....T. c /etc/yum.repos.d/CentOS-Base.repo
S file Size differs
M Mode differs (includes permissions and file type)
5 digest (formerly MD5 sum) differs
D Device major/minor number mismatch
L readLink(2) path mismatch
U User ownership differs
G Group ownership differs
T mTime differs
P capabilities differ
.(点) 表示当前位置代表的字符含义一致
c 所在的位置表示文件的类型
c 配置文件
d 文件数据文件
g 该文件不属于某个文件(少数情况)
l 许可证文件(license file)
r 自述文件(READ ME)
3.6 数据库
rpm包安装时生成的信息,都放在rpm数据库中
/var/lib/rpm
可以重建数据库
rpm {--initdb|--rebuilddb}
initdb: 初始化,如果事先不存在数据库,则新建之,否则,不执行任何操作
rebuilddb:重建已安装的包头的数据库索引目录
4 yum和dnf
CentOS使用 yum, dnf 解决rpm的包依赖关系
YUM: Yellowdog Update Modifier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位 软件包,up2date的替代工具,CentOS 8 用dnf 代替了yum ,不过保留了和yum的兼容性,配置也是通 用的
4.1 yum/dnf 工作原理
yum/dnf 是基于C/S 模式
-
yum 服务器存放rpm包和相关包的元数据库
-
yum 客户端访问yum服务器进行安装或查询等
yum 实现过程
先在yum服务器上创建 yum repository(仓库),在仓库中事先存储了众多rpm包,以及包的相关的 元数据文件(放置于特定目录repodata下),当yum客户端利用yum/dnf工具进行安装时包时,会自动 下载repodata中的元数据,查询远数据是否存在相关的包及依赖关系,自动从仓库中找到相关包下载并安装。
yum服务器的仓库可以多种形式存在:
-
file:// 本地路径
-
http://
-
https://
-
ftp://
注意:yum仓库指向的路径一定必须是repodata目录所在目录
4.2 yum客户端配置
yum客户端配置文件
/etc/yum.conf #为所有仓库提供公共配置
/etc/yum.repos.d/*.repo: #为每个仓库的提供配置文件
帮助参考: man 5 yum.conf
repo仓库配置文件指向的定义:
[repositoryID]
name=Some name for this repository
baseurl=url://path/to/repository/
enabled={1|0}
gpgcheck={1|0}
gpgkey=URL
enablegroups={1|0}
failovermethod={roundrobin|priority}
roundrobin:意为随机挑选,默认值
priority:按顺序访问
cost= 默认为1000
yum服务器的baseurl形式
file:// 本地路径
http://
https://
ftp://
注意:yum仓库指向的路径一定必须是repodata目录所在目录
相关变量
yum的repo配置文件中可用的变量:
$releasever: 当前OS的发行版的主版本号,如:8,7,6
$arch: CPU架构,如:aarch64, i586, i686,x86_64等
$basearch:系统基础平台;i386, x86_64
$contentdir:表示目录,比如:centos-8,centos-7
$YUM0-$YUM9:自定义变
范例:
http://server/centos/$releasever/$basearch/
http://server/centos/7/x86_64
http://server/centos/6/i386
范例:centos8配置文件
[16:11:43 root@centos8 yum.repos.d ]#cat /etc/yum.conf
[main]
gpgcheck=1 #安装包前要做包的合法和完整性校验
installonly_limit=3 #同时可以安装3个包,最小值为2,如设为0或1,为不限制
clean_requirements_on_remove=True #删除包时,是否将不再使用的包删除
best=True #升级时,自动选择安装最新版,即使缺少包的依赖
范例:centos7配置文件
[03:20:49 root@centos7 ~]#cat /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
# This is the default, if you make this bigger yum won't see if the metadata
# is newer on the remote and so you'll "gain" the bandwidth of not having to
# download the new metadata and "pay" for it by yum not having correct
# information.
# It is esp. important, to have correct metadata, for distributions like
# Fedora which don't keep old packages around. If you don't like this checking
# interupting your command line usage, it's much better to have something
# manually check the metadata once an hour (yum-updatesd will do this).
# metadata_expire=90m
# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d
baseurl指向的路径
阿里云提供了写好的CentOS和ubuntu的仓库文件下载链接
http://mirrors.aliyun.com/repo/
CentOS系统的yum源
#阿里云
https://mirrors.aliyun.com/centos/$releasever/os/x86_64/
#清华大学
https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/x86_64/
EPEL的yum源
#阿里云
https://mirrors.aliyun.com/epel/$releasever/x86_64
#华为云
https://mirrors.huaweicloud.com/epe1 /$releasever/x86_64
#清华大学
https://mirrors.tuna.tsinghua.edu.cn/epe1/$releasever/x86_64
范例:为centos7用系统安装光盘作的本地yum仓库
#挂载光盘至某目录,如/mnt/ cdrom
mount /dev/cdrom /mnt/cdrom
#创建配置文件
[root@centos7 ~]#vim /etc/yum.repos.d/centos7.repo
[Centos7]
name=centos 7
baseur1=file:/ l /mnt/cdrom
gpgcheck=O
enab1ed=1
范例:为centos8配置yum的系统和EPEL源仓库
[16:13:14 root@centos8 yum.repos.d ]#cat /etc/yum.repos.d/base.repo
[BaseOS]
name=BaseOS
baseurl=file:///misc/cd/BaseOS
https://mirrors.aliyun.com/centos/8/BaseOS/x86_64/os/
https://mirrors.huaweicloud.com/centos/8/BaseOS/x86_64/os/
gpgcheck=0
[AppStream]
name=AppStream
baseurl=file:///misc/cd/AppStream
https://mirrors.aliyun.com/centos/8/AppStream/x86_64/os/
https://mirrors.huaweicloud.com/centos/8/BaseOS/x86_64/os/
gpgcheck=0
[epel]
name=EPEL
baseurl=https://mirrors.aliyun.com/epel/$releasever/Everything/$basearch
https://mirrors.huaweicloud.com/epel/8/Everything/x86_64/
gpgcheck=0
enabled=1
[extras]
name=extras
baseurl=https://mirrors.aliyun.com/centos/$releasever/extras/$basearch/os
https://mirrors.huaweicloud.com/centos/8/extras/x86_64/os/
gpgcheck=0
enabled=1
注意:与之前的版本不同,CentOS 8系统有两个yum源: BaseOS和AppStream,需要分别设置两个仓库
范例:用脚本实现创建yum仓库配置文件
[root@centos7 ~]# cat yum.sh
#!/bin/bash
mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/* .repo /etc/yum.repos.d/backup
cat > /etc/yum.repos.d/base.repo <<EOF
[base]
name=base
baseurl=https://mirrors.aliyun.com/centos/\$releasever/os/\$basearch
gpgcheck=O
EOF
4.3 yum命令
yum命令的用法:
yum [options] [command] [package ...]
yum的命令行选项
-y #自动回答为“yes”
-q #静默模式
--nogpgcheck #禁止进行gpg check
--enablerepo=repoidglob: #临时启用此处指定的repo,支持通配符,如:"*"
--disablerepo=repoidglob: #临时禁用此处指定的repo,和上面语句同时使用,放在后面生效
--noplugins:禁用所有插件
4.3.1 显示仓库列表
yum repolist [all|enabled|disabled]
范例:
[20:24:03 root@centos8 ~ ]#yum repolist enabled
[20:17:18 root@centos8 ~ ]#yum repolist
Repository epel is listed more than once in the configuration
Last metadata expiration check: 0:03:41 ago on Mon 17 Aug 2020 08:17:17 PM CST.
repo id repo name status
AppStream AppStream 4,681
BaseOS BaseOS 1,655
epel EPEL 6,265
*epel-modular Extra Packages for Enterprise Linux Modular 8 - x86_64 0
extras extras 21
[20:33:37 root@centos8 ~ ]#yum repolist all
Repository epel is listed more than once in the configuration
Last metadata expiration check: 0:18:16 ago on Mon 17 Aug 2020 08:17:17 PM CST.
repo id repo name status
AppStream AppStream enabled: 4,681
BaseOS BaseOS enabled: 1,655
epel EPEL enabled: 6,265
epel-debuginfo Extra Packages for Enterprise Linux 8 - x86_64 - Debug disabled
*epel-modular Extra Packages for Enterprise Linux Modular 8 - x86_64 enabled: 0
epel-modular-debuginfo Extra Packages for Enterprise Linux Modular 8 - x86_64 - De disabled
epel-modular-source Extra Packages for Enterprise Linux Modular 8 - x86_64 - So disabled
epel-playground Extra Packages for Enterprise Linux 8 - Playground - x86_64 disabled
epel-playground-debuginfo Extra Packages for Enterprise Linux 8 - Playground - x86_64 disabled
epel-playground-source Extra Packages for Enterprise Linux 8 - Playground - x86_64 disabled
epel-source Extra Packages for Enterprise Linux 8 - x86_64 - Source disabled
epel-testing Extra Packages for Enterprise Linux 8 - Testing - x86_64 disabled
epel-testing-debuginfo Extra Packages for Enterprise Linux 8 - Testing - x86_64 - disabled
epel-testing-modular Extra Packages for Enterprise Linux Modular 8 - Testing - x disabled
epel-testing-modular-debuginfo Extra Packages for Enterprise Linux Modular 8 - Testing - x disabled
epel-testing-modular-source Extra Packages for Enterprise Linux Modular 8 - Testing - x disabled
epel-testing-source Extra Packages for Enterprise Linux 8 - Testing - x86_64 - disabled
extras extras enabled: 21
范例:显示仓库详细信息
4.3.2 显示程序包
yum list
yum list [all | glob_exp1] [glob_exp2] [...]
yum list {available|installed|updates} [glob_exp1] [...]
范例:只查看已安装的包
[20:50:29 root@centos8 yum.repos.d ]#yum list installed |head
Installed Packages
NetworkManager.x86_64 1:1.14.0-14.el8 @anaconda
NetworkManager-libnm.x86_64 1:1.14.0-14.el8 @anaconda
NetworkManager-team.x86_64 1:1.14.0-14.el8 @anaconda
NetworkManager-tui.x86_64 1:1.14.0-14.el8 @anaconda
acl.x86_64 2.2.53-1.el8 @anaconda
audit.x86_64 3.0-0.10.20180831git0047a6c.el8 @anaconda
audit-libs.x86_64 3.0-0.10.20180831git0047a6c.el8 @anaconda
authselect.x86_64 1.0-13.el8 @anaconda
authselect-libs.x86_64 1.0-13.el8 @anaconda
范例:查看可安装的包
[20:53:56 root@centos8 yum.repos.d ]#yum list available |head
Last metadata expiration check: 0:37:02 ago on Mon 17 Aug 2020 08:16:56 PM CST.
Available Packages
3proxy.x86_64 0.8.13-1.el8 epel
BackupPC.x86_64 4.4.0-1.el8 epel
BackupPC-XS.x86_64 0.62-1.el8 epel
BibTool.x86_64 2.68-1.el8 epel
CCfits.x86_64 2.5-14.el8 epel
CCfits-devel.x86_64 2.5-14.el8 epel
CCfits-doc.noarch 2.5-14.el8 epel
CGSI-gSOAP.x86_64 1.3.11-7.el8 epel
范例:查看可升级的包
[20:53:59 root@centos8 yum.repos.d ]#yum list updates
Last metadata expiration check: 0:38:19 ago on Mon 17 Aug 2020 08:16:56 PM CST.
范例:查看指定的包
[20:56:21 root@centos8 yum.repos.d ]#yum list tree
Last metadata expiration check: 0:39:39 ago on Mon 17 Aug 2020 08:16:56 PM CST.
Installed Packages
tree.x86_64 1.7.0-15.el8 @base
[20:56:36 root@centos8 yum.repos.d ]#yum list httpd
Last metadata expiration check: 0:39:51 ago on Mon 17 Aug 2020 08:16:56 PM CST.
Available Packages
httpd.x86_64 2.4.37-11.module_el8.0.0+172+85fc1f40 AppStream
#支持通配符
[20:57:46 root@centos8 yum.repos.d ]#yum list exim*
Last metadata expiration check: 0:40:56 ago on Mon 17 Aug 2020 08:16:56 PM CST.
Available Packages
exim.x86_64 4.94-1.el8 epel
exim-greylist.x86_64 4.94-1.el8 epel
exim-mon.x86_64 4.94-1.el8 epel
exim-mysql.x86_64 4.94-1.el8 epel
exim-pgsql.x86_64 4.94-1.el8 epel
4.3.3 安装程序包
yum install package1 [package2] [...]
yum reinstall package1 [package2] [...] #重新安装
--downloadonly #只下载相关包默认至/var/cache/yum/x86_64/7/目录下,而不执行
insta11/upgrade/erase
--downloaddir=<path>,--destdir=<path> #--downloadon1y选项来指定下载的目录,如果不存
在自动创建
4.3.3.1 安装epel源
[20:57:53 root@centos8 yum.repos.d ]#yum -y install epel-release
4.3.3.2 升级最新内核(linux可以多内核使用)
范例;只下载相关的依赖包,而不安装
#/data/目录如果不村存在会自动建立
[14:41:27 root@centos8 ~ ]#yum -y install --downloadonly --downloaddir=/data/httpd httpd
[14:41:41 root@centos8 ~ ]#ll /data/httpd/
total 2360
-r--r--r-- 1 root root 128080 Aug 18 14:41 apr-1.6.3-9.el8.x86_64.rpm
-r--r--r-- 1 root root 107760 Aug 18 14:41 apr-util-1.6.1-6.el8.x86_64.rpm
-r--r--r-- 1 root root 25120 Aug 18 14:41 apr-util-bdb-1.6.1-6.el8.x86_64.rpm
-r--r--r-- 1 root root 27484 Aug 18 14:41 apr-util-openssl-1.6.1-6.el8.x86_64.rpm
-r--r--r-- 1 root root 24456 Aug 18 14:41 centos-logos-httpd-80.5-2.el8.noarch.rpm
-r--r--r-- 1 root root 1747359 Aug 18 14:41 httpd-2.4.37-11.module_el8.0.0+172+85fc1f40.x86_64.rpm
-r--r--r-- 1 root root 34943 Aug 18 14:41 httpd-filesystem-2.4.37-11.module_el8.0.0+172+85fc1f40.noarch.rpm
-r--r--r-- 1 root root 104015 Aug 18 14:41 httpd-tools-2.4.37-11.module_el8.0.0+172+85fc1f40.x86_64.rpm
-r--r--r-- 1 root root 39632 Aug 18 14:41 mailcap-2.1.48-3.el8.noarch.rpm
-r--r--r-- 1 root root 159667 Aug 18 14:41 mod_http2-1.11.3-2.module_el8.0.0+10+abf51267.x86_64.rpm
4.3.4 卸载程序包
yum remove | erase package1 [package2] [...]
4.3.5 升级和降级
检查可用升级:
yum check-update
升级和降级
yum upgrade l update[package1][package2][...]
yum upgrade-minima7 #最小化升级
yum downgrade package1 [package2] [...](降级)
4.3.6 查询
查看程序包信息(information)
yum info [...]
查看指定的特性(可以是某文件)是由哪个程序包所提供:
yum provides | whatprovides feature1 [feature2] [...]
注意:文件要写全路径,而不只是文件名,否则可能无法查询到
范例:
[21:40:05 root@centos8 yum.repos.d ]#yum provides /etc/yum.conf
Last metadata expiration check: 0:20:53 ago on Mon 17 Aug 2020 09:19:49 PM CST.
yum-4.0.9.2-5.el8.noarch : Package manager
Repo : @System
Matched from:
Filename : /etc/yum.conf
以指定的关键字搜索程序包名及summary信息
yum search string1 [string2] [...]
查看指定包所依赖的capabilities:
yum deplist package1 [package2] [...]
范例:
[21:43:09 root@centos8 yum.repos.d ]#yum deplist mailx
Last metadata expiration check: 0:24:03 ago on Mon 17 Aug 2020 09:19:49 PM CST.
package: mailx-12.5-29.el8.x86_64
dependency: /bin/sh
provider: bash-4.4.19-7.el8.x86_64
dependency: libc.so.6(GLIBC_2.28)(64bit)
provider: glibc-2.28-42.el8.1.x86_64
dependency: libcrypto.so.1.1()(64bit)
provider: openssl-libs-1:1.1.1-8.el8.x86_64
dependency: libcrypto.so.1.1(OPENSSL_1_1_0)(64bit)
provider: openssl-libs-1:1.1.1-8.el8.x86_64
dependency: libgssapi_krb5.so.2()(64bit)
provider: krb5-libs-1.16.1-22.el8.x86_64
dependency: libgssapi_krb5.so.2(gssapi_krb5_2_MIT)(64bit)
provider: krb5-libs-1.16.1-22.el8.x86_64
dependency: libssl.so.1.1()(64bit)
provider: openssl-libs-1:1.1.1-8.el8.x86_64
dependency: libssl.so.1.1(OPENSSL_1_1_0)(64bit)
provider: openssl-libs-1:1.1.1-8.el8.x86_64
dependency: rtld(GNU_HASH)
provider: glibc-2.28-42.el8.1.i686
provider: glibc-2.28-42.el8.1.x86_64
[21:43:53 root@centos8 yum.repos.d ]#dnf info mailx
Last metadata expiration check: 0:24:58 ago on Mon 17 Aug 2020 09:19:49 PM CST.
Installed Packages
Name : mailx
Version : 12.5
Release : 29.el8
Arch : x86_64
Size : 491 k
Source : mailx-12.5-29.el8.src.rpm
Repo : @System
From repo : base
Summary : Enhanced implementation of the mailx command
URL : http://heirloom.sourceforge.net/mailx.html
License : BSD with advertising and MPLv1.1
Description : Mailx is an enhanced mail command, which provides the functionality
: of the POSIX mailx command, as well as SysV mail and Berkeley Mail
: (from which it is derived).
:
: Additionally to the POSIX features, mailx can work with Maildir/ e-mail
: storage format (as well as mailboxes), supports IMAP, POP3 and SMTP
: protocols (including over SSL) to operate with remote hosts, handles mime
: types and different charsets. There are a lot of other useful features,
: see mailx(1).
:
: And as its ancient analogues, mailx can be used as a mail script language,
: both for sending and receiving mail.
:
: Besides the "mailx" command, this package provides "mail" and "Mail"
: (which should be compatible with its predecessors from the mailx-8.x source),
: as well as "nail" (the initial name of this project).
范例:centos8查看未安装包的文件列表
[21:47:28 root@centos8 yum.repos.d ]#rpm -q memcached #确认是否安装该软件
package memcached is not installed
[21:47:35 root@centos8 yum.repos.d ]#dnf repoquery -l memcached
Last metadata expiration check: 0:28:55 ago on Mon 17 Aug 2020 09:19:49 PM CST.
/etc/sysconfig/memcached
/usr/bin/memcached
/usr/bin/memcached-tool
/usr/lib/.build-id
/usr/lib/.build-id/89
/usr/lib/.build-id/89/217dab806ba70f88fdfbd5a731d27b0382d51e
/usr/lib/systemd/system/memcached.service
/usr/share/doc/memcached
/usr/share/doc/memcached/AUTHORS
/usr/share/doc/memcached/CONTRIBUTORS
/usr/share/doc/memcached/COPYING
/usr/share/doc/memcached/ChangeLog
/usr/share/doc/memcached/NEWS
/usr/share/doc/memcached/README.md
/usr/share/doc/memcached/new_lru.txt
/usr/share/doc/memcached/protocol.txt
/usr/share/doc/memcached/readme.txt
/usr/share/doc/memcached/storage.txt
/usr/share/doc/memcached/threads.txt
/usr/share/man/man1/memcached-tool.1.gz
/usr/share/man/man1/memcached.1.gz
范例:centos7 查看未安装包的文件
[22:12:37 root@centos7 ~]#rpm -q memcached
package memcached is not installed
[22:11:18 root@centos7 ~]#yum -y install yum-utils #centos7需要安装yum-utils
[22:11:59 root@centos7 ~]#repoquery -ql memcached
/etc/sysconfig/memcached
/usr/bin/memcached
/usr/bin/memcached-tool
/usr/lib/systemd/system/memcached.service
/usr/share/doc/memcached-1.4.15
/usr/share/doc/memcached-1.4.15/AUTHORS
/usr/share/doc/memcached-1.4.15/CONTRIBUTORS
/usr/share/doc/memcached-1.4.15/COPYING
/usr/share/doc/memcached-1.4.15/ChangeLog
/usr/share/doc/memcached-1.4.15/NEWS
/usr/share/doc/memcached-1.4.15/README.md
/usr/share/doc/memcached-1.4.15/protocol.txt
/usr/share/doc/memcached-1.4.15/readme.txt
/usr/share/doc/memcached-1.4.15/threads.txt
/usr/share/man/man1/memcached-tool.1.gz
/usr/share/man/man1/memcached.1.gz
4.3.7 仓库缓存
清除目录/var/cache/yum/缓存
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
构建缓存:
yum makecache
范例:管理yum缓存
[10:06:02 root@centos8 ~ ]#du -sh /var/cache/dnf
91M /var/cache/dnf
[10:21:36 root@centos8 ~ ]#yum clean all
Repository epel is listed more than once in the configuration
96 files removed
[10:44:45 root@centos8 ~ ]#du -sh /var/cache/dnf
1.4M /var/cache/dnf
范例:yum缓存更新
[11:00:29 root@centos8 ~ ]#yum clean all;yum makecache
Repository epel is listed more than once in the configuration
0 files removed
Repository epel is listed more than once in the configuration
AppStream 169 MB/s | 5.2 MB 00:00
BaseOS 108 MB/s | 2.2 MB 00:00
EPEL 263 kB/s | 7.6 MB 00:29
extras 0.0 B/s | 0 B 00:20
Extra Packages for Enterprise Linux Modular 8 - x86_64 0.0 B/s | 0 B 00:10
Failed to synchronize cache for repo 'extras', ignoring this repo.
Failed to synchronize cache for repo 'epel-modular', ignoring this repo.
Metadata cache created.
4.3.8 查看yum事物历史
yum 执行安装卸载命令会记录到相关日志中
日志 文件:
#Centos7以前版本日志
/var/log/yum.1og
#centos 8版本日志
/var/log/dnf.rpm.log
/var/log/dnf.log
日志命令
yum history [info|list|packages-list|packages-info|summary|addoninfo|redo|undo|rollback|new|sync|stats]
范例:
[21:48:44 root@centos8 yum.repos.d ]#dnf history
ID | Command line | Date and time | Action(s) | Altered
-------------------------------------------------------------------------------
23 | -y install epel-release | 2020-08-16 16:10 | Install | 1
22 | history redo 19 | 2020-08-16 15:33 | Install | 1
21 | history undo 19 | 2020-08-16 15:32 | Removed | 1
20 | -y install lrzsz | 2020-08-16 15:16 | Install | 1
19 | -y install vsftpd | 2020-08-16 15:01 | Install | 1
18 | -y install cowsay | 2020-08-16 14:28 | Install | 42
17 | remove cowsay | 2020-08-16 14:22 | Removed | 42
16 | -y install cowsay | 2020-08-16 13:55 | Install | 42
[22:00:52 root@centos8 yum.repos.d ]#dnf history info 23 #安装的详细信息
Transaction ID : 23
Begin time : Sun 16 Aug 2020 04:10:22 PM CST
Begin rpmdb : 459:1467ac91566219f246248dca31f29382616afd77
End time : Sun 16 Aug 2020 04:10:23 PM CST (1 seconds)
End rpmdb : 460:96afe52623cd44fa543d37d218e6d418e083cd3c
User : root <root>
Return-Code : Success
Releasever : 8
Command Line : -y install epel-release
Packages Altered:
Install epel-release-8-8.el8.noarch @epel
[22:01:04 root@centos8 yum.repos.d ]#dnf history undo 23 -y #卸载安装
[22:01:26 root@centos8 yum.repos.d ]#dnf history redo 23 -y #重新安装步骤
4.3.9 安装及升级本地程序包
yum localinstall|install rpmfile1 [rpmfile2] [...]
yum localupdate|update rpmfile1 [rpmfile2] [...]
4.3.10 包组管理的相关命令
yum groupinstall group1 [group2] [...]
yum groupupdate group1 [group2] [...]
yum grouplist [hidden] [groupwildcard] [...]
yum groupremove group1 [group2] [...]
yum groupinfo group1 [...]
4.3.11 实现私用 yum仓库
下载所有yum仓库的相关包和meta 数据
#Centos 8 dnf工具集成
dnf reposync --he1p #查看帮助
#默认只下载rpm包,不下载 meta数据,需要指定--down1oad-metadata才能下载meta
dnf reposync --repoid=REPOID --download-metadata -p /path
#centos 7 以前版本,reposync工具来自于yum-uti1s包
reposync --repoid=REPOID --down1oad-metadata -p /path
创建私有yum仓库:
createrepo [options] <directory>
范例:创建局域网的基于base的私有yum源
#仓库服务器配置
[root@repo-server ~]#yum -y install httpd
[root@repo-server ~]#systemctl enable --now httpd
[root@repo-server ~]#mkdir /var /www/htm1/centos/8 -pv
[root@repo-server ~]#mount /dev/sro /mnt/ #挂载光盘
[root@repo-server ~]#cp -a /mnt/*/var/www/htm1/centos/8
#yum客户端配置
[root@repo-client ~]#cat /etc/yum.repos.d/test.repo
[Baseos]
name=Baseos
baseurl=http://10.0.0.8/centos/8/Baseos
gpgkey=file:/ //etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficia7
[Appstream]
name=Appstream
baseur1=http://10.0.0.8/centos/8/AppStream/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
4.3.12 DNF 介绍
DNF,即DaNdiFied,是新一代的RPM软件包管理器。DNF 发行日期是2015年5月11日,DNF 包管理 器采用Python 编写,发行许可为GPL v2,首先出现在Fedora 18 发行版中。在 RHEL 8.0 版本正式取代 了 YUM,DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分 析,运行速度等
配置文件:
/etc/dnf/dnf.conf
仓库文件:
/etc/yum.repos.d/ *.repo
日志:
/var/log/dnf.rpm.log
/var/log/dnf.log
DNF 使用帮助:man dnf
dnf 用法与yum一致
dnf [options] <command> [<arguments>...]
dnf --version
dnf repolist
dnf reposync
dnf install httpd
dnf remove httpd
dnf clean all
dnf makecache
dnf list installed
dnf list available
dnf search nano
dnf history undo 1
4.3.13 yum Troubleshooting
故障排错:yum 和 dnf 失败最主要原因:
-
yum的配置文件格式或路径错误
解决方法:检查/etc/yum.repos.d/*.repo文件格式
-
yum cache
解决方法:yum clean all
-
网络不通:
解决方法:网卡配置
5.程序包编译
5.1 源码编译介绍
程序包编译安装:
源代码–>预处理–>编译–>汇编–>链接–>执行
多文件:文件中的代码之间,很可能存在跨文件依赖关系
虽然有很多开源软件将软件打成包,供人们使用,但并不是所有源代码都打成包,如果想使用开源软 件,可能需要自已下载源码,进行编译安装。另外即使提供了包,但是生产中需要用于软件的某些特 性,仍然需要自行编译安装。但是利用源代码编译安装是比较繁琐的,庆幸的是有相关的项目管理工具 可以大大减少编译过程的复杂度
5.2 开源程序源代码的获取
官方自建站点:
-
apache.org (ASF:Apache Software Foundation)
-
mariadb.org
代码托管:
-
github.com
-
gitlab.com
-
SourceForge.net
-
code.google.com
-
gitee.com
5.3 编译源码的项目工具
-
C、C++的源码编译:使用 make 项目管理器
configure脚本 --> Makefile.in --> Makefile
相关开发工具:
autoconf: 生成configure脚本
automake:生成Makefile.in
-
java的源码编译: 使用 maven
5.4 C语言源代码编译安装过程
利用编译工具,通常只需要三个大的步骤
-
./configure
(1) 通过选项传递参数,指定安装路径、启用特性等;执行时会参考用户的指定以及Makefile.in文 件生成Makefile
(2) 检查依赖到的外部环境,如依赖的软件包
-
make 根据Makefile文件,构建应用程序
-
make install 复制文件到相应路径
注意:安装前可以通过查看README,INSTALL获取帮助
5.4.1 编译安装准备
准备:安装相关的依赖包
-
开发工具: gcc (c/c++编译器GNU C Complier),make
-
开发环境:开发库(glibc:标准库),头文件,可安装开发包组 Development Tools
-
特定软件相关依赖包
生产实践:基于最小化安装的系统建议安装下面相关包
yum install gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl
openssl-devel systemd-devel zlib-devel vim lrzsz tree tmux lsof tcpdump wget
net-tools iotop bc bzip2 zip unzip nfs-utils man-pages
5.4.2 编译安装
第一步:运行 configure 脚本,生成Makefile 文件
其选项主要功能:
-
可以指定安装位置
-
指定启用的特性
获取其支持使用的选项
./configure --help
选项分类:
-
安装路径设定:
–prefix=/PATH:指定默认安装位置,默认为/usr/local/
–sysconfdir=/PATH:配置文件安装位置
System types:支持交叉编译
-
软件特性和相关指定:
Optional Features: 可选特性
--disable-FEATURE --enable-FEATURE[=ARG]
Optional Packages: 可选包
--with-PACKAGE[=ARG] 依赖包
--without-PACKAGE 禁用依赖关系
注意:通常被编译操作依赖的程序包,需要安装此程序包的“开发”组件,其包名一般类似于namedevel-VERSION
第二步:make
第三步:make install
5.4.3 安装后的配置
1.二进制程序目录导入至PATH环境变量中
编辑文件/etc/profile.d/NAME.sh
export PATH=/PATH/TO/BIN:$PATH
2.相关用户及文件
有些开源软件编译完成后,还需要创建相关的用户及文件
3.导入帮助手册
编辑/etc/man.config|man_db.conf文件,添加一个MANPATH
5.4.4 编译安装实战案例
范例:官网下载并编译安装tree
#安装相关的依赖包
yum install gcc make
1.#在列出的详细信息中找到官方网址下载源码
[19:27:23 root@centos8 src ]#rpm -qi tree
URL : http://mama.indstate.edu/users/ice/tree/
2.#解压源码
[19:31:02 root@centos8 src ]#tar xvf tree-1.8.0_.tgz
3.#进入解压缩的目录,README和INSTALL
[19:32:39 root@centos8 src ]#cd tree-1.8.0
[19:43:59 root@centos8 tree-1.8.0 ]#cat README #安装说明
[19:44:14 root@centos8 tree-1.8.0 ]#cat INSTALL
4.#修改源码的版本号
[19:45:11 root@centos8 tree-1.8.0 ]#sed -i 's#v1\.8\.O#v2.2.2#' tree.c
5.#编译准备
[19:57:15 root@centos8 tree-1.8.0 ]#vi Makefile
prefix = /apps/tree #安装路径
6.#编译
[19:59:44 root@centos8 tree-1.8.0 ]#make
7.#安装
[20:00:40 root@centos8 tree-1.8.0 ]#make install
8.#修改PATH路径
#默认无法直接运行tree
[20:16:39 root@centos8 ~ ]#echo 'PATH=/apps/tree/bin:$PATH' > /etc/profile.d/tree.sh
[20:17:08 root@centos8 ~ ]. /etc/profile.d/tree.sh
#或者利用软链接实现
[20:17:11 root@centos8 ~ ]#1n -s/apps/tree/bin/tree /usr/loca1/bin
#验证结果
[20:17:50 root@centos8 ~ ]#tree --version
tree v2.2.2 (c) 1996 - 2018 by Steve Baker, Thomas Moore, Francesc Rocher, Florian Sesser, Kyosuke Tokoro
范例:编译安装 cmatrix
#安装相关安装包
dnf install gcc makeautoconfncurses-devel
#下载并解压缩包
[20:29:01 root@centos8 ~ ]#cd /usr/local/src/
[20:30:10 root@centos8 src ]#wget https://github.com/abishekvashok/cmatrix/releases/download/v2.0/cmatrix-v2.0-Butterscotch.tar
[20:56:11 root@centos8 src ]#tar xvf cmatrix-v2.0-Butterscotch.tar
#配置
[20:57:37 root@centos8 src ]#cd cmatrix
[20:57:53 root@centos8 cmatrix ]#./configure --prefix=/apps/cmatrix
#编译安装
[21:02:29 root@centos8 cmatrix ]#make
[21:02:43 root@centos8 cmatrix ]#make install
#运行
[21:06:25 root@centos8 cmatrix ]#/apps/cmatrix/bin/cmatrix
范例:编译安装 httpd-2.4.46
#关闭防火墙
#下载并解压缩包
[07:18:23 root@centos7 ~]#wget https://mirror.bit.edu.cn/apache//httpd/httpd-2.4.46.tar.bz2
[07:29:33 root@centos7 httpd-2.4.46]#tar xvf httpd-2.4.46.tar.bz2
#配置
[08:06:25 root@centos7 ~]#cd /usr/local/src/httpd-2.4.46
[08:06:54 root@centos7 httpd-2.4.46]#./configure --prefix=/apps/httpd --enable-ssl
#编译并安装
[08:06:54 root@centos7 httpd-2.4.46]#make
[08:06:54 root@centos7 httpd-2.4.46]#make install
#配置环境
[08:06:54 root@centos7 httpd-2.4.46]#echo 'PATH=/apps/httpd/bin:$PATH'> /etc/profile.d/httpd.sh
[08:06:54 root@centos7 httpd-2.4.46]#. /etc/profile.d/httpd.sh
#运行
[08:10:55 root@centos7 httpd-2.4.46]#apachectl start
或
[08:05:02 root@centos7 httpd-2.4.46]#/apps/httpd/bin/apachectl
#指定用apache用户运行
[08:13:26 root@centos7 httpd-2.4.46]#useradd -r -s /sbin/nologin -d /var/ww -c Apache -u 48 apache
[08:13:26 root@centos7 httpd-2.4.46]#vim /etc/httpd/httpd.conf
#配置生效和验证
[08:26:04 root@centos7 bin]#apachect1 restart
6 Ubuntu 软件管理
Debian 软件包通常为预编译的二进制格式的扩展名“.deb”,类似 rpm 文件,因此安装快速,无需编译 软件。包文件包括特定功能或软件所必需的文件、元数据和指令
-
dpkg:package manager for Debian,类似于rpm, dpkg是基于Debian的系统的包管理器。可 以安装,删除和构建软件包,但无法自动下载和安装软件包或其依赖项
-
apt:Advanced Packaging Tool,功能强大的软件管理工具,甚至可升级整个Ubuntu的系统,基 于客户/服务器架构,类似yum
6.1 APT工作原理
在服务器上先复制所有DEB包,然后用APT的分析工具genbasedir根据每个DEB 包的包头(Header) 信息对所有的DEB包进行分析,并将该分析结果记录在文件夹base内的一个DEB 索引清单文件中,一 旦APT 服务器内的DEB有所变动,要使用genbasedir产生新的DEB索引清单。客户端在进行安装或升级 时先要查询DEB索引清单,从而获知所有具有依赖关系的软件包,并一同下载到客户端以便安装。当客 户端需要安装、升级或删除某个软件包时,客户端计算机取得DEB索引清单压缩文件后,会将其解压置 放于 /var/cache/apt/,而客户端使用apt-get install或apt-get upgrade命令的时候,就会将这个文件夹 内的数据和客户端计算机内的DEB数据库比对,知道哪些DEB已安装、未安装或是可以升级的
6.2 dpkg 包管理器
dpkg 常见用法
#安装包
dpkg -i package.deb
#删除包,不建议,不自动卸载依赖于它的包
dpkg -r package
#删除包(包括配置文件)
dpkg -P package
#列出当前已安装的包,类似rpm -qa
dpkg -1
#显示该包的简要说明
dpkg -l package
#列出该包的状态,包括详细信息,类似rpm -qi
dpkg -s package
#列出该包中所包含的文件,类似rpm -ql
dpkg -L package
#搜索包含pattern的包,类似rpm -qf
dpkg -s <pattern>
#配置包,-a使用,配置所有没有配置的软件包
dpkg --configure package
#列出deb包的内容,类似rpm -qp1
dpkg -c package.deb
#解开deb包的内容
dpkg --unpack package.deb
注意:一般建议不要使用dpkg卸载软件包。因为删除包时,其它依赖它的包不会卸载,并且可能无法再 正常运行
6.3 apt
Debian 使用apt 工具集来管理包系统,apt-get 是其中一个常用的命令行工具,另外一款较为流行的命 令行与 GUI 兼顾的工具是 aptitude ,之前最常用的 Linux 包管理命令都被分散在了 apt-get、aptcache 和 apt-config 这三条命令中
在 2014 年apt 命令发布第一个稳定版,Ubuntu 16.04 引入新特性之一便是 apt 命令,apt 命令解决了 命令过于分散的问题,它包括 apt-get 命令出现以来使用最广泛的功能选项,以及 apt-cache 和 aptconfig 命令中很少用到的功能。在使用 apt 命令时,用户不必再由 apt-get 转到 apt-cache 或 aptconfig,提供管理软件包所需的必要选项
apt 相当于 apt-get、apt-cache 和 apt-config 中最常用命令选项的集合 apt 具有更精减但足够的命令选项,而且参数选项的组织方式更为有效。此外,启用的几个特性也非常 有帮助。例如:可以在使用 apt 命令安装或删除程序时看到进度条,apt 还会在更新存储库数据库时提示 用户可升级的软件包个数
apt 与 apt-get 有一些类似的命令选项,但它并不能完全向下兼容 apt-get 命令,也即可用 apt 替换部分 apt-get 系列命令,但不是全部
apt 命令用法
查看帮助:apt help
apt与apt-get命令对比
apt命令 | 被取代的命令 | 命令的功能 |
---|---|---|
apt install | apt-get install | 安装软件包 |
apt remove | apt-get remove | 移除软件包 |
apt purge | apt-get purge | 移除软件包及配置文件 |
apt update | apt-get update | 刷新存储库索引 |
apt upgrade | apt-get upgrade | 升级所有可升级的软件包 |
apt autoremove | apt-get autoremove | 自动删除不需要的包 |
apt full-upgrade | apt-get dist-upgrade | 在升级软件包时自动处理依赖关系 |
apt search | apt-cache search | 搜索应用程序 |
apt show | apt-cache show | 显示安装细节 |
apt 特有的命令
apt list 列出包含条件的包(已安装,可升级等)
apt edit-sources 编辑源列表
APT包索引配置文件
/etc/apt/sources.list
/etc/apt/sources.list.d
可以修改上面文件为国内的安装源,提高速度
参考链接:https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.53322f70fghx56
apt命令操作(如安装和删除软件包)日志文件
/var/log/dpkg.log
ubuntu建议安装的常用包
[root@ubuntu1804 ~]#apt purge ufw lxd 1xd-client lxcfs liblxc-common
[root@ubuntu1804 ~]#apt install iproute2 ntpdate tcpdump telnet traceroute nfs-
kernel-server nfs-common lrzsz tree openss1 libss1-dev libpcre3 libpcre3-dev
z1ib1g-devgcc openssh-serveriotop unzip zip
练习
1、查询命令java来自于哪个rpm包
2、yum的配置和使用,包括yum仓库的创建
3、编写系统初始化脚本 reset.sh,包括别名,提示符颜色,yum仓库配置文件,安装tree,ftp,lftp,telnet 等包 4、在CentOS 7上编译安装 apache 2.
4.25 源码包,并启动此服务
第四周 磁盘存储和文件管理
2.4处理交换文件和分区
2.4.1 swap介绍
swap交换分区是系统RAM的补充,swap 分区支持虚拟内存。当没有足够的 RAM 保存系统处理的数据 时会将数据写入 swap 分区,当系统缺乏 swap 空间时,内核会因 RAM 内存耗尽而终止进程。配置过 多 swap 空间会造成存储设备处于分配状态但闲置,造成浪费,过多 swap 空间还会掩盖内存泄露
注意:为优化性能,可以将swap 分布存放,或高性能磁盘存放
官方推荐推荐系统 swap 空间
系统中的RAM | 推荐的swap空间 | 允许休眠的建议swap空间 |
---|---|---|
低于2G | RAM 量的2倍数 | RAM 容量的三倍 |
2 GB - 8 GB | 等于 RAM 量 | RAM 量的倍数 |
8 GB - 64 GB | 4 GB 到 RAM 容量的 0.5 倍 | RAM 容量的 1.5 倍 |
超过 64 GB | 独立负载(至少 4GB) | 不建议使用休眠功能 |
2.4.2 交换分区实现过程
- 创建交换分区或者文件
- 使用mkswap写入特殊签名
- 在/etc/fstab文件中添加适当的条目
- 使用swapon -a激活交换空间
启用swap分区
swapon [OPTION]... [DEVICE]
选项:
-a:激活所有的交换分区
-p PRIORITY:指定优先级,也可在/etc/fstab 在第4列指定:pri=value
禁用swap分区
swapoff [OPTION]... [DEVICE]
SWAP的优先级
swapon -s 查看swap分区的优先级
可以指定swap分区0到32767的优先级,值越大优先级越高
如果用户没有指定,那么核心会自动给swap指定一个优先级,这个优先级从-1开始,每加入一个新的 没有用户指定优先级的swap,会给这个优先级减一 先添加的swap的缺省优先级比较高,除非用户自己指定一个优先级,而用户指定的优先级(是正数)永远 高于核心缺省指定的优先级(是负数)
范例:修改swap分区的优先级
UUID=f4649a8a-7afd-411b-977a-60f93851dfe9 / xfs defaults 0 0
UUID=b97bc31f-c03d-4fe9-8715-c1c198790fcb /boot ext4 defaults 1 2
UUID=53ef4f7b-6dfb-4966-8d53-4e821d68d5d1 /data xfs defaults 0 0
UUID=038ae1c0-0d16-4088-8a15-0f41829c30ea swap swap defaults 0 0
UUID=509ee336-6aec-48b0-b390-12c1f9889520 swap swap pri=100 0 0
范例:以文件实现swap功能
[10:31:31 root@centos8 cd ]#dd if=/dev/zero of=/swapfile bs=1M count=1024 #创建文件
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.79749 s, 597 MB/s
[10:34:37 root@centos8 cd ]#mkswap /swapfile #创建文件系统
mkswap: /swapfile: insecure permissions 0644, 0600 suggested.
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=83b0213f-7698-438f-ac7f-0e4ef153adaa
[10:35:04 root@centos8 cd ]#blkid /swapfile
/swapfile: UUID="83b0213f-7698-438f-ac7f-0e4ef153adaa" TYPE="swap"
[10:35:19 root@centos8 cd ]#blkid /swapfile >> /etc/fstab #添加 UID到/etc/fstab文件中
[10:35:44 root@centos8 cd ]#vi /etc/fstab #修改UID为文件路径
/sawpfile swap swap defaults 0 0
[10:37:31 root@centos8 cd ]#swapon -a #启用swap
swapon: /swapfile: insecure permissions 0644, 0600 suggested.
[10:37:51 root@centos8 cd ]#chmod 600 /swapfile #修改权限
[10:45:45 root@centos8 cd ]#swapon -s #可以看到文件swap以启用
Filename Type Size Used Priority
/dev/sda3 partition 2097148 6668 -2
/swapfile file 1048572 0 -3
2.4.3 swap的使用策略
/proc/sys/vm/swappiness 的值决定了当内存占用达到一定的百分比时,会启用swap分区的空间
[09:55:38 root@centos8 ~ ]#cat /proc/sys/vm/swappiness
30
说明:内存在使用到100-30=70%的时候,就开始出现有交换分区的使用。简单地说这个参数定义了系 统对swap的使用倾向,默认值为30,值越大表示越倾向于使用swap。可以设为0,这样做并不会禁止 对swap的使用,只是最大限度地降低了使用swap的可能性
创建ISO文件
cp /dev/cdrom /root/centos.iso
mkisofs -r -o /root/etc.iso /etc #来自于genisoimage包
2.5磁盘常见工具
2.5.1 文件系统空间实际真正占用等信息的查看工具df
df [OPTION]... [FILE]...
常用选项
-H 以10为单位
-T 文件系统类型
-h human-readable
-i inodes instead of blocks
-P 以Posix兼容的格式输出
2.5.2查看某目录总体空间占用状态du
显示指定目录下面各个子目录的大小,单位为kb
du [OPTION]... [FILE]...
常用选项
h human-readable
-s summary
--max-depth=# 指定最大目录层级
[14:11:01 root@centos8 / ]#du -h -x --max-depth=1
22M ./etc
7.0M ./root
146M ./var
1.4G ./usr
16K ./home
0 ./media
0 ./mnt
0 ./opt
0 ./srv
4.0K ./tmp
6.0M ./apps
2.6G .
2.5.3 工具dd
dd 命令:convert and copy a file
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=#
if=file 从所命名文件读取而不是从标准输入
of=file 写到所命名的文件而不是到标准输出
ibs=size 一次读size个byte
obs=size 一次写size个byte
bs=size block size, 指定块大小(既是是ibs也是obs)
cbs=size 一次转化size个byte
skip=blocks 从开头忽略blocks个ibs大小的块
seek=blocks 从开头忽略blocks个obs大小的块
count=n 复制n个bs
conv=conversion[,conversion...] 用指定的参数转换文件
conversion 转换参数:
ascii 转换 EBCDIC 为 ASCII
ebcdic 转换 ASCII 为 EBCDIC
lcase 把大写字符转换为小写字符
ucase 把小写字符转换为大写字符
nocreat 不创建输出文件
noerror 出错时不停止
notrunc 不截短输出文件
sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐
fdatasync 写完成前,物理写入输出文件
练习
1、创建一个2G的文件系统,块大小为2048byte,预留1%可用空间,文件系统ext4,卷标为TEST,要求 此分区开机后自动挂载至/test目录,且默认有acl挂载选项
2、写一个脚本,完成如下功能: (1) 列出当前系统识别到的所有磁盘设备 (2) 如磁盘数量为1,则显示其空间使用信息 否则,则显示最后一个磁盘上的空间使用信息
3、将CentOS6的CentOS-6.10-x86_64-bin-DVD1.iso和CentOS-6.10-x86_64-bin-DVD2.iso两个文件, 合并成一个CentOS-6.10-x86_64-Everything.iso文件,并将其配置为yum源
3. RAID
3.1 什么是RAID
“RAID”—词是由David Patterson, Garth A.Gibson,Randy Katz于1987年在加州大学伯克利分校发明的。在1988年6月SIGMOD会议上提交的论文"ACase for Redundant Arrays of Inexpensive Disks""中提出,当时性能最好的大型机不断增长的个人电脑市场开发的一系列廉价驱动器的性能所击败。尽管故障与驱动器数量的比例会上升,但通过配置冗余,阵列的可靠性可能远远超过任何大型单个驱动器的可靠性
独立硬盘冗余阵列(RAID,Redundant Array of Independent Disks),旧称廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks),简称磁盘阵列。利用虚拟化存储技术把多个硬盘组合起来,成为一个或多个硬盘阵列组,目的为提升性能或数据冗余,或是两者同时提升。
RAID层级不同,数据会以多种模式分散于各个硬盘,RAID层级的命名会以RAID·开头并带数字,例如:RAIDO、RAID1、RAID 5、RAID 6、RAID7、RAID 01、RAID10、RAID50、RAID 60。每种等级都有其理论上的优缺点,不同的等级在两个目标间获取平衡,分别是增加数据可靠性以及增加存储器(群)读写性能。
简单来说,RAID把多个硬盘组合成为一个逻辑硬盘,因此,操作系统只会把它当作一个实体硬盘。RAID常被用在服务器电脑上,并且常使用完全相同的硬盘作为组合。由于硬盘价格的不断下降与RAID功能更加有效地与主板集成,它也成为普通用户的一个选择,特别是需要大容量存储空间的工作,如:视频与音频制作。
RAID功能实现
-
提高IO能力,磁盘并行读写
-
提高耐用性,磁盘冗余算法来实现
RAID实现的方式
-
外接式磁盘阵列:通过扩展卡提供适配能力
-
内接式RAID:主板集成RAID控制器,安装OS前在BIOS里配置
-
软件RAID:通过OS实现,比如:群晖的NAS
3.2 RAID 级别
级别:多块磁盘组织在一起的工作方式有所不同
参考链接: https:llzh.wikipedia.org/wiki/RAID
RAID-O:条带卷,strip
RAID-1:镜像卷,mirror
RAID-2
…
RAID-5
RAID-6
RAID-10
RAID-O1
具体看pdf–磁盘存储和文件系统管理
常用级别:RAID-0,RAID-1,RAID-10,RAID-50
磁盘阵列比较表
RAID级别 | 最少硬盘 | 最大容错 | 可用容量 | 读取性能 | 写入性能 | 安全性 | 目的 | 应用场景 |
---|---|---|---|---|---|---|---|---|
单一硬盘 | (参考) | 0 | 1 | 1 | 1 | 无 | ||
IBOD | 1 | 0 | N | 1 | 1 | 无(同RAID) | 增加容量 | 个人(暂时)存储备份 |
0 | 1 | 0 | N | N | N | 一个硬盘异常,全部硬盘都会异常 | 追求最大容量、速度 | 影片剪辑、缓存 |
1 | 2 | N-1 | N | N1 | 1 | 高,一个正常即可 | 追求最大安全性 | 个人、企业备份 |
5 | 3 | 1 | N-1 | N-1 | N-1 | 高 | 追求最大容量、最小预算 | 个人、企业备份 |
6 | 4 | 2 | N-2 | N-2 | N-1 | 安全性较RAID5高 | 同RAID5,但较安全 | 个人、企业备份 |
10 | 4 | 高 | 综合RAID0/1优点,理论速度较快 | 大型数据库 | ||||
50 | 6 | 高 | 提升数据安全 | |||||
60 | 8 | 高 | 提升数据安全 |
4. 逻辑卷
4.1 逻辑卷介绍
LVM:Logical Volume Manager可以允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小,允许在多个物理设备间重新组织文件系统
LVM可以弹性的更改LVM的容量
实现过程:
- 将设备指定为物理卷
- 用一个或者多个物理卷来创建一个卷组,物理卷是用固定大小的物理区域(Physical Extent,PE))来定义的
- 在物理卷上创建的逻辑卷,是由物理区域(PE)组成
- 可以在逻辑卷上创建文件系统并挂载
第一个逻辑卷对应设备名: /devldm-#
dm: device mapper,将一个或多个底层块设备组织成一个逻辑设备的模块
软链接:
-
ldev/mapperVG_NAME-LV_NAME
-
ldev/VG_NAME/LV_NAME
范例:
/dev/mapper/vol0-root
/dev/vol0/root
4.2 实现逻辑卷
相关工具来自于lvm2包
[17:10:39 root@centos8 data ]#yum -y install lvm2
4.2.1 pv管理工具
显示pv信息
pvs:简要pv信息显示
pvdisplay
创建pv (创建逻辑卷)
pvcreate /dev/DEVICE
删除pv
pvremove /dev/DEVICE
4.2.2 vg管理工具
显示卷组
vgs
vgdisplay
创建卷组
vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
#示例
vgcreate -s 16M vg0 /dev/sdb /dev/sdc#指定PE的大小,默认4M
管理卷组
vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
删除卷组
先做pvmove
再做vgremove
4.2.3 lv管理工具
显示逻辑卷
lvs
Lvdisplay
创建逻辑卷
lvcreate -L #[mMgGtT] -n NAME VolumeGroup
删除逻辑卷
lvremove /dev/VG_NAME/LV_NAME
重设文件系统大小
fsadm [options] resize device [new_size[BKMGTEP]]
resize2fs [-f] [-F] [-M] [-P] [-p] device [new_size]
xfs_growfs /mountpoint
范例:
#创建物理卷
pvcreate /dev/sda3
#为卷组分配物理卷
vgcreate vg0 /dev/sda3
#从卷组创建逻辑卷
lvcreate -L 256M -n data vg0
#mkfs.xfs /dev/vg0/data
#挂载
mount /dev/vg0/data /mnt/data#
4.2.4 扩展和缩减逻辑卷
扩展逻辑卷
#两步实现
#第一步实现逻辑卷的空间扩展
lvextend -L[+]#[mMgGtT]/dev/vG_NAME/LV_NAME
#第二步实现文件系统的扩展
#针对ext
resize2fs /dev/vG_NAME/LV_NAME
#针对xfs
xfs_growfs MOUNTPOINT
#一步实现容间和文件系统的扩展
lvresize -r -1 +100%FREE/dev/vG_NAME/LV_NAME
缩减逻辑卷
注意: 缩减有数据损坏的风险,建议先备份在缩减,xfs文件喜用不支持缩减
umount /dev/VG_NAME/LV_NAME
e2fsck -f /dev/VG_NAME/LV_NAME
resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]
lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME
mount /dev/VG_NAME/LV_NAME mountpoint
范例:
#第一步 取消挂载
[19:18:28 root@centos8 ~ ]#umount /data/mysql
#第二部 检查文件系统的完整性
[19:27:25 root@centos8 ~ ]#fsck -f /dev/vg0/mysql
#第三步 缩减文件系统 只支持ext4 不支持xfs
[19:28:23 root@centos8 ~ ]#resize2fs /dev/vg0/mysql 1G
#第四步 缩减逻辑卷大小
[19:34:25 root@centos8 ~ ]#lvreduce -L lG /dev/vg0/mysq1
#第五步 恢复挂载
[root@centos8 ~]#mount -a
4.2.5 跨主机迁移卷组
源计算机上
1 在旧系统中,umount所有卷组上的逻辑卷
⒉ 禁用卷组
vgchange -a n vgo
1vdisplay
3 导出卷组
vgexport vgo
pvscan
vgdisplay
4 拆下旧硬盘在目标计算机上,并导入卷组:
vgimport vgo
5 启用
vgchange -ay vgo
6 mount所有卷组上的逻辑卷
4.2.6 拆除指定的 PE 存储设备
详情看pdf----磁盘存储和文件系统管理4.2.6
4.3 逻辑卷快照
4.3.1 逻辑卷快照原理
快照是特殊的逻辑卷,它是在生成快照时存在的逻辑卷的准确拷贝,对于需要备份或者复制的现有数据临时拷贝以及其它操作来说,快照是最合适的选择,快照只有在它们和原来的逻辑卷不同时才会消耗空间,建立快照的卷大小小于等于原始逻辑卷,也可以使用lvextend扩展快照
逻辑卷管理器快照
快照就是将当时的系统信息记录下来,就好像照相一般,若将来有任何数据改动了,则原始数据会被移动到快照区,没有改动的区域则由快照区和文件系统共享
逻辑卷快照工作原理
-
在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所改变才会使用这些空间
-
当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中
-
快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的数据
由于快照区与原本的LV共用很多PE的区块,因此快照与被快照的LV必须在同一个VG中.系统恢复的时候的文件数量不能高于快照区的实际容量
快照特点:
-
备份速度快,瞬间完
-
应用场景是测试环境,不能完成代替备份
-
快照后,逻辑卷的修改速度会—定有影响
范例:
mkfs.xfs /dev/vg0/data
mount /dev/vg0/data//mnt/data
#为现有逻辑卷创建快照
lvcreate -1 64 -s -n data-snapshot -p r /dev/vg0/data #-p r 只读
#挂载快照
mkdir -p /mnt/snap
mount -o ro,nouuid /dev/vg0/data-snapshot /mnt/snap
#恢复快照(先取消所有挂载后还原)
umount /dev/vg0/data-snapshot
umount /dev/vg0/data
lvconvert --merge /dev/vg0/data-snapshot
#删除快照
umount /mnt/ snap
lvremove /dev/vg0/data-snapshot
练习
1、创建一个至少有两个PV组成的大小为20G的名为testvg的VG;要求PE大小为16MB,而后在卷组中创
建大小为5G的逻辑卷testlv;挂载至/users目录
2、新建用户archlinux,要求其家目录为/users/archlinux,而后su切换至archlinux用户,复
制/etc/pam.d目录至自己的家目录
3、扩展testlv至7G,要求archlinux用户的文件不能丢失
4、收缩testlv至3G,要求archlinux用户的文件不能丢失
5、对testlv创建快照,并尝试基于快照备份数据,验证快照的功能
第四周 网络协议和管理
1.开放系统互联osi
1 | 应用层 | Application |
---|---|---|
2 | 表示层 | Presentation |
3 | 会话层 | Session |
4 | 传输层 | Transport |
5 | 网络层 | Network |
6 | 数据链路层 | Data Link |
7 | 物理层 | Physical |
在制定计算机网络标准方面,起着重大作用的两大国际组织是:国际电信联盟电信标准化部门,与国际标准组织(ISO),虽然它们工作领域不同,但随着科学技术的发展,通信与信息处理之间的界限开始变得比较模糊,这也成了国际电信联盟电信标准化部门和ISO共同关心的领域。1984年,ISO发布了著名的oSI(Open System Interconnection)标准,它定义了网络互联的7层框架,物理层、数据链路层、网络层、传输层、会话层、表示层和应用层),即OSI开放系统互连参考模型
osi模型的7层结构
-
第7层应用层
应用层(Application Layer))提供为应用软件而设的接口,以设置与另一应用软件之间的通信。例如:HTTP、HTTPS、FTP、TELNET、SSH、SMTP、POP3、MySQL等 -
第6层表示层
主条目:表示层(Presentation Layer))把数据转换为能与接收者的系统格式兼容并适合传输的格式 -
第5层会话层
会话层(Session Layer)负责在数据传输中设置和维护电脑网络中两台电脑之间的通信连接。 -
第4层传输层
传输层(Transport Layer)把传输表头(TH))加至数据以形成数据包。传输表头包含了所使用的协议等发送信息。例如:传输控制协议(TCP)等。 -
第3层网络层
网络层(Nelwork Layer)决定数据的路径选择和转寄,将网络表头(NH))加至数据包,以形成报文。网络表头包含了网络数据。例如:互联网协议(IP)等。 -
第2层数据链接层
数据链路层(Data Link Layer)负责网络寻址、错误侦测和改错。当表头和表尾被加至数据包时,会形成信息框(Data Frame)。数据链表头(DLH)是包含了物理地址和错误侦测及改错的方法。数据链表尾(DLT)是一串指示数据包末端的字符串。例如以太网、无线局域网(Wi-Fi)和通用分组无线服务(GPRS)等。分为两个子层:逻辑链路控制(logical link control,LLC)子层和介质访问控制(Media access control,MAC)子层 -
第1层物理层
物理层(Physical Layer)在局部局域网上传送数据帧(Data Frame),它负责管理电脑通信设备和网络媒体之间的互通。包括了针脚、电压、线缆规范、集线器、中继器、网卡、主机接口卡等
2. 以太网MAC帧格式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-drjvzVQx-1598174225433)(C:\Users\RC\Pictures\Camera Roll\timg.jpg)]
在局域网中,硬件地址又称为物理地址或MAC地址(因为这种地址用在MAC帧中)
IEEE 802标准为局域网规定了一种48位的全球地址(一般都简称为“地址"),是局域网中每一台计算机固化在网卡ROM中的地址
IEEE的注册管理机构RA负责向厂家分配地址字段的前三个字节(即高位24位)
地址字段中的后三个字节(即低位24位)由厂家自行指派,称为扩展标识符,必须保证生产出的适配器没
有重复地址
3.虚拟局域网VLAN
3.1 VLAN原理
虚拟局域网VLAN是由一些局域网网段构成的与物理位置无关的逻辑组
这些网段具有某些共同的需求。每一个VLAN的帧都有一个明确的标识符,指明发送这个帧的工作站是属于哪一个VLAN。虚拟局域网其实只是局域网给用户提供的一种服务,而并不是一种新型局域网
优点
(1)更有效地共享网络资源。如果用交换机构成较大的局域网,大量的广播报文就会使网络性能下降。VLAN能将广播报文限制在本VLAN范围内,从而提升了网络的效能
(2)简化网络管理。当结点物理位置发生变化时,如跨越多个局域网,通过逻辑上配置VLAN即可形成网络设备的逻辑组,无需重新布线和改变IP地址等。这些逻辑组可以跨越一个或多个二层交换机
(3)提高网络的数据安全性。一个VLAN中的结点接收不到另一个VLAN中其他结点的帧
虚拟局域网的实现技术
-
基于端口的VLAN
-
基于MAC地址的VLAN
-
基于协议的VLAN
-
基于网络地址的VLAN
4. TCP / IP协议栈
4.1TCP/ IP 标准
4.1.1 TCP / IP 介绍
Transmission Control Protocol/Internet Protocol传输控制协议/因特网互联协议
TCP/IP是一个Protocol Stack,包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP等许多协议
最早发源于1969年美国国防部(缩写为DoD)的因特网的前身ARPA网项目,1983年1月1日,TCP/IP取
代了旧的网络控制协议NCP,成为今天的互联网和局域网的基石和标准,由互联网工程任务组负责维护
国防高级研究计划局DARPA与BBN技术公司、斯坦福大学和伦敦大学学院签约,在多个硬件平台上开发
协议的操作版本。在协议开发过程中,数据包路由层的版本号从版本1进展到版本4,后者于1983年
安装在ARPANET中。它被称为互联网协议版本4(IPv4)作为协议,仍在互联网使用,连同其目前的
继承,互联网协议版本6 (IPv6)。
4.1.2 TCP/ IP分层
共定义了四层,和OSI参考模型的分层有对应关系
RFC文档: https://www.ietf.org/rfc/rfc1122#section-1.3.3
RFC官方分为四层:
-
Application Layer
-
Transport Layer
-
lnternet Layer
-
Link Layer(media-access)
4.1.3 TCP / IP 和OSI模型的比较
-
相同点
两者都是以协议栈的概念为基础
协议栈中的协议彼此相互独立
下层对上层提供服务 -
不同点
OSI是先有模型;TCP/IP是先有协议,后有模型
OSI是国际标准,适用于各种协议栈;TCP/IP实际标准,只适用于TCP/IP网络
层次数量不同
4.1.4 TCP特性
工作在传输层
面向连接协议
全双工协议
半关闭
错误检查
将数据打包成段,排序
确认机制
数据恢复,重传
流量控制,滑动窗口
拥塞控制,慢启动和拥塞避免算法
更多关于tcp的内核参数,可参看man 7 tcp
4.1.5 TCP 包头结构
TCP包头
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lwJ2IaWU-1598174225434)(C:\Users\RC\Pictures\Camera Roll\QQ截图20200822214804.png)]
-
源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2416个,即65536
-
序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2/32个字节,就会出现序列号回绕,再次从О开始
-
确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送方:我希望你(指发送方)下次发送的数据的第一个字节数据的编号为此确认号
-
数据偏移∶表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节
-
URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效
-
ACK:表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段
-
PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中
-
RST:如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段
-
SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=O时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段
-
FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了",带FIN标志的TCP报文段称为结束报文段窗口大小:表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量,达到此值,需要ACK确认后才能再继续传送后面数据,由Window size value*Window size scaling factor(此值在三次握手阶段TCP选项Window scale协商得到)得出此值
-
校验和︰提供额外的可靠性
-
紧急指针:标记紧急数据在数据字段中的位置
-
选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-2O=40字节
TCP包头常见选项:
-
最大报文段长度MSS (Maximum Segment Size),通常1460字节
指明自己期望对方发送TCP报文段时那个数据字段的长度。比如:1460字节。数据字段的长度加上TCP首部的长度才等于整个TCP报文段的长度。MSS不宜设的太大也不宜设的太小。若选择太小,极端情况下,TCP报文段只含有1字节数据,在IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首部)。这样,网络的利用率就不会超过1/41。若ICP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成原来的TCP报文段。当传输出错时还要进行重传,这些也都会使开销增大。因此MSS应尽可能大,只要在IP层传输时不需要再分片就行。在连接建立过程中,双方都把自己能够支持的MSS写入这一字段。MSS只出现在SYN报文中。即:MSS出现在SYN=1的报文段中MTU和MSS值的关系:MTU=MSS+IP Header+TCP Header通信双方最终的MSS值=较小MTU-IP Header-TCP Header -
窗口扩大Window Scale
为了扩大窗口,由于TCP首部的窗口大小字段长度是16位,所以其表示的最大数是65535。但是随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口来满足性能和吞吐率,所以产生了这个窗口扩大选项 -
时间戳 Timestamps
可以用来计算RTT(往返时间),发送方发送TCP报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中,当发送方收到确认报文后即可计算出RTT。也可以用来防止回绕序号PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用32为表示,每2^32个序列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文
4.1.6TCP 协议PORT
详情看pdf 网络协议和管理配置
三次握手
四次挥手
-M] [-P] [-p] device [new_size]
xfs_growfs /mountpoint
范例:
```bash
#创建物理卷
pvcreate /dev/sda3
#为卷组分配物理卷
vgcreate vg0 /dev/sda3
#从卷组创建逻辑卷
lvcreate -L 256M -n data vg0
#mkfs.xfs /dev/vg0/data
#挂载
mount /dev/vg0/data /mnt/data#
4.2.4 扩展和缩减逻辑卷
扩展逻辑卷
#两步实现
#第一步实现逻辑卷的空间扩展
lvextend -L[+]#[mMgGtT]/dev/vG_NAME/LV_NAME
#第二步实现文件系统的扩展
#针对ext
resize2fs /dev/vG_NAME/LV_NAME
#针对xfs
xfs_growfs MOUNTPOINT
#一步实现容间和文件系统的扩展
lvresize -r -1 +100%FREE/dev/vG_NAME/LV_NAME
缩减逻辑卷
注意: 缩减有数据损坏的风险,建议先备份在缩减,xfs文件喜用不支持缩减
umount /dev/VG_NAME/LV_NAME
e2fsck -f /dev/VG_NAME/LV_NAME
resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]
lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME
mount /dev/VG_NAME/LV_NAME mountpoint
范例:
#第一步 取消挂载
[19:18:28 root@centos8 ~ ]#umount /data/mysql
#第二部 检查文件系统的完整性
[19:27:25 root@centos8 ~ ]#fsck -f /dev/vg0/mysql
#第三步 缩减文件系统 只支持ext4 不支持xfs
[19:28:23 root@centos8 ~ ]#resize2fs /dev/vg0/mysql 1G
#第四步 缩减逻辑卷大小
[19:34:25 root@centos8 ~ ]#lvreduce -L lG /dev/vg0/mysq1
#第五步 恢复挂载
[root@centos8 ~]#mount -a
4.2.5 跨主机迁移卷组
源计算机上
1 在旧系统中,umount所有卷组上的逻辑卷
⒉ 禁用卷组
vgchange -a n vgo
1vdisplay
3 导出卷组
vgexport vgo
pvscan
vgdisplay
4 拆下旧硬盘在目标计算机上,并导入卷组:
vgimport vgo
5 启用
vgchange -ay vgo
6 mount所有卷组上的逻辑卷
4.2.6 拆除指定的 PE 存储设备
详情看pdf----磁盘存储和文件系统管理4.2.6
4.3 逻辑卷快照
4.3.1 逻辑卷快照原理
快照是特殊的逻辑卷,它是在生成快照时存在的逻辑卷的准确拷贝,对于需要备份或者复制的现有数据临时拷贝以及其它操作来说,快照是最合适的选择,快照只有在它们和原来的逻辑卷不同时才会消耗空间,建立快照的卷大小小于等于原始逻辑卷,也可以使用lvextend扩展快照
逻辑卷管理器快照
快照就是将当时的系统信息记录下来,就好像照相一般,若将来有任何数据改动了,则原始数据会被移动到快照区,没有改动的区域则由快照区和文件系统共享
逻辑卷快照工作原理
-
在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所改变才会使用这些空间
-
当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中
-
快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的数据
由于快照区与原本的LV共用很多PE的区块,因此快照与被快照的LV必须在同一个VG中.系统恢复的时候的文件数量不能高于快照区的实际容量
快照特点:
-
备份速度快,瞬间完
-
应用场景是测试环境,不能完成代替备份
-
快照后,逻辑卷的修改速度会—定有影响
范例:
mkfs.xfs /dev/vg0/data
mount /dev/vg0/data//mnt/data
#为现有逻辑卷创建快照
lvcreate -1 64 -s -n data-snapshot -p r /dev/vg0/data #-p r 只读
#挂载快照
mkdir -p /mnt/snap
mount -o ro,nouuid /dev/vg0/data-snapshot /mnt/snap
#恢复快照(先取消所有挂载后还原)
umount /dev/vg0/data-snapshot
umount /dev/vg0/data
lvconvert --merge /dev/vg0/data-snapshot
#删除快照
umount /mnt/ snap
lvremove /dev/vg0/data-snapshot
练习
1、创建一个至少有两个PV组成的大小为20G的名为testvg的VG;要求PE大小为16MB,而后在卷组中创
建大小为5G的逻辑卷testlv;挂载至/users目录
2、新建用户archlinux,要求其家目录为/users/archlinux,而后su切换至archlinux用户,复
制/etc/pam.d目录至自己的家目录
3、扩展testlv至7G,要求archlinux用户的文件不能丢失
4、收缩testlv至3G,要求archlinux用户的文件不能丢失
5、对testlv创建快照,并尝试基于快照备份数据,验证快照的功能
第四周 网络协议和管理
1.开放系统互联osi
1 | 应用层 | Application |
---|---|---|
2 | 表示层 | Presentation |
3 | 会话层 | Session |
4 | 传输层 | Transport |
5 | 网络层 | Network |
6 | 数据链路层 | Data Link |
7 | 物理层 | Physical |
在制定计算机网络标准方面,起着重大作用的两大国际组织是:国际电信联盟电信标准化部门,与国际标准组织(ISO),虽然它们工作领域不同,但随着科学技术的发展,通信与信息处理之间的界限开始变得比较模糊,这也成了国际电信联盟电信标准化部门和ISO共同关心的领域。1984年,ISO发布了著名的oSI(Open System Interconnection)标准,它定义了网络互联的7层框架,物理层、数据链路层、网络层、传输层、会话层、表示层和应用层),即OSI开放系统互连参考模型
osi模型的7层结构
-
第7层应用层
应用层(Application Layer))提供为应用软件而设的接口,以设置与另一应用软件之间的通信。例如:HTTP、HTTPS、FTP、TELNET、SSH、SMTP、POP3、MySQL等 -
第6层表示层
主条目:表示层(Presentation Layer))把数据转换为能与接收者的系统格式兼容并适合传输的格式 -
第5层会话层
会话层(Session Layer)负责在数据传输中设置和维护电脑网络中两台电脑之间的通信连接。 -
第4层传输层
传输层(Transport Layer)把传输表头(TH))加至数据以形成数据包。传输表头包含了所使用的协议等发送信息。例如:传输控制协议(TCP)等。 -
第3层网络层
网络层(Nelwork Layer)决定数据的路径选择和转寄,将网络表头(NH))加至数据包,以形成报文。网络表头包含了网络数据。例如:互联网协议(IP)等。 -
第2层数据链接层
数据链路层(Data Link Layer)负责网络寻址、错误侦测和改错。当表头和表尾被加至数据包时,会形成信息框(Data Frame)。数据链表头(DLH)是包含了物理地址和错误侦测及改错的方法。数据链表尾(DLT)是一串指示数据包末端的字符串。例如以太网、无线局域网(Wi-Fi)和通用分组无线服务(GPRS)等。分为两个子层:逻辑链路控制(logical link control,LLC)子层和介质访问控制(Media access control,MAC)子层 -
第1层物理层
物理层(Physical Layer)在局部局域网上传送数据帧(Data Frame),它负责管理电脑通信设备和网络媒体之间的互通。包括了针脚、电压、线缆规范、集线器、中继器、网卡、主机接口卡等
2. 以太网MAC帧格式
[外链图片转存中…(img-drjvzVQx-1598174225433)]
在局域网中,硬件地址又称为物理地址或MAC地址(因为这种地址用在MAC帧中)
IEEE 802标准为局域网规定了一种48位的全球地址(一般都简称为“地址"),是局域网中每一台计算机固化在网卡ROM中的地址
IEEE的注册管理机构RA负责向厂家分配地址字段的前三个字节(即高位24位)
地址字段中的后三个字节(即低位24位)由厂家自行指派,称为扩展标识符,必须保证生产出的适配器没
有重复地址
3.虚拟局域网VLAN
3.1 VLAN原理
虚拟局域网VLAN是由一些局域网网段构成的与物理位置无关的逻辑组
这些网段具有某些共同的需求。每一个VLAN的帧都有一个明确的标识符,指明发送这个帧的工作站是属于哪一个VLAN。虚拟局域网其实只是局域网给用户提供的一种服务,而并不是一种新型局域网
优点
(1)更有效地共享网络资源。如果用交换机构成较大的局域网,大量的广播报文就会使网络性能下降。VLAN能将广播报文限制在本VLAN范围内,从而提升了网络的效能
(2)简化网络管理。当结点物理位置发生变化时,如跨越多个局域网,通过逻辑上配置VLAN即可形成网络设备的逻辑组,无需重新布线和改变IP地址等。这些逻辑组可以跨越一个或多个二层交换机
(3)提高网络的数据安全性。一个VLAN中的结点接收不到另一个VLAN中其他结点的帧
虚拟局域网的实现技术
-
基于端口的VLAN
-
基于MAC地址的VLAN
-
基于协议的VLAN
-
基于网络地址的VLAN
4. TCP / IP协议栈
4.1TCP/ IP 标准
4.1.1 TCP / IP 介绍
Transmission Control Protocol/Internet Protocol传输控制协议/因特网互联协议
TCP/IP是一个Protocol Stack,包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP等许多协议
最早发源于1969年美国国防部(缩写为DoD)的因特网的前身ARPA网项目,1983年1月1日,TCP/IP取
代了旧的网络控制协议NCP,成为今天的互联网和局域网的基石和标准,由互联网工程任务组负责维护
国防高级研究计划局DARPA与BBN技术公司、斯坦福大学和伦敦大学学院签约,在多个硬件平台上开发
协议的操作版本。在协议开发过程中,数据包路由层的版本号从版本1进展到版本4,后者于1983年
安装在ARPANET中。它被称为互联网协议版本4(IPv4)作为协议,仍在互联网使用,连同其目前的
继承,互联网协议版本6 (IPv6)。
4.1.2 TCP/ IP分层
共定义了四层,和OSI参考模型的分层有对应关系
RFC文档: https://www.ietf.org/rfc/rfc1122#section-1.3.3
RFC官方分为四层:
-
Application Layer
-
Transport Layer
-
lnternet Layer
-
Link Layer(media-access)
4.1.3 TCP / IP 和OSI模型的比较
-
相同点
两者都是以协议栈的概念为基础
协议栈中的协议彼此相互独立
下层对上层提供服务 -
不同点
OSI是先有模型;TCP/IP是先有协议,后有模型
OSI是国际标准,适用于各种协议栈;TCP/IP实际标准,只适用于TCP/IP网络
层次数量不同
4.1.4 TCP特性
工作在传输层
面向连接协议
全双工协议
半关闭
错误检查
将数据打包成段,排序
确认机制
数据恢复,重传
流量控制,滑动窗口
拥塞控制,慢启动和拥塞避免算法
更多关于tcp的内核参数,可参看man 7 tcp
4.1.5 TCP 包头结构
TCP包头
[外链图片转存中…(img-lwJ2IaWU-1598174225434)]
-
源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2416个,即65536
-
序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2/32个字节,就会出现序列号回绕,再次从О开始
-
确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送方:我希望你(指发送方)下次发送的数据的第一个字节数据的编号为此确认号
-
数据偏移∶表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节
-
URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效
-
ACK:表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段
-
PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中
-
RST:如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段
-
SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=O时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段
-
FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了",带FIN标志的TCP报文段称为结束报文段窗口大小:表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量,达到此值,需要ACK确认后才能再继续传送后面数据,由Window size value*Window size scaling factor(此值在三次握手阶段TCP选项Window scale协商得到)得出此值
-
校验和︰提供额外的可靠性
-
紧急指针:标记紧急数据在数据字段中的位置
-
选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-2O=40字节
TCP包头常见选项:
-
最大报文段长度MSS (Maximum Segment Size),通常1460字节
指明自己期望对方发送TCP报文段时那个数据字段的长度。比如:1460字节。数据字段的长度加上TCP首部的长度才等于整个TCP报文段的长度。MSS不宜设的太大也不宜设的太小。若选择太小,极端情况下,TCP报文段只含有1字节数据,在IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首部)。这样,网络的利用率就不会超过1/41。若ICP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成原来的TCP报文段。当传输出错时还要进行重传,这些也都会使开销增大。因此MSS应尽可能大,只要在IP层传输时不需要再分片就行。在连接建立过程中,双方都把自己能够支持的MSS写入这一字段。MSS只出现在SYN报文中。即:MSS出现在SYN=1的报文段中MTU和MSS值的关系:MTU=MSS+IP Header+TCP Header通信双方最终的MSS值=较小MTU-IP Header-TCP Header -
窗口扩大Window Scale
为了扩大窗口,由于TCP首部的窗口大小字段长度是16位,所以其表示的最大数是65535。但是随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口来满足性能和吞吐率,所以产生了这个窗口扩大选项 -
时间戳 Timestamps
可以用来计算RTT(往返时间),发送方发送TCP报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中,当发送方收到确认报文后即可计算出RTT。也可以用来防止回绕序号PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用32为表示,每2^32个序列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文
4.1.6TCP 协议PORT
详情看pdf 网络协议和管理配置