终端分类:
- 设备终端
- 物理终端
- 虚拟终端[crtl+alt+f[1-6]] /dev/yyu#
- 图形终端 /dev/yyu&
- 串行终端
- 伪终端 通过ssh远程连接的/dev/pts/#
- 查看终端 # 直接通过tty查看
- 查看ip地址的命令ip addr
bash:
bash是linux系统的交互界面,提供了用户和操作系统之间的交互。他接收用户的输出,让他送给操作系统执行
- 目前的linux和mac默认的是shell
- centos默认使用
- 显示系统多行IQ那使用的shell echo $SHELL
- 查看系统所有的shell cat /etc/shells
- crtl + d 快速终止当前的连接
- 修改当前的shell chsh -s /bin/bash
# 解决ssh连接慢
grep -i "dns" /etc/ssh/sshd_config
echo "UseDNS no" >> /etc/ssh/sshd_config
systemctl restart sshd
命令提示符:
管理员 #
普通用户 $
快速登录ssh:
[root@localhost dockerfile]# grep -i "dns" /etc/ssh/sshd_config
#UseDNS yes
[root@localhost dockerfile]# echo "UseDNS no" >> /etc/ssh/sshd_config
命令:
- help 显示所有的内部命令
- 别名 alias # alias cdetc='cd /etc'
- 取消别名 unalias cdetc
- 设置别名只对当前终端起效
- 永久有效,写入写入配置文件/etc/bashrc
- 只对当前用户有效 写入~/.bashrc
- 执行命令本身
- \command
- 'command'
- "command"
- path
- 命令格式
command [options...] [args...]
command 命令本身
options:启动或者关闭命令里面的某些功能
- 长选项 --help --color
- 段选项 -l -a
args:
命令的作用体,一半情况下是目录或者文件,用户名等等
注意:
- 短选项可以合并
- 空格隔开
- ctrl + c结束命令
- 在同一行执行多个命令;隔开
- 一个命令可以在多行显示连接
获取命令的帮助信息:
内部命令:
- type echo # 判断是否是内部命令
- help echo # 查看帮助信息
- man command # 查看命令帮助信息
外部命令:
- command -h # 显示简要的信息
- command --help # 通-h
- man command
- 官方文档
[root@localhost ~]# python -h
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
[] 可选
<> 表示变化的数据
...表示列表
a|b|C 表示可选
- abc -a -b -c表示
{} 分组
man
1 Executable programs or shell commands # 用户名伶
2 System calls (functions provided by the kernel) # 系统调用
3 Library calls (functions within program libraries) # 库的调用
4 Special files (usually found in /dev) # 设备文件与特殊文件
5 File formats and conventions eg /etc/passwd # 配置文件格式
6 Games # 游戏
7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7) # 杂项
8 System administration commands (usually only for root) # 管理类的命令
9 Kernel routines [Non standard] # 内核的api
退出 q
翻屏 空格
翻行 回车
man 章节 命令
bash快捷键:
crtl + l 清屏
crtl + o 执行当前的命令,并显示当前命令
crtl + s 锁屏
crtl + q 解锁
crtl + c 结束命令
crtl + z 挂起
crtl + a 光标移动到行首相当于home
crtl + e 光标移动到行首行尾相当于end
crtl + xx 在开头和当前光标所在位置跳转
crtl + k 删除光标之后的文字
crtl + u 删除光标前的文字
alt + r 删除整行
tab:
- 补全命令
- 内部命令
- 外部命令: 根据环境变量定义的路径,从前往后依次查找,自动匹配第一查找到的内容
- 如果用户给的命令只用唯一一个匹配,则直接补全
- 如果有多个匹配,则需要再次按tab键将所有匹配的结果显示出来
- 目录补全
- 把用户给定的字符作为文件的开头,如果有唯一一个匹配则直接补全
- 如果有多个匹配,则需要再次按tab将所有匹配的结果都现实出来
linux中的引号:
[root@localhost ~]# name=alexdsb
[root@localhost ~]# echo '$name' # 单引号不转义命令和变量
$name
[root@localhost ~]# echo "$name" # 双引号不转义命令和变量
alexdsb
[root@localhost ~]# echo "wo shi `tty`"
wo shi /dev/pts/0
[root@localhost ~]# echo "wo shi $(tty)"
wo shi /dev/pts/0
历史命令:
- 可以使用上下箭头来查找之前执行过的命令
- 存放文件~/.bash_history
- 执行的命令式history
- 执行上一条命令
- 上箭头
- !!
- !-1
- ctrl + p
- 调用上一条命令的最后一个值 esc .
- !# 指定第多少条命令
- !-# 执行倒数第几条命令
- !string 执行最近一次指令的命令(从下往上)
- ctrl + r 搜索命令
- history n 显示最后条命令
- ctrl + j 取消搜索
命令展开:
seq 0 2 10
echo file{1..10} # 输出file1到10
echo file{1..10..2} # 输出file1到10,步长为2
echo:回显
echo -e "fads\nfafd"
echi -e "\a" # 提示音
查看用户登录信息:
[root@localhost ~]# whoami # 查看用户
root
[root@localhost ~]# who am i # 查看用户详细信息
root pts/0 2020-03-21 14:04 (192.168.31.16)
[root@localhost ~]# w # 显示所有的用户并显示执行的命令
14:46:04 up 1 day, 34 min, 2 users, load average: 0.06, 0.04, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.31.16 14:04 36.00s 0.36s 0.36s -bash
root pts/1 192.168.31.16 14:43 4.00s 0.07s 0.00s w
date:
[root@localhost ~]# date # 显示当前的时间
Sat Mar 21 14:47:05 CST 2020
[root@localhost ~]# date 032114502020 #修改时间 每两位代表:月日时分世纪年
Sat Mar 21 14:50:00 CST 2020
[root@localhost ~]# ntpdate time.windows.com # 同步网络时间
显示时区:
[root@localhost ~]# timedatectl
Local time: Sat 2020-03-21 14:59:21 CST
Universal time: Sat 2020-03-21 06:59:21 UTC
RTC time: Sun 2020-03-22 07:00:28
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@localhost ~]# timedatectl set-timezone Asia/Tokyo # 修改时区
日历:
cal # 显示当月日历
cal -y # 显示一年的日历
cal 2019 # 显示某一年的日历
关机:
shutdown # 关机,默认一分钟后
shutdown -c # 取消关机
shutdown -r # 重启
-time
- now 立即
- +n n分钟 之后
- hh:mm 指定时间
- 关机命令
- poweroff
- halt
- init 0
- 重启
- reboot
- -f 强制
- -p关机
- init 6重启
linux目录
文件目录结构:
- 文件和睦路备足自成一颗倒置的树装结构
- 文系统从根开始 '\'
- 文件名称严格区分大小写
- 隐藏文件以'.'开始
- 路径分隔符为'/'
文件命名规范:
- 文件字符最长为255个字符
- 包括路径在内文件名称最高位4095个字符
- 颜色标识
- 蓝色 -----文件夹
- 绿 ------可执行文件
- 红色 ------- 压缩文件
- 蓝绿色 ------ 连接文件
- 灰色 ------- 其他文件
- 白色 --- 文件
- 除了\和null,其他所有的字符都可以用作文件名
- 对大小写敏感
未见系统结构
/boot 引导文件的存放位置,内核文件、引导加载器都在此目录
/bin 所有用户都可以使用的命令
/sbin 管理类的命令
/lib 启东市程序使用的基本库文件.so结尾
/lib64 专门存放x86-64系统上的辅助库文件
/etc 存放配置文件
/home 普通用户的家目录
/root 管理员家目录
/media 便携式引动设备的挂载点
/mnt 临时文件的挂载点
/dev 设备文件,和特殊文件的存放位置
/opt 安装第三方的应用
/tmp 存放临时文件(系统一段时间会默认清空这个目录中)
/usr 存放安装程序
/var 存放日志文件
/proc 存放的是内核启动进程虚拟文件(比如进程)
/sys 输出当前系统上的一些硬件相关的文件
/srv 系统上允许的服务用到的数据
应用程序的组成
- 二进制文件
- /bin
- /sbin
- /usr/bin
- /usr/sbin
- /usr/local/bin
- /usr/local/sbin
- 库文件
- /lib
- /lin64
- /usr/lib
- /usr/lib64
- /usr/local/bin
- /usr/local/sbin
- 配置文件
- /etc
- /etc/name
- /usr/local/etc
- 帮助文件
- /usr/share/man
- /usr/share/doc
- /usr/local/share/man
- /usr/local/share/doc
绝对路径和相对路径
- 绝对路径
- 以根开始
- 完整的文件的存放位置
- 任何可以读取到任何一个文件
- 相对路径
- 不以根开始
- 相对当前的位置来决定
- 可以简短地表示一个文件或者文件夹
- .当前目录
- ..父级目录
目录名和基名:
[root@localhost log]# basename /var/log/libvirt/qemu/
qemu
[root@localhost log]# dirname /var/log/libvirt/qemu/
/var/log/libvirt
切换目录:
cd 切换目录 change directory
- 可以使用相对路径
- 可以使用绝度路径
切换到家目录:
cd + 空格 ==cd ~
切换到上一次的目录:
cd -
打印当前的工作目录:
pwd
[root@localhost lib]# pwd -P # 显示连接目录
/usr/lib
列出文件或者目录
ls list
Usage: ls [OPTION]... [FILE]...
ls -a # 显示所有文件
ls -l # 显示文件详细信息
ls -R # 递归现实目录
ls -d # 现实目录本身
ls -1 # 文件分行显示
ls -s # 按照文件大小排序
ls -r # 倒序显示
ls -t # 按照时间排序
ls -lh # 现实人类可读的方式
ls -d */ # 显示目录显得文件夹
l. # 只显示隐藏文件
linux下的目录类型
- 用来表示文件
d 用来表示目录
b 用来表示块设备
c 字符设备
l 表示符号连接文件
s socket套接字
查看文件状态
[root@localhost ~]# stat initial-setup-ks.cfg
File: ‘initial-setup-ks.cfg’
Size: 1716 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 8409160 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:admin_home_t:s0
Access: 2020-02-19 19:28:32.339929688 +0800 # 访问时间
Modify: 2020-02-19 19:28:32.339929688 +0800 # 修改时间
Change: 2020-02-19 19:28:32.339929688 +0800 # 改动时间
atime 访问时间 # 只要查看文件内容就会改变
mtime 修改时间 # 改变内容时
ctime 改动时间 # 元数据发生改变ls -l file里面的一行
touch:
创建空文件和刷线时间,如果文件存在,就刷新时间,不存在创建新文件
-a 只修改atime和ctime
-m 只修改mtime和ctime
文件通配符
- * 所有
- ?匹配的任意单个字符
- ~ 表示用户的家目录
- [234] 其中一个
- [0-9] 表示所有数字
- ls file[a-z]有坑缺少Z
- ls file[A-Z]有坑缺少a
- [:lower:] 表示小写字母
- [:upper:] 表示大写字母
- [:alpha:] 所有字母 a-zA-Z
- [:alnum:] 表示数字0-9
- [:digit:] 表示数字0-9
创建目录:
mkdir 创建目录
- p 递归创建
- v 显示详细过程
显示目录树:
yum install -y tree
tree 显示目录树
tree -d 显示文件夹
tree -dL 3 只显示3层目录
删除目录:
rmdir a/b 只能删除空目录
-p 递归删除空父目录
-v 显示删除过程
rm -rf 删除非空目录
复制文件和文件夹:
\cp copy 默认情况下是赋值,不显示提示信息,同时不覆盖原文件
\cp 源文件 目标文件
-i 显示提示信息
-n 不覆盖源文件
-f 是否覆盖提示
-r -R 递归复制
-s 快捷方式
-d 只复制连接文件,不复制源文件
-a 归档==-dR
-v 显示复制的过程
-b 备份源文件
--backup=number 备份文件加上数字
-p 保留原来的属主/组
- 如果源文件是文件的话
- 如果目标文件时文件
- 目标文件如果不存在的话,则新建目标文件,并把内容写到目标文件
- 如果目标文件存在的话,本来的命令是直接覆盖,建议使用-i来提示用户
- 如果目标是文件夹
- 再文件夹中新建一个同名的文件,并把文件内容写到新文件
- 如果源文件为多个文件的话
- 目标文件必须是文件夹,文件夹必须存在,其他情况会报错
- 如果源文件是文件夹的话
- 目标文件时文件:不可以
- 目标文件必须是文件夹:必须使用-r选项
- 如果目标文件不存在:则直接创建目标文件,并把源文件夹的数据都复制到目标文件夹
- 若果目标文件存在:
- 如果文件的话,组报错
- 如果是文件夹:则在目标文件夹中创建同名文件夹,并把所有数据都复制到新文件夹
mv 移动、重命名:
-i 提示信息
-f 强制替换
-b 备份
--backup=number 备份后面加数字
-v 现实过程
删除:
rm remove
-i 提示信息
-r 递归删除
-f 强制删除
rm -rf /* 命令慎用
连接相关:
连接:
软连接:相当于window的快捷方式
- ln -s 源文件 目标文件
- 可以对目录使用
- 指向另一个文件或者目录的路径,大小是路径长度的字符
- 对此盘的引用次数无影响
- 源文件改变,软连接文件会跟着变化
- 可以跨分区
- 源文件删除,软连接文件不能访问
硬链接:
- ln -s 源文件 目标文件
- 磁盘引用次数会发生改变
- 指向的是硬盘上的统一快区域
- 磁盘的引用次数会随着硬链接次数来增加
- 不能对目录使用
- 不能跨分区
- 源文件改变,硬连接文件会跟着变化
- 源文件删除之后,硬链接文件可以访问
引用数解释:
创建一个d1新目录为什么会有两个引用数:
- 自己引用一个自己,也就是ls -a 中的.
- 另一个就是d1目录名字本身代表依次引用
这个时候在d1中创建一个d2文件夹引用数就变成了3:
- 因为d2文件中的..引用了
查看文件类型:
file 文件
输入输出相关
输入和输出:
- 标准输入 默认来自于键盘输入 stdin 0
- 标准输出 默认输出在终端窗口 stdout 1
- 标准错误输出 默认输出到终端窗口 stderr 2
i/o重定向:
> 覆盖
- > 将标准输出重定向到文件中
- 2> 将错误输出重定向到文件中
- &> 将所有输出重定向到文件中
>> 追加
- >> 将标准输出重定向到文件中
- 2>> 将错误输出重定向到文件中
- &>> 将所有输出重定向到文件中
禁止、允许覆盖:
set -C 禁止
set +C 允许
ls f 34fad > log.log 2> error.log # 将标准的输出和错误输出分开
合并所有的输出stdin:
$> 覆盖重定向
$>> 追加重定向
command > file 2>$1 # $1的意思就是将错误输出同样写入file中
command >> file 2>$1
(ls cfsaf;ls afd) 2>a # ()代表合并多个文件的输出
(ls cfsaf;ls afd) $> /dev/null 黑洞
dd if=/dev/zero of=j bs=100M conut=2 测测判效率
从文件导入stdin:
tr 'a-z' 'A-Z' < /etc/log # 读取log文件替小写为大写
-t 截断
-d 删除
-s 去重
-c 取反
[root@localhost test]# tr abc 12 # 相同位置进行替换,不够以最后一位替换
ab
12
ac
12
bc
22
ba
21
[root@localhost test]# tr -t abc 12 # 只替换相同位置
ac
1c
[root@localhost test]# tr -d abc # 删除输入中的相同字符
fafdfsa
ffdfs
[root@localhost test]# tr -s a # 去重
aaaaaaaaccdfaf
accdfaf
[root@localhost test]# tr -sc a # 除了a以外全部去重
aaaaaaaabceeeeeeeeeeeeecddddddddddddd
aaaaaaaabcecd
[root@localhost test]# tr -dc a # 除了a以外都删除,必须使用ctrl+d结束
aaaaaaaaaaaaaaaaadfdsff
fdsfjkdfosto
aaaaaaaaaaaaaaaaa[root@localhost test]#
[root@localhost test]# tr -dc "a\n" # 解决方案
aaaaaaaaaafdf
aaaaaaaaaa
[root@localhost test]# tr -d a < e > e # 处理完成之后不能写入同名文件,要写到新的文件中
------练习将换行替为空---------
[root@localhost test]# seq 1 10 > b
[root@localhost test]# cat b
1
2
3
4
5
6
7
8
9
10
[root@localhost test]# tr -d "\n" < b > b1
[root@localhost test]# cat b1
12345678910[root@localhost test]# tr -d "\n" < b
12345678910[root@localhost test]# tr "\n" "\r" < b
[root@localhost test]# tr "\n" " " < b # 件换行替换成空格
1 2 3 4 5 6 7 8 9 10 [root@localhost test]# tr "\n" " " < b > c
[root@localhost test]# tr " " "\n" < c
1
2
3
4
5
6
7
8
9
10
多行发送给stdin:
将多行文字写入文本
# 第一种方式
[root@localhost test]# cat > f1
fdsf
fdasf
fasd
f
fasdf
# 第二种方式
[root@localhost test]# cat > f2 <<EOF # EOF可以使用其他单词替换
> f
> f
> d
> s
> EOF
管道:
管道式'|'使用:
命令1|命令2|命令3
- 把命令1的输出结果当程命令2的输入结果,把命令2的输出结果当程命令3的输入结果
- 默认情况,管道只能传输标准输出
- 如果需要吧错误输出也传输,则需要加上&
- 一般用来组合多个命令
- 有些命令不接受管道
[root@localhost test]# ls f1 | tr 'a-z' 'A-Z'
F1
ls: cannot access f: No such file or directory
[root@localhost test]# ls f | tr 'a-z' 'A-Z'
ls: cannot access f: No such file or directory
[root@localhost test]# ls f | &tr 'a-z' 'A-Z'
[root@localhost test]# ls f |&tr 'a-z' 'A-Z'
LS: CANNOT ACCESS F: NO SUCH FILE OR DIRECTORY
[root@localhost test]# echo file{1..10}|touch # 错误
touch: missing file operand
Try 'touch --help' for more information.
文本相关工具:
cat显示文本:
-E 显示结尾的$符
-n 对现实的每一行进行编号
-b 对非空行编号
-s 对练习的空行进行压缩
tac倒序显示:
less分屏显示:
向下翻一屏 空格
向下翻一行 回车
退出 q
文本搜索 /
向下查找 n
向上查找 N
less 是man命令的默认分页器
more分页显示文本:
默认情况下显示文本读取的百分比
退出 q
-d 显示翻屏和退出提示
head显示文件的前面内容:
默认显示前10行
-# 显示#行
-n # 显示#行
-c # 显示前面多少个字符
tail显示文件的后面内容:
默认显示后10行
-# 显示后面#行
-n # 显示后面#行
-c # 显示后面多少个字符,换行符也是一个字符
日志统计相关:
cut切割:
-c 按照字符切割
[root@localhost test]# tail passwd | cut -c2-5
aned
dm:x
nome
shd:
-d 指定字符切割
-f 显示第#个字段
[root@localhost test]# tail passwd | cut -d: -f1-3
saned:x:990
gdm:x:42
gnome-initial-setup:x:989
sshd:x:74
[root@localhost test]# tail passwd | cut -d: -f1,2,3
saned:x:990
gdm:x:42
gnome-initial-setup:x:989
paste合并:
默认使用tab键合并
-d 指定分割符
-s 将所有的行按照列显示
[root@localhost test]# paste -d: f1 f2
wc用来对文本进行统计:
[root@localhost test]# wc f1
9 4 36 f1
行数 单词数 字节数
-l 显示行数
-w 显示单词数
-c 显示字节数
-m 字符数
-L 显示文件中最长行的长度
sort排序:
默认按照字母排序
-r 倒序
-R 随机排序
-n 按数字排序
-f 忽略大小写
-t 指定分隔符 -t:
-k 指定第几字段进行排序 -k2
sort -t: -k3 passwd
sort -nt: -k3 passwd
uniq合并相同行:
- 相邻
- 完全一样
-c 显示重复行出现的次数
-d 只显示重复行
-u 显示不重复行
cut -d" " -f4 log.log | sort | uniq -c
diff文件对比:
[root@localhost test]# diff f2 f3
4a5
> nihao
[root@localhost test]# echo "hello" >> f2
[root@localhost test]# diff f2 f3
5c5
< hello
---
> nihao
[root@localhost test]# echo "cehi" >> f3
[root@localhost test]# diff f2 f3
5c5,6
< hello
---
> nihao
> cehi
权限相关:
chown修改所有的属主:
chown wu:wu f.txt
chown wu.wu f.txt # 修改属主和属组
chown .wu f.txt # 只修改属组
-R 递归改变
chown --reference=c d # 将d的权限改的和c一样
shgrp修改所有的属组:
chmod修改权限:
-rw-r--r--. 1 root root 21 Mar 22 14:50 b
9为表示权限
3组
3位一组
--- --- ---
- 文件权限可以都一下定义
属主u
属组g
其他o
- 每个文件的权限
r 读
w 写
x 执行
a 全部
- 对文本来说
- r可以使用文本查看工具来查看里面的内容
- w可以修改文本内容
- x执行可以./file.py
- 对于目录来说
- r 可以使用ls等文件查看的命令
- w 可以创建文件,可以删除(可以删除其他用户创建的文件)
- x 可以cd进入
- 数字表示
- 1 x
- 2 w
- 4 r
- 修改权限:
chmod u+x f1 # 修改权限
chmod u=x f1
chmod a+x f1 # 全部加上执行权限
chmod 1 f1
chmod 775 f1 # 使用数字表示
设定特殊权限
chattr +i f2 不能修改,不能删除,不能变更
lsattr
chattr -i f2
chattr +a f1 只能追加数据
文本编辑工具:
vi/vim打开文件:
vim [option] .. file
+# 直接定位到第#行
+/pattern 打开文件之后,直接定位到第一个匹配到patter的地方
-b 以二进制的方式打开
-d file1 file2 对比打开多个文件
-m 以只读方式打开
-e 直接以末行模式打开
vim模式:
- 命令模式:可以光标,可以粘贴,可以复制
- 编辑模式:可以修改文本
- 末尾行模式(扩展命令模式):保存,退出等等
- esc退出当前模式
m模式之间切换:
- 从命令模式切换编辑模式
- i 光标所在处插入
- I 回到当前光标所在行的行首插入
- a 在当前光标所在位置的后面插入
- A 在当前光标的所在的行尾插入
- o 在光标所在行的下一行(新开)插入
- O 在光标所在行的上一行(新开)插入
- 从编辑模式切换命令模式
- esc
- 命令模式-末行模式
- :
- 末行模式-命令模式
- esc esc
- esc 回车
关闭文件
- 末行模式
- :w 保存
- :q 退出
- :wq 保存并退出
- :wq!强制保存退出
- :x 保存并退出
- 命令模式
- ZZ 保存并退出
- ZQ 不保存退出
扩展命令模式:
- 按':'来进入
- :w 保存
- :q 退出
- :wq 保存并退出
- :wq!强制保存退出
- :x 保存并退出
- r file 读入文件
- w file 另存为
- !command 直接执行命令
- r! command 直接将命令结果写入文件中
命令模式
- 字符之间的跳转
- l向右
- h向左
- j向下
- k向上
- 单词间跳转
- w下一个单词的词首
- e当前词的词尾或者下一个单词的词尾
- b当前次的词首或者上一个词的词首
- # command 直接跳转#个单词
- 页面间跳转
- H 页首
- L 页尾
- M 页中
- zt 将光标所在行移动到屏幕的顶端
- zb 将光标所在行移动到屏幕的底部
- zz 将光标所在行移动到屏幕的中间
- 行首行尾之间跳转
- ^ 跳转到当前光标所在行的第一个非空字符
- 0(数字) 跳转到行首
- $ 跳转到行尾
- 行间移动
- #G 跳转到第#行
- 在命令扩展模式下,直输入#,跳转到第#行
- G 直接到最后一行
- gg 跳转到第一行
- 1G跳转到第一行
- 段落之间跳转
- { 上一段
- } 下一段
- 翻屏
- ctrl + f 向文件尾部翻屏
- ctrl + b 向文件首部翻屏
- ctrl + d 向文件尾部翻半屏
- ctrl + u 向文件首部翻半屏
命令模式编辑:
- 字符编辑
- x 删除光标所在处字符
- #x 删除光标之后的#个符
- xp 将光标所在出的字符和后面的字符互换位置
- ~ 大小写互换
- J 删除当前行的换行符
- 替换
-r b 替换当前光标所在处的字符为b
-R 进入替换模式
- 删除
- d 删除,需要更字符跳转结合
- d$ 删除到行尾, 当前位置删除
- d0 删除到行首,当前位置不删除
- d^ 删除到非空字符
- de 向后删除一个单词
- dd 删除整行
- #dd 删掉#行
- dG 删除到结尾
- dgg 删除到开头
- D 相当于d$
- 赋复制
- y 可以和字符跳转结合
- y$ 复制到行尾
- y0 赋值到行首
- y^
- yw
- ye
- yb
- yy 一整行
- #yy 复制#行
- yG 复制到结尾
- ygg 复制到开头
- Y 复制整行==yy
- 粘贴
- p 如果是整行的话,则粘贴到下一行;如果是文字就复制到,光标所在字符后面
- P 如果是整行的话,则粘贴到上一行;如果是文字就复制到,光标所在字符前面
- 改变,删除之后并将模式变为插入模式
- c可以和光标的跳转做结合
- cc 删除整行并插入
- c$
- c0
- c^
- cw
- ce
- cb
- #command
- C 相当于c$
- #ialexesc 将alex粘贴#次
vim搜索:
- /pattern 从当前光标往下搜索
- ?pattern 从当前光标网上搜索
- n 同命令相同的方向
- N 同命令相反的方向
撤销
- u 撤销修改
- #u 撤销修改n次修改
- ctrl + r 撤销之前的撤销动作
- . 重复最后一次操作
- #. 最后一次操作重复执行#次
命令扩展模式:
地址定界:
- :start,end
- # 具体到第#行
- # ,# 第#行到第#行
- #,+n从第#行开始,到第#+n行结束:1,+2 == 1,3
- . 表示当前光标坐在的这一行
- $表示倒数第一行
- $-1表示倒数第二行
- %表示全文
- /part1/,/part2/从第一个part1匹配到的地方,到part2第一次匹配到的那一行
- ./part/ 从第#行开始,到第一次被part匹配到的地方
- /patter/,$ 从第一次被pat匹配到地方到结尾
- d
- y
- w file 重新另存为文件
- r file 将文件内容写到匹配的下一行
查找并替换:
- s 在扩展命令行模式下使用替换
- 格式: /s/要查找的内容/要替换的内容/装饰器
- 要查找的美容可以使用正则
- %s/g...s/123/i
- 替换的内容不能为正则
- 可以为分足额:%s/\(nfs.*\)/#\1/
- \1 表示第一个分组内的内容
- \2
- \3
- $ 可以到表前面匹配到的内容
- 装饰器
- i 忽略大小写
- g 全部替换
- gc 每次替换之前都要询问是否替换
- 分隔符
- 分隔符可以使用#、\、@
可视化:
- v 面向字符的
- V 面向行的
- ctrl + v 面向块
- 可以结合所有跳转键
- 对突出显示的部分可以使用删除、替换、变更、赋值、另存为...
打开多个文件:
vim file1 file2 file3
: next 下一个
:prev 上一个
:first 第一个
:last 最后一个
:qall 退出全部
:wall 保存全部
:wqall 保存并退出全部
:xall 保存并退出全部
使用多个窗口:
vim -o file 水平分屏
vim -O file 垂直分屏
切屏 ctrl + w
单文件切割:
ctrl + w, s 水平切割
ctrl + w, v 垂直切割
ctrl + w, q 取消相邻的窗口
ctrl + w, v 取消全部的窗口
vim工作特性:
配置文件
- 全局有效:/etc/vimrc
- 对当前用户有效:~/.vimrc
- set nu # 显示行号
- set nonu # 取消行号
- 忽略大小写(搜索) set ic取消set noic
- 自动缩进(同上一行) set ai 取消 set noai
- 高亮显示(搜索到内容) set hls 取消 set nohls
- 语法高亮 syntax on 取消 syntax off
- 文件格式
- windows 格式 set fileformat=dos
- linux 格式 set filefromat=unix # filefromat==ff
- 添加标示线:set cul 取消表示线 setnocul
- 获取帮助信息
- :help
- vimtutor
查找find:
fiind:
linux中的一个实时查找工具,通过制定路径完成文件查找
find 【option】... [查找路径] [查找条件] [处理动作]
查找路径:查找的位置,默认是当前文件夹
查找条件:制定查找的标准,文件名,大小,类型,日期等等
处理动作:对符合条件的文件做什么操作,默认是输出在屏幕上
查找条件
- 根据文件名称查找
- -name filename # 按名称
- -iname filname # 忽略大小写
- -links n # 引用次数为n的文件
- -regex "./a" # 后面需要根完整路径,而不是文件名,必须整个路径完全匹配
- 根据属组和属主查找
- -user username # 查找属主为username的文件
- -group groupname # 查看属组为groupname的文件
- -uid id # 根据用户id查找文件
- -gid id # 根据用户组id查找文件
- -nouser # 查找所有没有属主的文件
- -nogroup # 查找所有没有属组的文件
- 指定层级
- find -mandepth 2 -name a 最大搜索深度,指定的目录为第一层
- -mindepth level 最小的搜索深度,包括level
- 根据文件类型 -type
- b 目录
- f 文件
- l 符号链接
- s 套接字
- b 块设备
- c 字符设备
- p 管道文件
- 查找空文件或者空目录
- -empty
- 条件
- -a 与 # 默认
- -o 或
- -not 非
- 摩根定律
- 非(a或b) 非a且非b
- 非(a且b) 非a或非b
- 排除目录
- -path # find /etc \(-path "/etc/ssh.d" -prune -a -path "/etc/sshd"\) -prune -o -name "*.config"
[root@localhost ~]# find /etc -name *_config
/etc/ssh/ssh_config
/etc/ssh/sshd_config
[root@localhost ~]# find /etc -path /etc/ssh -name *_config
- 按照大小查找
- -size # (#-1, #] 不包括#-1,包括#
- -size -# [0, # -1] 包括#-1
- -size +# (#, ...) # 都不包括
- 按照时间查找
- -atime # [# ,#+1)
- -atime -# (0,#) 表示查的是#天之前的文件
- -atime +# (#+, ...) 表示查的是#天之后的文件
- 查找7天以后的日志文件 find -atime +7
- -mtime
- -ctime
- 以分钟为单位
- -amin
- -mmin
- -cmin
# find -atime a
# mkdir -p a/{a,b}/{a,b}/{a,b}
# find / -empty -type b
dd if=/dev/zero of=j bs=100M conut=2
处理动作:
-print 默认处理动作,显示在屏幕上
-ls 类似于ls -l 显示长格式 # find -size 2M -ls
-delete 删除查找到的文件 # find -size 2M -delete
-fls file 将查找到的结果保存在文件中 # find -size +2M -fls ace.txt
-ok command {} \; 对每个查找到的文件执行command命令,在执行命令之前显示确认信息; # find -size +2M -ok ls {} \;
-exec command {} \; 对每个查找到的文件执行command命令,在执行命令之前不显示确认信息,一次性交给后面的命令处理; # find -size +2M -exec ls {} \;
xargs:
- 有的命令不支持管道 # echo file{1..10000000} |xargs toouch
- 命令参数过长
- xargs将管道前面的内容一条一条的交给后面的命令去处理
- 一半会跟find使用
linux三剑客
grep
awk
sed
# echo $? 查看命令的执行结果
grep:
grep [option] 模式 file
--color=auto # 对匹配到的行加上颜色
-v 取反
-i 不区分大小写
-n 显示行号
-c 打印匹配到的行数
-o 只显示匹配到的文字
-q 静默模式
-A # 向下显示#行
-B # 向上显示#行
-c # 上下分别显示#行
-e 且 # grep -e "user" -e "nfs" passwd
-E 扩展正则表达式
-F 不使用正则表达式
-r 递归
-w 匹配整个单词
正则表达式元字符:
- 字符匹配
- . 任意单个字符
- [] 匹配指定返回内中的任意单个字符[0-9][a-z][A-Z]
- [^] 取反
- [:upper:] 大写字符
- [:lower:] 小写字符
- [:alnum:] 字母和数字
- [:alpha:] 大小写字母
- [:digit:] 数字
- [:black:] 空白
- [:punct:] 标点符号
- 匹配次数
- * 任意次数
- .* 任意字符任意次数
- \? 表示0或者1次
- \+ 表示1或者n次
- \{n\} 表示n次
- \{m,n\} 表示最少m,最多n次
- \{m,\} 最少n次
- \{,n\} 最多n次
- 位置锚定
- ^ 开头
- $ 结尾
- ^$ 空行
grep -v '^#' /etc/ssh/sshd_config| grep -v "^$" # 显示不以#开头,不是空行的
- 分组
grep "\(c\|C\)at" a
- 向后引用
grep "\(l..e\).*\1" # lovefafsdflove或者likefasdfsglike
\1 # 前面第一个括号出现的内容匹配完成之后在后面在出现一次
\2 # 前面第二个括号出现的内容匹配完成之后在后面在出现一次
- 扩展正则表达式
-E 使用扩展正则表达式,不需要转义字符
压缩文件:
gzip:
gzip [option] file
-c 将压缩结果输出到屏幕,保留源文件 # gzip -c passwd > passwd.gz
-1-9 指定压缩比例
-d 解压 ==ungzip
# zcat 不解压的情况下查看压缩包内容
bzip2
bzip2 [option] file
-d 解压
-k 保留原来的文件
-1-9 指定压缩比
#bzcat 不解压的情况下查看压缩包内容
# 直接压缩
# bunzip2 解压
xz:
xz [option] file
-k 保留原来的文件
-d 解压
-1-9 指定压缩比
# unxz 解压
zip;
zip [option] zipfile 要压缩的文件
zip -r network.zip /etc/sysconfig/network-scrpits
# unzip file 解压
tar:
归档:
tar cpvf etc.tar /etc/
c创建
v现实过程
f指定归档文件
p把原来的属性也带过来
-z 使用gzip压缩
-j 使用bzip2压缩
-J 使用xz压缩
--exclude 排除文件
-C 指定解压到那个目录
tar -rf etc.tar a # 追加
tar -t -f etc.tar a # 列出压缩的文件
tar xf etc.tar # 解压文件
tar zcf etc.tar.gz # gzip压缩文件
tar xf etc.tar -C /opt/ # 指定解压目录
split
分卷压缩
split -b 指定大小 文件(只能为文件) 切割后的名字(etc.tar.gz)
-d 指定后缀为数字
-a 指定后缀几位
cat 切割后的文件 > 新文件.gz # cat file[0-9] > etc.tar.gz
用户:
- 超级管理员 root 0
- 普通用户
- 系统用户:用来启动系统的一些服务和进程的用户,不可以登录
- 可登录用户:能登录系统的用户
- useradd username 创建用户
useradd:
useradd [option] username
普通用户的id是递增的,系统用户的id是递减的
-d 修改用户家目录
-g 指定用户组的id
# useradd -g alexdsb1 alexdsb2
-G指定用户的附加组
# useradd -G root,alexdsb2 alexdsb3
-k 指定复制哪个文件下的内容需要和-m一起使用
# useradd -k /etc/sysconf/network-script/ -m alexdsb4
-c 指定message,指定用户的描述信息
# useradd -c "wupeiqi love alex" alexdbs5
- N 不创建同名的组,以users为组
# useradd -N aelxdsb6
-c 创建系统用户
# useradd -c alexdsb7
-s 指定用户登陆之后的ssh
# useradd -s /sbin/nologin alexdsb8
-u 指定用户的id
# useradd -u 2000 alexdsb9
-D 显示系统的默认配置
# useradd -D -s /sbin/nologin
相关文件:
- /etc/detault/useradd 创建用户的默认配置文件
- /etc/shel/* 默认复制的文集
修改用户信息:
usermode
-c 修改描述信息
# usermod -c "alexdsb love peiqi" alesdsb3
-d 修改家目录,默认不会创建新目录,如果想移动家目录则需要使用-m属性
# usermode -d /opt/alexdsb6 alexdsb6
-m 移动家目录
# usermode -dm /opt/alexdsb6 alexdsb6
-g 修改用户的组
# usermode -g root alexdsb6
-G 替换用户的附加组,和-a一起使用是追加
# usermod -G root,alexdsb13 alexdsb6
-a 追加附加组,与-G连起来使用
# usermod -a -G alexdsb11 alexdsb6
-l 修改登录名字
# usermod -l mjj alexdsb6
-L 锁定用户,限制登录(修改密码默认解锁)
# usermod -L mjj
-U 解锁用户
# usermode -U mjj
-s 修改登陆后的shell
-u 修改用户的id
# usermod -u 1020 alexdsb
-e 设置失效日期
# usermod -e 2019-12-1 alexdsb
删除用户:
userdel [option] username
默认删除用户删除用户的家目录
# userdel alexdsb2
-f 强制删除(默认情况下,用户登录状态下不能删除,-f可强制删除,已登录用户还是可以使用)
# userdel -f alexdsb2
-r 删除用户家目录
# userdel -r alexdsb2
查看用户相关信息id:
-g 只打印组id
# id -g alexdsb6
-G 只显示附加组id
# id -G alexdsb6
-u 只显示用户id
# id -u alexdsb6
-n 显示名称,需要和gGu配合使用
# id -un alexdsb6
切换用户:
su [options] [-] [USER [arg]...]
切换用户的方式:
- 完整切换:su - username 登录时切换,环境变量等都会切换
- 不完整切换:su username 登录时切换,环境变量等不会切换
- root切换其他用户不需要使用密码,非root切换需要密码
切换用户执行命令:
# su - peiqi -c 'whoami'
执行root的命令:
- sudo执行一些自己不能执行的命令
修改vim /etc/sudoers 加上当前用户,就可以执行root的命令sudo,其中的NOPASSED是不需要输入密码
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
xiaoming ALL=(ALL) NOPASSED:ALL
/etc/passwd:
whatis passwd # 参看man的配置文件
- 用户名
- 密码位
- uid
- gid
- 描述信息
- 家目录
- 登陆后的shell
设置密码:
passwd [OPTION...] <accountName>
-d 删除用户密码,删除之后不能登陆
-l 锁定用户
-u 解锁
-e 在下次登陆之后强制用户登录密码
-f 强制操作
-x maxdays 密码的最长使用时间(在这期间可修改)
-n mindays 密码的最短使用时间(在这期间不可修改)
-w days 密码过期前多长时间提醒
-i days 密码过期之后多长时间禁用
--stdin 从标准输入读入密码 # echo “123” | passwd --stdin 佩奇
密码存放文件
- 用户名
- 密码($加密方式,默认sha512$盐$加密后的字符串$)
- 从1970年1月1日,修改密码的时间
- 密码的最短使用时间(0表示随时可以修改)
- 密码的最长使用时间(9999表示永久有效)
- 密码过期过长时间提醒,默认一周
- 密码过期多长时间锁定
- 从1970年1月1日,多长时间失效
密码的复杂性策略:
- 必须包括数字,大小写,特殊字符
- 密码必须12位以上
- 不能为弱口令
- 必须为随机密码
- 三个月修改一次
免密登陆
ssh-keygen 生成秘钥,一路回车
ssh-copy-id [email protected][要登录的ip]
修改用户密码策略:
-E
-I
-m
-M
-W
chage login 可以使用交互式的设置密码策略
Changing the aging information for xiaoming
Enter the new value, or press ENTER for the default
Minimum Password Age [0]: # 最短几位
Maximum Password Age [99999]: # 最长几位
Last Password Change (YYYY-MM-DD) [2020-03-25]: # 上一次修改时间
Password Expiration Warning [7]: # 过期时间
Password Inactive [-1]: # 过期后多久禁用
Account Expiration Date (YYYY-MM-DD) [-1]: # 过期时间
个人描述信息:
chfn
用户组:
- 超级用户组
- 普通用户组
- 系统用户组
- 可登录用户组
groupadd [option] GrouP # 、/etc/group 存放组文件
-r 创建系统用户组
# groupadd -r alexdsb11
-g 指定组id
# groupadd -g 1010 alexdsb11
族文件
- 组名
- 密码占位
- gid
- 组成员
/etc/gshadow:
- 组名
- 密码
- 组管理员的密码
- 组成员
修改组信息:
groupmod
-g 修改gid
-n 修改组名
删除组:
groupdel 删除组
软件安装:
windows exe
centos (redhat) rpm
rpm: radhat package manager
rpm
yum
命名规范:
Mysql-python-1.2.5-1.e17.x86_64.rpm
名称-版本(大版本.小版本.修订版)-打包版本.可用的系统.架构.rpm
- 架构
x84_64
x86
i386
i486
i686
ppc
noarch 表示通用
包的来源:
- 光盘
- 第三方网站
- 官方网站
- 自己做
rpm包的查询
rmp -q filename 查询指定的包是否安装
-a all 表示当前系统安装的所有的包
-f filename 查询指定的文件由那个包生成
-c filename 查看指定的包生成了那些配置文件
-d filename 查询直飞你改的包生成了那些文档
-i 查询指定的包的详细信息
-l filename 查询指定的包生成的文件
常用选项:
-qi
-qa
-ql
-qc
-qd
yum:
yum 会自动解决依赖关系
仓库 存放的是 多个包和包的元数据信息(所在仓库,依赖关系)
仓库位置:
http://
https://
ftp://
file://(本地文件)
配置文件(/etc/yum.repos.d/)
yum配置文件:
[contrib] # 名称
name=CentOS-$releasever - Contrib - mirrors.aliyun.com # 描述信息
failovermethod=priority # 定义挑选顺序priority按顺序,roundrobin随机
baseurl=http://mirrors.aliyun.com/centos/$releasever/contrib/$basearch/
http://mirrors.aliyuncs.com/centos/$releasever/contrib/$basearch/
http://mirrors.cloud.aliyuncs.com/centos/$releasever/contrib/$basearch/
gpgcheck={0|1} # 是否校验,1启用,0禁用,使用gpgkey效验
enabled={0|1} # 是否启用,1启用,0禁用
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
# $releasever 发行版
# $basearch 系统架构
yum源:
- 阿里
- 清华
- 163
- sohu
- 腾讯
- 北大
- 中科院
yum命令:
- yum repolist 查看仓库
- yum list 列出仓库里面所有的包,安装的包前面带@符号
- yum install 包 安装包
- yum reinstall 包 重新安装
- yum update 代表所有更新包
- yum update pkg 更新制定的包
- yum downgrade pkg 降级包
- yum check-update pkg 检查包是否可以更新
- yum remove pkg 卸载包
- yum info pkg 现实包详细信息
- yum clean all 删除元数据信息
- yum makecache 重新构建元数据信息
- yum search 关键字 搜索软件信息(包名称,描述信息只要包含就可以搜索出来)
- yum provides ssh 搜索命令是由哪个包提供的
磁盘管理:
查看磁盘空间的占用
df
df -h # 显示人类易读的方式
linux下磁盘命名格式
/dev/sd[a-z]
查看目录的占用空间
du
-s # 查看目录
-h # 显示人类易读的方式
# du -sh /* 查看/根目录下的哪个目录比较大
dd:
dd if=/dev/zero of=file bs=size count=number
if = input file 表示从inputfile里面读取内容
os = ouput file 表示将独处的数据写到什么地方去
bs = bytes size 可以使K,M,G,T,
RAID阵列卡:
- raid0:两块磁盘,每次尽量轮换写入
- 读写效率有所提高
- 可用空间N(磁盘的个数)* 每一块的大小
- 没有容错能力
- 最少两个
- raid1:两块磁盘写相同的数据,相当于纯备份
- 读有所提升,写性能下降
- 可用空间,所有磁盘中最小的一块大小
- 容错性提高
- 最少2,2N
- raid5:三块磁盘,两块中写入可逆数据,第三个可以放key,两个可逆数据任意其中一个,可以ton过key找回另一半数据
- 读写速度有提升
- 可用空间(N-1)*大小
- 容错能力,最多可以坏一块硬盘
- 最少3块
- raid6 四块磁盘,两块中写入可逆数据,两个可以放key,两个可逆数据任意其中一个,可以通过任意一个key找回另一半数据
- 读写速度有提升
- 可用空间(N-2)*大小
- 容错能力,最多可以坏两块硬盘
- 最少四块
- raid10
- 每组两块先实现raid1,组与组之间灾实现raid0
- 读写速度有提升
- 可用空间(N)*大小/2
- 有容错性,最多可以坏2坏
- 最少四块
- raid01
- 每组两块先实现raid0,组与组之间灾实现raid1
- 读写速度有提升
- 可用空间(N)*大小/2
- 有容错性,每组可以坏一块
- 最少四块
网络:
网络基础:
ipv4:4段 32位
网络位 + 主机位
网段:
主机:
A
子网掩码:255.0.0.0
网络位为8位
主机位为24位
# 第一位为不可变0:
0 0000001
0 1111111
1-126
127 特殊用途,回环地址
可用网段数:2^7-1
每一个网段有多少个可用主机:2^24-2
有两个不可用:
- 主机位全为0,表示一个网段
- 主机位全为1,表示一个网段里面的广播地址
私有地址:自己可以用的
10段
公有地址:都可以访问的地址
B
子网掩码:255.255.0.0
网络位为16位
主机位为16位
# 前两位固定10
10 000000 00000000
10 111111 11111111
128
191
多少个可用网段:2^14
每个网段有多少个可用主机:2^16-2
私有地址:
172.16-172.31
C
子网掩码:255.255.255.0
网络位为24位
主机位为24位
# 前三位固定:110
110 00000 00000000 00000000
110 11111 11111111 11111111
192
223
多少个可用网段:2^21
每个网段有多少个可用主机:2^8-2
私有地址:
192.168.0-192.168.255
D
作为多播地址
1110 0000
1110 1111
224
239
E
作为科研试用
# CIRD(无类域间路由)
# b类借位
网络位向主机位借位
16+5
21为网络位11个2^11 2046-2
子网掩码:255.255.11111000(248).0
# c类借位
网络位向主机位借位
24+6 30
2^2 -2
子网掩码
网络位全为1,主机位全为0
通过ip地址和子网掩码来确定属于哪个网段(按位与)
11000000 10101000 00010101
11111111 11111111 11111111 00000000
11000000 10101000 00010101 00000000
192.127.21.0
按位与
只有有0就是0,全部为1,才是1
按位或
只要有1就是1,全部为0,才是0
异或
全相同为0,不同为1
取反
-(n+1)
左移: n*2的左移次方
左移动两位,用0补齐
右移:n/2的右移次方(向下取整)
右移动两位,用0补齐
网络配置:
1.手动配置
ip
配置为简
2.自动分配
dhcp
ip:
# 增加ip地址
ip a add 192.168.21.23/24 dev ens33
# 删除
ip a del 192.168.21.23/24 dev ens33
# 增加ip地址并增加别名
ip a add 192.168.21.23/24 dev ens33 label ens33:0
# 删除
ip a del 192.168.21.23/24 dev ens33 label ens33:0
配置文件:
/etc/sysconfig/network-scripts/igcfg-filename
TYPE=Ethernet # 网库接口类型
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static # 获取ip地址的方式,可以使dhcp,static,none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33 # 网库名称
UUID=6bacc2d7-2d69-49ba-8dba-76868017f5bd # 设备唯一标识码
DEVICE=ens33 # 设备用到的文件
ONBOOT=yes # 开机是否启动
NETMASK=255.255.255.0 # 子网掩码
IPADDR=192.168.31.199
PREFIX=24
GATEWAY=192.168.31.1 # 网关
DNS1=8.8.8.8 # 这个可以在/etc/resolv.conf
HWADDR='' # mac地址
DNS配置文件:
公网域名解析的服务器地址
/etc/resolv.conf
nameserver 8.8.8.8
nameserver 114.114.114.114
nameserver 202.106.114.1
主机名:
# 获取主机名
hostname
# 设置主机名
hostname s22
# 配置文件
- /etc/hostname # centos6
- /etc/sysconfig/network # centos6
# hostnamectl
[root@localhost network-scripts]# hostnamectl s
set-chassis set-deployment set-hostname set-icon-name status
# 永久生效
- hostnamectl set-hostname s22
- 修改配置文件
ss、netstat
ss命令用来打印linux系统中的网络状态信息,可以让管理员更好地了解网络情况
- a # 左右的
- l # 监听总
- t # tcp
- u # udp
- x # unix socket文件
- p # 展示相关的程序
- n # 现实服务的端口号
常用组合 -anlp -tnlp -unlp
* ipv4 0.0.0.0 表示当前主机上的所有ip地址
:: ipv6 所有地址
解析
- 本地解析
- dns解析
- 根节点 总共13组
# 配置文件
/etc/hosts
wget
用来下载网络资源
-q 静默模式
-c 断点续传
-O filename 保存到文件
-P path 保存到指定目录
-r 递归下载
-p 现在所有的html文件
systemctl(centos7)
管理服务 service(centos6)
start name.. 启动服务
stop name.. 关闭服务
relaod name 重读配置文件 平滑重启
restart name 重启服务(会断开服务)
status name 查看状态
enable name 开机启用
disable name 关闭开机启用
systemctl list-unit-files | grep sshd # 产看服务是否开机自启动
centos6
service sshd start
chkconfig 用来管理服务的开机启动
计划任务:
定时任务 /etc/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
8 * * * * root touch /tmp/g.txt # 每天的每小时的第八分钟创建g.txt文件
8 * 16,17,18 * * root touch /tmp/g.txt # 每月16,17,18号的每小时的第八分钟创建g.txt文件
8 * 16-18 * * root touch /tmp/g.txt # 每月16到18号的每小时的第八分钟创建g.txt文件
8 * 16-28/2 * * root touch /tmp/g.txt # 每月16到28号每隔2天的每小时的第八分钟创建g.txt文件
*/8 * * * * root touch /tmp/g.txt # 每隔8分钟,从0开始重新计算
37 * 10,20,30 * 4 root echo $(date) >> /etc/g.txt # 表示的每个月的10,20,30或者每周的周四
建议:
分钟不使用*
crontab
-e # 编辑计划任务 默认写入的文件在/var/spool/cron/root
-u # 指定用户,如果不写就默认是当前的用户
-l # 列出当前用户的计划任务
-r # 删除用户的计划任务
计划任务的作用:
- 定时删除某些日指纹机
- 定时备份
- 同步时间 ntpdate
- 日志文件 /var/log/cron
- 命令最好写绝对路径
ping:
-c 指定次数
-i 时间间隔
ICMP协议
进程:
ps [options]
支持命令格式:
- unix格式:-h -e
- BSD格式:a x
- GUN长格式:--help
选项:
PID TTY TIME CMD
43151 pts/0 00:00:00 bash
43950 pts/0 00:00:00 ps
pid 终端 当前命令占用cpu的时间
a 显示所有的终端
x 包括不连接终端的进程
u 显示详细信息
f 显示进程树
K 指定排序方式,默认是递增
# ps aux K%CPU 递增
# ps aux K-%CPU 递减
o 指定显示那些字段,不能喝u同时使用
# ps ax o user,cpu,cmd
L 获取支持的选项,-o后面
# ps L
-L 显示线程
-e 相当于ax
-f 显示详细信息,相当于u
-F 显示更详细信息
-H 显示树状结构
-p 根据pid找信息
-U username 获取指定用户的信息
# ps -U xiaoming
常用选项:aux -ef -eFH
ps输出属性:
VSZ:虚拟内存(程序任务自己可以获取的)
RSS:实际得到的
psr: cpu编号
STAT:状态
%cpu cpu的占用率
%mem 内存的占用率
根据名称查询进程
pidof name
系统工具:
uptime:
16:38:50 up 1 day, 17 min, 2 users, load average: 0.00, 0.01, 0.05
当前事件 当前服务器运行时长 当前的在线用户数 cpu的负载 1分钟 5分钟 15分钟
cpu平局负载:在特定时间之内cpu运行的平均进程数,不超过cpu核心数的2倍认为是良好的
top:
首部信息:
- uptime信息 # l 显示和隐藏
- tasks:进程数,运行,睡眠数,停止数,僵尸进程 # t折叠
- cpu信息:
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.8 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
用户空间 系统空间 nice值 空闲时间 wait 硬中断 软中断 被虚拟机偷走的时间
- cpu分别显示 1(数字)
- 内存信息 m
排序方式:
默认是cpu的占用率 P
M:内存占用率
T: cpu的占用时间
退出:q
修改刷新频率:s
杀死进程:k 默认第一个
保存文件:W
选项:top
-d 刷新时间
-b 显示所有的信息
-n # 指定刷新#次之后退出
htop:
yum insatll -y htop
性能分析
free
-b 字节
-k kb
-m mb
-g gb
-h 人类易读
-c # #次刷新
vmstat:
vmstat [options] [delay] [count]
[root@localhost ~]# vmstat 1 3 每秒刷新一次,总共刷新三次
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1123524 2156 862744 0 0 2 1 13 16 0 0 100 0 0
0 0 0 1123400 2156 862744 0 0 0 0 163 181 0 0 100 0 0
0 0 0 1123400 2156 862744 0 0 0 0 197 195 0 0 100 0 0
r 正在运行的进程个数
b 阻塞队列的长度
memory:
sqpd:虚拟内存
free:空闲内存
buff: 用户buff的大小
cache:用户cache的大小
swap:
si:从磁盘交换到内存的数据速率(kb/s)
so: 从内存交换到磁盘的数据速率(kb/s)
io:
bi:从磁盘读取到系统的速率(kb/s)
bo:从系统写入到磁盘的效率(kb/s)
system:
in: 中断频率
cs:进程之间的切换频率
iostat:
磁盘的读写速度
iostat 1 # 一秒刷新一次
dstat:
yum install dstat
查看所有
-c cpu
-d 硬盘
-m 内存
-n 网络
-p 进程
-r io请求
-s swap空间
--top-cpu 显示占用进程最多的进程
--top-io 显示占用io最多的进程
--top-mme 显示占用内存最多的进程
--tcp 显示tcp的信息
--udp 显示udp的信息
iftop:
# 显示网络流量信息
yum insatll iftop
进程的管理工具:
向进程发送信号,实现对进程的管理,每个信号,对应不同的值,对应不同的含义
kill pid # 杀死进程
查询可用信号:kill -l
1.sighub # ==reload(不需要关闭程序,重新加载配置文件)
2.sigint # 终止进程,相当于ctrl+c
9.sigkill # 强制杀死进程
15.sigterm # 终止正在运行的进程
18.sigcont # 继续运行
19.sigstop # 后台睡眠
按照pid -n id号
按照名称:killall -9 sshd 或者 pkill -9 sshd
作业管理:
前台作业:一直占用终端的作业
后台作业:不占用终端的作业
让作业运行于后台:
- ctrl + z
- command + &
- 脱离终端
- nohub ping www.bai.com &>/dev/null &
- yum insatll -y screen
screen:
-list 查看所有的screen窗口
-r 编号 # 进入标号所在的进程
安全:
防火墙:
iptables 和 firewalld
iptables -L 产看防火墙策略
iptables -F 清空 防火墙
systemctl disable firewalld 开机不启动
systemctl stop firewalled
selinux:
/etc/selinux/config # 配置文件
SELINUX=disabled
setenforce 临时生效
getenforce 查看selinux状态
rhcea
rhce
rhca
虚拟环境:
virtualenv:
编译后的软件如果想删除,直接删除编译生成的目录就可以了
# 安装
pip install virtualenv -i https://pypi.douban.com/simple/
# 创建虚拟环境
virtualenv --no-site-packages django11
--no-site-packages # 创建全新的环境
--python # 指定python版本解释器
进入虚拟环境:
source django11/bin/activate
退出:
deactivate
确保环境一致:
python freeze >> requirements.txt # 将项目中使用的包做快照
切换环境安装pip install -r requiremnts.txt
virtualenvwrapper:
虚拟环境管理工具为了解决虚拟环境管理的问题,因为虚拟环境可以创建在任意目录
1.pip install virtualenvwrapper
2.vim ~/.bashrc 文件
添加:
export WORKON_HOME=~/Envs # 虚拟环境目录
export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages' # 创建纯净的环境
export VIRTUALENVWRAPPER_PYTHON=/opt/python36/bin/python3 # 指定解释器版本
source /opt/python36/bin/virtualenvwrapper.sh # 重新加载
3.完成之后:
source .bashrc
4.mkvitualenv django11 # 创建并切换
5.workon django11 # 进入虚拟环境
6.cdvirtualenv # 切换到虚拟环境目录
7.cdsitepackages # 切换到当前虚拟环境的第三方包的文件夹
8.deactivate # 退出
9.lsvirtualenv # 列出当前所有的虚拟环境
10.lssitepackages # 列出当前虚拟环境所有的第三方包
11.rmvirtualenv django11 # 删除虚拟环境,必须退出才能删除当前虚拟环境
数据库mariaDB:
centos7中的mysql被mariaDB代替。
下载 :
wget https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.18-linux-glibc2.12-i686.tar.xz
解压:
tar xf mysql-8.0.18-linux-glibc2.12-i686.tar.xz
安装:
yun install -y *.rpm
默认安装位置:
vim /etc/my.cnf # 可以在这里面修改安装目录
mkdir -p /mydata/mysql
chown mysql -R /mydata/mysql
systemctl start mysqld
setenforce 0
日志文件:
/var/log/mysqld.log
初始化密码:
默认密码在:
grep "pass" /var/log/mysqld.log
mysql_secure_installation
输入root密码
是否要修改密码
是否要修改root密码(大小写,数字,特殊字符)
是否要删除匿名用户
是否禁止远程登录
是否删除test数据库
是否刷新表的权限
设置密码的校验规则
# 设置密码的校验规则
set global validate_password_policy=0,1,2
0 校验级别最低,只效验密码的长度,长度可设定
1 必须包括大写字母,小写字母,数字,特殊字符
2 必须满足上面两条,并追击,对于密码中任意连续的4个(或者4个以上)字符不能是字典中连续的字符
set global validate_password_length=3; # 修改密码的字段长度
flush privileges; # 刷新权限
创建用户:
create user 'username'@'ip' identified by 'password';
全部ip就是%
查看权限:
show grants; # 显示所有用户的权限
show grants allex;# 显示指定用户的权限
用户授权:
grant all on *.* to 'alex'@'%' identified by '1234';
mysql主从:
# 主服务器上配置如下:
vim /etc/my.conf
server-id=1 # 设置id
log-bin=/mydata/log/maste-bin # 启动binlog日志
sync_binlog = 1 # 设置主从复制事务安全
# 主服务器执行如下sql
set globa validate_password_policy=0;
set global validate_password_length=3;
grant replication slave on *.* to "slave"@'192.168.21.131' identified by '1234';
fulsh privileges;
# 从服务器配置文件
vim /etc/my.conf
server-id=12
relay_log=/mydata/log/slave-log
sync_binlog = 1
read-only=ON
show master status\G;
systemctl strat mysqld
# 从服务器执行如下sql
# help change master to
CHANGE MASTER TO
MASTER_HOST='192.168.21.128',
MASTER_USER='slave',
MASTER_PASSWORD='1234',
MASTER_PORT=3306,
MASTER_LOG_FILE='master2-bin.001',
MASTER_LOG_POS=4,
MASTER_CONNECT_RETRY=10; # 监控主服务的时间
# 连接主库
change master to master_host='192.168.21.168' master_user='slave' master_password='1234';
# 启动进程,这里的时候可能会出现问题,uuid的问题,复制错误去百度
start slave;
# 查看状态
show slave status\G;
数据库备份:
mysqldump
- 锁边
- 备份特别慢
- 不可以做增量备份
- 单线程
-A # 所有的库
-B # 指定备份的库,可以写多个
-F # 备份前,刷新日志
--flush-privileges # 刷新授权表
-p # 密码
-u # 用户
-P # 端口
触发器
存储过程和存储函数
##备份
mysqldump -uroot -S /mydata/mysql/mysql.sock -A -p > mysql.sql
## 恢复1
直接在数据库里面source mysql.sql文件
##恢复2
msyql -uroot -p < mysql.sql
xtrabcakup:
- 支持多进程
- 支持增量备份
- 锁行
yum install 官网的rpm包
yum list | grep xtrabackup
yum install -y # 找到2.4的那个安装,8.0的需要和mysql8.0对应
--target-dir=name # 指定备份生成的目录
--backup 备份
--prepare 准备
--database=name 数据库
--database-file 数据库配置文件
准备:
1.创建一个用户
create user 'backup'@'%' indentified by 'backup';
grant rel0ad,lock tables,process,replcation client on *.* to 'backup'@'%';
2.xtrabackpu --backup --tartget-dir=/data/backup/base -ubackup -pbackup --socket=/mydata/mysql/mysql.sock
3.删库
4.回复
1.生成回复文件
xtrabackup --prepare --targe-dir=/data/backup/base
2.将回复文件拷贝到mysql的目录下数据就恢复了
xtarbackup --copy-base --target-dir=/mydata/backup/base
# cd /mydata/backup/base 注释的两句可能有问题
# cp -rf hello /mydata/mysql
chown mysql.mysql /mydata/mysql/hello/ -R
5.回复全部
在你的数据目录下:
xtarbackup --copy-back --target-dir=/mydata/backup/base
chown mysql.mysql * -R
6.增量备份(只能删除全部数据之后回复)
1.创建增量备份
xtarabckup --backup --target-dir=/mydata/backup/s1 --incremental-basedir=/mydata/backup/base -ubackup -pbackup --socket=/mydata/mysql/mysql.sock
incremental-basedir # 全备份的路径,就是你在哪个的备份的基础上进行增量备份
2.xtarabckup --backup --target-dir=/mydata/backup/s2 --incremental-basedir=/mydata/backup/s1 -ubackup -pbackup --socket=/mydata/mysql/mysql.sock
incremental-basedir # 上一次增量备份的目录
3.恢复
xtarbackup --prepare --apply-log-only --target-dir=/mydata/backup/base
xtarbackup --prepare --apply-log-only --target-dir=/mydata/backup/base --incremental-dir=/mydata/backup/s1
xtarbackup --prepare --apply-log-only --target-dir=/mydata/backup/base --incremental-dir=/mydata/backup/s2
4.复制base里面的数据到数据库目录
xtarbackup --copy-back --target-dir=/mydata/backup/base
chown mysql.mysql * -R
systemctl restart mysqld
nginx:
web服务 apache lls
django web 框架
lvs 负载均衡 章文松博世
vue
nginx.org上面下载
安装:
1.wget http://nginx.org/
2../configure --prefix=/opt/nginx --with-http_ssl_module --with-http_stud_status_moudle
可能报错:可以安装一个develope的包组
yum install -u gcc pcre-devel zlib2-devel openssl-devl
3.make && make install
目录结构:
conf 配置文件
log 日志文件
html 静态文件
sbin 二进制文件
启动以后会生成一个主进程,根据配置文件的选项来生成子进程(工作进程),主进程不负责处理用户请求,用来转发用户请求,真正负责处理用户请求的是子进程。
命令格式:
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit# 现实版本加上编译时的选项
-t : test configuration and exit # 测试配置问阿金
-T : test configuration, dump it and exit
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload # 发送,信号
-p prefix : set prefix path (default: /opt/nginx1-12//) # prefix
-c filename : set configuration file (default: conf/nginx.conf) # 配置文件
-g directives : set global directives out of configuration file
配置文件:
#user nobody; # 使用哪个用户启动子进程
worker_processes 1; # 工作进程的个数,配置为核心数-1或者-2
# cpu的亲缘性绑定,让nginx的紫禁城工作在哪个核心上
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
use [epoll|select|poll]
worker_connections 102400; # 每个子进程可以处理的连接数
}
http {
include mime.types; # 导入
default_type application/octet-stream; # 默认的请求方式
# 定义日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 定义日志并定义使用格式
access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; # 长连接超时时间
#gzip on;
server {
listen 80; # 监听端口
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html; # 指定静态文件地址
index index.html index.htm; # 指定index页面
}
#error_page 404 /404.html; # 错误页面
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; # 服务端错误
location = /50x.html {
root html;
}
location /status {
stub_status on;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
404页面:
error_page 404 /404.html
root和alias却别:
location /img {
root /data/img
}
root /data/img 中必须再创建一个img目录
location /img{
alias /data/img
}
alias /data/img 中不需要创建img目录
域名:
server {
server_name www.test.com test.com www.baidu.com; # 配置域名,需要在hosts文件中配置域名解析
}
多域名访问(虚拟主机):
基于ip
基于端口
基于域名的
# 就是写多个server就可以了:
server{
listen 80 default_server;
server_name www.tao.com;
location / {
root /data/taobao
index index.html
}
}
server{
listen 80;
server_name www.jingdong.com;
location / {
root /data/jingdong
index index.html
}
}
默认server:
listen 80 default_server;
nginx日志:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
remote_addr # 就是访问的ip
remote_user # 访问的用户
time_local # 本地时间
request # 请求方式,地址,请求协议版本
status # 状态码
body_bytes_setn # 方法的大小
http_referer # 来源地址ip
http_user_agent # UA请求头
http_x_forwarded_for # 有代理时的真实ip地址
禁止访问:
deny 192.168.21.128; # 禁止ip
deny 192.168.21.0/255.255.255.0; # 禁止网段
允许访问ip:
# server/location中
deny 192.168.21.128; # 禁止ip
allow 192.168.21.131; # 白名单
deny 192.168.21.0/255.255.255.0; # 禁止网段
日志:
server{
access_log logs/taobao.log
}
server{
access_log logs/jingdong.log
}
默认是在logs中的access.log文件中
反向代理和正向代理:
# 保护网站
# 可以缓存静态文件
# 可以实现负载均衡 F5 A10 lvs haproxy nginx
正向:代理的你要访问的服务器(比如vpn)
反向:代理的是用户
负载均衡:
upstream django {
server 192.168.21.128:81;
server 192.168.21.131:80;
}
server {
server_name wwww.taobao.com; #访问这个域名的时候转发到proxy_pass上
proxy_pass http://django;
}
应
表
会
传
网
数
物
权重:
# weight
upstream django {
server 192.168.21.128:81 weight=3;
server 192.168.21.131:80;
}
128访问3次,131才会访问1次。
ip_hash:
# ip_hash
upstream django {
[ip_hash]
server 192.168.21.128:81;
server 192.168.21.131:80;
}
根据请求的ip的hash运算,这样每个固定的访客都会被负载到后端的固定的机器
backup:
upstream django {
server 192.168.21.128:81;
server 192.168.21.131:80;
server 192.168.21.131:82 backup;
}
server {
listen 82;
location / {
root /data/backhtml;
index index.html;
}
}
mkdir /data/backhtml
grep '/data' /etc/nginx/nginx.conf
echco 'backup' >> /data/backhtml>index.html
system restart nginx
当前面的都访问不到,则请求backup的备份,只要一个通走backup。
nginx location的匹配规则:
# 精确匹配/,后面不能有其他的
location = / {
[configuration A]
}
# 所有已/开头的地址
location / {
[configuration A]
}
# 只匹配/documents/
location /documents/ {
[configuration A]
}
# 匹配以/images/开头
# ~严格大小写
location ^~ /images/ {
[configuration A]
}
# 以(gif|jpg|png)结尾的文件
# ~* 不区分大小写
location ~* \.(gif|jpg|png)$ / {
[configuration A]
}
优先级:
= > 完整路径 > ^~ > /
location分离:
server {
listen 80;
server_name www.taobao.com;
location / {
proxy_pass http://192.168.21.131:82;
}
location ~* \.(gif|jpg|png)$ / {
root /data/img;
}
}
status:
# ab压力测试
location /status {
stub_status on;
}
gzip:
gzip on;
提高相应速度,节省带宽
wsgi:
django自带的wsgiref在调试模式下使用的wsgi的文件,网管接口
uwsgi: 协议
WSGI:协议
uWSGI: HTTP服务器
uwsgi:
安装:
通过epel源安装软件时:yum install -y epel_*
pip3 install uwsgi -i https://pypi.douban.com/simple/
启动:
cd django目录
uwsgi --http :8000 --module mysite.wsgi
1.uwsgi配置文件启动:
cong
py
cnf
lxm
json
ini
yaml
[uwsgi]
http = :8000
chdir = /data/mysite
wsgi-file = mysite/wsgi.py # uwsgi文件
virtualenv = /root/env # 虚拟环境
process = 3 # 进程个数
threads =2 # 线程个数
daemonize = /data/mysite/django.log # 指定日志的输出,后台启动
vacuum = true # 清除临时文件
py-autoreload = 1 # 支持热加载,自动刷新修改后的文件
# 配置文件启动:uwsgi --ini /etc/uwsgi.ini
nginx配置文件代理uwsgi:
server {
listen 80;
server_name crm.oldboy.com;
location / {
proxy_pass http://127.0.0.1:8080; # 通用方式
}
location /static {
root /data/supercrm
}
}
在Django的配置中:
django静态文件:
setttings.py
STATIC_ROOT = os.path.join(BASE_DIR, "static")
python3 manage.py collectstatic # 收集静态文件
2.使用socket启动:
uwsgi.ini 文件中将http改为socket
nginx.conf改为下面:
server {
listen 80;
server_name crm.oldboy.com;
location / {
include uwsgi_params; # 就在nginx的安装目录下面
uwsgi_pass 127.0.0.1:9000;
}
location /static {
root /data/supercrm
}
}
3.sock文件启动
uwsgi.ini中
socket=/data/supercrm/super.sock
nginx配置文件
server {
listen 80;
server_name crm.oldboy.com;
location / {
include uwsgi_params; # 就在nginx的安装目录下面
uwsgi_pass unix://data/supercrm/super.sock;
}
location /static {
root /data/supercrm
}
}
使用问题:
要使用uwsgi_pass
如果是本地的话,则使用unix文件
试过不是本地的话,使用端口方式
python3 -m env django11 # 创建虚拟环境
redis:
1.可以通过yum安装,要配置epel源
yum install -y redis
2.可以编译安装
wget 。。。。
tar xf redis-5.0.5tar.gz
cd redis-5.0.5/
make
redis可执行文件:
redis-benchemark # 性能测试
redis-check-aof # 检查修复aof文件
redsi-check-rdb # 检查修复rbd文件
redis-sentinel # redis的汲取
redis-cli # redis的客户端
redis-server # redis的服务端
redis-trib.rb # 集群管理
启动redis:
./src/redis-server 默认端口是6379,默认占据终端
性能测试:
[root@localhost redis-4.0.10]# redis-benchmark -q
PING_INLINE: 61690.31 requests per second
PING_BULK: 63451.78 requests per second
SET: 57870.37 requests per second
GET: 60496.07 requests per second
INCR: 60753.34 requests per second
LPUSH: 62150.41 requests per second
RPUSH: 63532.40 requests per second
LPOP: 60240.96 requests per second
RPOP: 63371.36 requests per second
SADD: 64641.24 requests per second
HSET: 64766.84 requests per second
SPOP: 64850.84 requests per second
LPUSH (needed to benchmark LRANGE): 65104.17 requests per second
LRANGE_100 (first 100 elements): 37355.25 requests per second
LRANGE_300 (first 300 elements): 15271.84 requests per second
LRANGE_500 (first 450 elements): 11698.64 requests per second
LRANGE_600 (first 600 elements): 8809.80 requests per second
MSET (10 keys): 63051.70 requests per second
连接:
./src/redis-cli
-h IP地址
-p 端口
-s 套接字
-a 密码
-n 指定redis的库
redis的命令是不区分大小写的
redis相关命令:
ping:
用来测试redis的连接情况
info:
用来显示redis的详细信息
echo:
打印内容,测试使用
quie:
退出
select:
切换选择redis库,总共有16个,0-15
redis数据类型:
1.string
2.hash
3.list
4.set
5.zset
del:
exists:
判断一个key是否存在,存在是1,不存在是0
expire key seconds:
设置有效时间
ttl:
查看key的存活时间,-2key不存在,-1永久生效
keys pattern:
查找所有符合pattern的值,支持通配符
keys *
keys a*
keys a??
move key db:
移动当前的key到指定的db里面,成功返回1,失败返回0
pexpire key millisecongds:
给一个key设置过期时间,单位是毫秒
pttl key:
查看key的存活时间,单位是毫秒
randomkey:
随机获取一个key,默认不删除,数据库为空,返回空
rename key newkey:
给key重命名(覆盖),如果key不存在,报错not such key
renamnx key newkey:
重命名key,如果原key不存在,报错;如果目标key存在,则不变
type:
查看key所存储value的类型,如果没有这个key,返回none
string:
set:
设置key和value,如果存在就覆盖,不存在就创建
set kye newvalue
set name alex
set age 12 EX 3 # ex设置有效时间,秒
set age 12 pX 300 # px设置有效时间,毫秒
set age 12 nx # 如果不存在就创建,存在就返回nil
set age 12 xx # 只能在键存在的情况下操作
get:
获取key对应value,只能获取一个,可以存在就返回值,不存在,返回nil
mset:
批量创建key value对应关系,会覆盖已存在的key
mset k1 v1 k2 v2
mget:
批量获取key对应的值,如果不存在返回nil
getset:
获取原来的值,并设置新的值;不存在返回nil
getset k1 vv1
strlen:
返回key对应的value的长度;不存在返回0
strlen name
append:
如果key存在,则追加;如果key不存在,在新建
append name alexdsb
incr:
将key中存在的数增加(默认加1),只能对数字有效
incr age
decr:
将key中存在的数减少(默认加1),只能对数字有效
的cr age
incrby:
将key中存在的数值,指定增加多少
incrby age 100 # 指定age增加100
decrby:
将key中存在的数值,指定减少多少
decrby age 100 # 指定age减少100
getrange:
# 索引1到3的值,切片,不能使用步长
getrange alex 1 3
incrbyfloat(默认保留17位):
将key中存在的数值增加指定的浮点数(可以加负数)
incrvyfloat age 1.2
list:
lpush:插入列表头部
lpush alexlist dsb dsb1 dsb2 dsb3
lrange:获取列表元素
lrang alexlist 0 -1
lpop:
移除并返回列表key的头一个元素
rpush:
讲一个或者多个value插入到列表的尾部,不存在则创建
rpop:
删除尾部的值
rpushx:
将value插入key的尾部,key必须存在才可以
lpushx:
将value插入key的头部,key必须存在才可以
lindex:
按照索引查找,冲表头向后
linsert:
linsert alexlist before s1 ss
将value插入到key指定的元素前或者后(before、after)
llen:
获取列表长度
lren:
删除指定的key中value
- count > 0 从头向后查找,删除指定的个数
- count < 0 从后向前查找,删除指定的个数
- count = 0 全部
lrem alexlist 2 s1
lrem alexlist -1 s3
lset:
替换指定索引位置的value,如果超出范围则报错
lset alexlist 3 tobb
ltrim:
列表的切片
ltrim alexlist 4 7
hash:
{db:{redis:redis.conf, mysql: mysql.conf}}
hset:
给hash增加key value值
hset db redis redis.conf
hlen:
获取长度
hget:
获取某个hash中的key对应的filed
hget db redis
hgetall:
获取所有键值对
hmset:
批量设置
hmset sc a 1 b 2 c 3
hmget:
批量获取键值对
hmget a b c
hsetnx:
给指定的hahs增加键值对,如果存在就不改变,不存在就新增
hkeys:
获取hash表中的所有的filed
hval:
获取hash表中所有的value
hdel:
删除hash表中的一个或者多个value
hdel db redis
hexists:
判断hash表中的filed实收存在,如果存在,则为1,不存在则为0
hincrby:
给hash表中的filed增加指定的数值,只限于数字
hincrbyfloat:
给hash表中的filed增加指定的浮点值,只限于数字
set:
sadd:
给集合添加值,如果值存在,保留原值,不能再则创建
sadd s22 abc abc hongxu
smembers:
获取集合所有的成员
scard:
获取集合元素的个数
sdiff:
获取差集,前面存在,但是后面不存在的
sinter:
获取两个集合的交集
sismember:
判断是否在集合的中,存在返回1,不存在返回0
smove:
将前面的呢个集合中的指定的元素移动到后面集合中,如果源集合存在,则移动,不存在,则忽略;目标集合存在,则移动,不存在则创建集合并移动
smove s22 s23 dazahung
spop:
随机删除,指定个数的元素,并打印
spop s22 2
srangemember:
随机获取指定个数的元素
- 默认随机获取一个
- 如果count > 0
- 如果count大于集合的总数的话,全部取出
- 如果count小于结合总数的话,则随机去除count个
- 如果count < 0,则随机count的绝对值次取出值
srangemember s23 5
srem:
删除指定的一个或者多个元素
srem s22 或许
zset:
zadd :
zadd s22 100 a
zincrby:
# 给某个对象增加1
zincrby s22 1 Alice
# 查看分数
zscore s22 alice
# 获取Alice排名(从高到低)
zrevrank s22 Alice
# 获取前10名(从低到高)
zrevrange s22 0 9
# 获取前10名及对应的分数(从高到低)
zrevrange s22 0 9 withscores
# 获取总参与选手数
redis> zcard vote_activity
redis发布订阅:
SUBSCRIBE:
订阅一个或者多个频道
SUBSCRIBE msg s22
publish:
给指定的频道发送消息
PUBLISH msg fas
PSUBSCRIBE :
订阅指定模式的频道,*代表所有
PSUBSCRIBE s22.* msg.*
pubsub:
pubsub channels # 监控还有多少活跃的频道
pubsub numsub channel # 查看频道的订阅人数
redsi配置文件:
grep -v '^$' redis.cong | grep -v "^#" # 过滤空行和注释行
%s/daemonize no/daemonize yes/ # 文本替换
bind 0.0.0.0 # 监听的地址
protected-mode yes # 将reis运行在安全模式下
port 6379 # 端口
tcp-backlog 511 #
timeout 0
tcp-keepalive 300
daemonize yes # 是否后台运行
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1 # 在900秒内有一次更新,就会持久化
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb # 数据保存文件
dir ./
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
requirepass foobared # redis的密码
auth:
密码认证
save:
保存
flushall:
清空
redis主从:
cp redis.conf redis_6380.conf
只需要在从服务器上进行配置
slaveof 127.0.0.1 6379 # 设置主从配置
masterauth 123 # 配置主库密码
命令行设置方式:
config set masterauth password
- 基于异步,平局每秒钟从服务器都会嘱咐其发送复制的情况
- 一个主可以做多个从
- 不止主可以有从服务器,从也可以有从服务器
- 复制功能不会阻塞主服务器
- 复制动能也不会阻塞从服务器
redis持久化:
- rdb
- aof
rdb持久化:
优点:
- 生成二进制文件
- 系统会默认的多长时间保存一次
- 直接手动保存
- 制作快照
- 可以用做备份
- 比较适合灾难恢复
- 主进程会fork一个子进程出来,子进程用来保存数据
缺点:
- 如果说数据需要尽量的保存下来,咋不适合rdb
- 如果数据量比较大的时候,对系统的消耗过大
save 900 1 # 在900秒内有一次更新,就会持久化
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb # 数据保存文件
dir ./ # 保存目录
aof:
优点:
- 持久化更好
- aof将所有的操作都追加到一个文件,redis-check-aof
- 文件易读
缺点:
- 文件会越来越大
- aof的持久化速度会比rdb慢,aof使用的是fsync
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
直接通过命令从rdb切换到aof:
config get appendonly
config set appendonly yes
config set save ''
redis高可用:
主管下线:哨兵检测不到服务
客观下线:全部哨兵统一协商之后
redis集群:
配置文件准备:
- 16384个槽位
- 最少六个redis服务器
# 准备配置文件端口分别为7001-7006,内容如下
port 7001
daemonize yes
dir "/opt/data/conf"
pidfile '7001.pid'
logfile "7001.log"
dbfilename "sump-7001.rdb"
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 10000
cluster-require-full-coverage no
sed 's/7001/7002/g' redis-7002.conf
环境准备:
现在安装ruby,版本必须是2.2.2以上
wget ruby地址
./configure --prefix=/opt/ruby
make && makeinstall
配置环境变量
PATH=/opt/ruby/bin:$PATH
安装redis的ruby依赖:
gem install redis
安装命令:
redis-cli --cluster help
creat 创建
check 检查
info 查看集群信息
fix 修复集群
# 通过redis的所有的配置文件,启动redis,原本是redis-trb的软件,但是在某个版本reids-cli也可以用来创建集群,所以可以试着使用
redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385
redis-cli --cluster info 127.0.0.1:6380 # 查看这个redis服务器的信息
redis-cli -c -p 6380 # -c指定使用集群
添加新节点:
cp redis-6380.conf redis-6386.conf
sed -i 's/6380/6386/g'
python操作redis:
pip install redis
import redis
r = redis.StrictRedis(host='192.168.31.199', port=6379, decode_response=True)
# r = redis.Redis() # 向后兼容老版本
r.set()
r.keys()
python操作集群:
pip install redis-py-cluster
import reiscluster
nodes=[{"host": "192.168.31.1990", "port": 6380},{"host": "192.168.31.1990", "port": 6381},....]
r = reiscluster.RedisCluster(startup_nodes=nodes, decode_response=True)