35.linux学习2

终端分类:

- 设备终端
- 物理终端
- 虚拟终端[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;

1585559885555

1585559958234

1585559998987

数据库备份:

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)

猜你喜欢

转载自www.cnblogs.com/liuzhanghao/p/12693350.html