linux总结
用户登录
- root用户
- 是一个特殊的管理账号,也可以成为超级管理员
- root用户对系统有完全控制的权限
- 对系统的损害会无限大
- 在工作中,如果没有特殊的必要,尽量不要使用root
- 普通用户
- 权限有限
- 对系统的损害会小
终端
分类
- 设备终端
- 物理终端
- 虚拟终端 ctrl+alt+f[1-6] /dev/tty#
- 图形终端 /dev/tty7
- 串行终端
- 伪终端 通过ssh远程连接的 /dev/pts/#
- 查看终端的命令 tty
- 查看ip地址的命令 ip addr
交互式接口
启动终端以后,在终端设备上附加的一个应用程序
- GUI(桌面)
- CLI command line
- powershell
- sh
- bash(linux,mac默认的程序)
- zsh
- csh
- tcsh
bash
bash是linux系统的用户界面,提供了用户和操作系统之间的交互,它接收用户的输入,让它送给操作系统执行
- 目前是linux和mac上默认的shell
- centos默认使用
- 显示系统当前使用的shell echo $SHELL
- 查看系统内可以使用的shell cat /etc/shells
- ctrl +d 快速终止当前的连接
- 切换shell chsh -s shell
修改ssh连接慢的步骤
echo "UseDNS no" >> /etc/ssh/sshd_config
systemctl restart sshd
命令提示符
[root@localhost ~]#
管理员是# 普通用户时$
显示提示符格式
[root@localhost ~]# echo $PS1
[\u@\h \W]\$
\u 代表当前登录的用户
\h 代表当前主机的主机名
\W 代表当前的目录
0表示默认字体,1表示加粗,4在字体下方加下划线 5 闪烁 7 代表突出显示
31-37 字体颜色
40-47 表示背景颜色
echo 'PS1="\[\e[1;35mm\][\u@\h \W]\\$\[\e[0m\]"' >> /etc/profile.d/ps.sh #永久生效
命令
执行命令: 输入命令回车
内部命令:shell 自带的命令
- help 显示所有的内部命令
外部命令:第三方提供的命令
查看命令的类型: type
[root@localhost ~]#type echo
echo is a shell builtin
[root@localhost ~]#type top
top is /usr/bin/top
别名
- 查看当前所有的别名 alias
- 自定别名 alias cdetc='cd /etc'
- 取消别名 unalias cdetc
- 设置别名只对当前的终端有效
- 设置所有用户都可以用 /etc/bashrc
- 只对当前用户有效 ~/.bashrc
- 执行本身命令
- \command
- "command"
- 'command'
- path
命令格式
command [options.....] [args...]
command 命令本身
options:启动或者关闭命令里面的某些功能
- 长选项:--help --color
- 短选项: -i -l
args:命令的作用体,一般情况下是目录或者文件,用户名等等
注意:
- 短选项是可以合并
- 空格隔开
- ctrl+c 结束命令的执行
- 在同一行执行多个命令用;隔开
- 一个命令可以在多行显示用\连接
获取命令的帮助信息
内部命令:
- help command
- man bash
外部命令:
- command -h
- command --help
- man coomand
- 官方文档
[root@localhost ~]#python --help
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 章节 passwd
bash 快捷键
- ctrl+l 清屏 相当于clear
- ctrl+o 执行当前的命令,并显示当前的命令
- ctrl+s 锁屏
- ctrl+q 解锁
- ctrl+c 终止命令
- ctrl+z 挂起命令
- ctrl+a 光标移动到行首,相当于Home
- ctrl+e 光标移动到行位,相当于End
- ctrl+xx 在开头和当前光标所在位置跳转
- ctrl+k 删除光标后的文字
- ctrl+u 删除光标前的文字
- alt+r 删除正行
tab 键
- 命令补全
- 内部命令
- 外部命令:根据环境变量定义的路径,从前往后依次查找,自动匹配第一个查找到的内容
- 如果用户给的命令只有唯一一个匹配,则直接补全
- 如果有多个匹配,则需要在按tab键将所有匹配到的结果展示出来
- 目录补全
- 把用户给定的字符作为文件的开头,如果有唯一一个匹配则直接补全
- 如果有多个匹配,则需要再次按tab键把所有的匹配到的结果展示出来
引号
[root@localhost ~]#name=alexdsb
[root@localhost ~]#echo "$name"
alexdsb
[root@localhost ~]#echo '$name'
$name
[root@localhost ~]#echo "wo shi `tty`"
wo shi /dev/pts/2
[root@localhost ~]#tty
/dev/pts/2
[root@localhost ~]#echo "wo shi $(tty)"
wo shi /dev/pts/2
命令历史
- 可以使用上下箭头来查找之前执行过的命令
- 存放文件是~/.bash_history
- 执行的命令是history
- 执行上一条命令
- 上箭头
- !!
- !-1
- ctrl+p 回车
- 调用上一条命令的最后一个值 esc .
- !# 指定第多少条命令
- !-# 指定倒数第#条命令
- !string 用来最近一次匹配到的命令(从下往上)
- ctrl+r 搜索命令
- ctrl+g 取消搜索
- # 显示最后#条命令
命令展开
touch file{1..20}
seq 0 2 10
echo file{1..20..2}
echo 回显
echo -e 'dadasda\ndasdasd'
echo -e '\a' #播放声音
查看用户登录信息
[root@localhost ~]#whoami # 显示当前的登录用户
root
[root@localhost ~]#who am i #显示当前登录用户的详细信息
root pts/2 2019-08-22 15:54 (192.168.21.1)
[root@localhost ~]#w 显示所有的用户并显示执行的命令
16:27:54 up 5:19, 9 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty2 11:37 4:48m 0.02s 0.02s -bash
wu tty3 11:39 4:48m 0.02s 0.02s -bash
root :0 :0 11:30 ?xdm? 1:28 0.36s /usr/libexec/gnome-session-binary --session gnome-classi
root pts/0 :0 11:35 4:43m 0.03s 0.03s bash
root pts/1 192.168.21.1 12:11 4:03m 0.02s 0.02s -bash
root pts/2 192.168.21.1 15:54 2.00s 0.18s 0.03s w
wu pts/3 192.168.21.1 12:27 2:26 0.05s 0.05s -bash
date
[root@localhost ~]#date 显示当前的时间
Thu Aug 22 16:30:06 CST 2019
Usage: date [OPTION]... [+FORMAT]
or: date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
[root@localhost ~]#date 010923102018 #修改时间
Tue Jan 9 23:10:00 CST 2018
[root@localhost ~]#date
Tue Jan 9 23:10:18 CST 2018
[root@localhost ~]#ntpdate time.windows.com #同步网络服务器时间
unix元年 1970-01-01
[root@localhost ~]#date
Thu Aug 22 16:35:44 CST 2019
[root@localhost ~]#date
Thu Aug 22 16:35:47 CST 2019
[root@localhost ~]#date
Thu Aug 22 16:35:48 CST 2019
[root@localhost ~]#date +%a
Thu
[root@localhost ~]#date +%A
Thursday
[root@localhost ~]#date +%F
2019-08-22
[root@localhost ~]#date +%H
16
[root@localhost ~]#date +%I
04
[root@localhost ~]#date +%m
08
[root@localhost ~]#date +%d
22
[root@localhost ~]#date +%M
38
[root@localhost ~]#date +%h
Aug
[root@localhost ~]#date +%c
Thu 22 Aug 2019 04:38:42 PM CST
[root@localhost ~]#date +%T
16:39:01
[root@localhost ~]#date +%y
19
[root@localhost ~]#date +%Y
2019
[root@localhost ~]#date +%Y/m/%d
2019/m/22
[root@localhost ~]#date +%Y/%m/%d
2019/08/22
[root@localhost ~]#date +%s
1566463197
[root@localhost ~]#date +%W
33
显示时区
[root@localhost ~]#timedatectl
Local time: Thu 2019-08-22 16:42:43 CST
Universal time: Thu 2019-08-22 08:42:43 UTC
RTC time: Thu 2019-08-22 08:42:43
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 # 显示某一年的日历
关机重启
- shutdown 默认1分钟之后关机
- shutdown -c 取消关机
- shutdow -r 重启
- TIME
- now 立即
- +n n分钟之后
- hh:mm 指定时间
- 关机命令
- poweroff
- halt
- init 0
- 重启
- reboot
- -f 强制
- -p 关机
- init 6
- reboot
文件目录结构
- 文件和目录被组织成一颗倒置的树状结构
- 文件系统从根开始,“/”
- 文件名称严格区分大小写
- 隐藏文件以"."开头
- 路径的分隔符为"/"
文件命名规范
- 文件字符最长为255个字符
- 包括路径在内文件名称最长为4095个
- 颜色表示
- 蓝色 ---> 文件夹
- 绿色 --> 可执行文件
- 红色 --> 压缩文件
- 蓝绿色 --> 链接文件
- 灰色-->其他文件
- 白色 --> 文件
- 除了斜杠和NULL,其他所有字符都可以使用
- 对大小写敏感
文件系统结构
- /boot 引导文件的存放位置,内核文件、引导加载器都在此目录
- /bin 所有的用户都可以使用的命令
- /sbin 管理类的命令
- /lib 启动时程序使用的基本库文件 .so结尾
- /lib64 专门存放X86_64系统上得辅助库文件
- /etc 存放配置文件
- /home/USERNAME 普通用户的家目录
- /root 管理员的家目录
- /media 便携式移动设备的挂载点
- /mnt 临时文件的挂载点
- /dev 设备文件和特殊文件的存放位置
- /opt 第三方的应用的安装位置
- /tmp 临时文件的存放位置
- /usr 存放安装程序
- /var 存放经常变化的文件,比如日志
- /proc 存放内核启动和进程相关的虚拟文件
- /sys 输出当前系统上的硬件相关的文件
- /srv 系统上允许的服务用到的数据
linux应用程序的组成
- 二进制文件
- /bin
- /sbin
- /usr/bin
- /usr/sbin
- /usr/local/bin
- /usr/local/sbin
- 库文件
- /lib
- /lib64
- /usr/lib
- /usr/lib64
- /usr/local/lib
- /usr/local/lib64
- 配置文件
- /etc
- /etc/name
- /usr/local/etc
- 帮助文件
- /usr/share/man
- /usr/share/doc
- /usr/local/share/man
- /usr/local/share/doc
绝对路径和相对路径
- 绝对路径
- 以根开始
- 完整的文件的存放位置
- 可以读取到任何一个文件或者文件夹
- 相对路径
- 不以根开始
- 相对当前的位置来决定
- 可以简短的表示一个文件或者文件夹
- . 当前目录
- .. 父级目录
目录名和基名
[root@localhost log]#basename /etc/sysconfig/network-scripts/ifcfg-ens33
ifcfg-ens33
[root@localhost log]#basename /etc/sysconfig/network-scripts
network-scripts
[root@localhost log]#dirname /etc/sysconfig/network-scripts
/etc/sysconfig
[root@localhost log]#dirname /etc/sysconfig/network-scripts/ifcfg-ens33
/etc/sysconfig/network-scripts
切换目录
cd 切换目录 change directory
- 可以使用相对路径
- 可以使用绝对路径
切换到家目录
[root@localhost log]#cd
[root@localhost ~]#
切换到上一次的目录
[root@localhost ~]#cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]#cd -
/root
[root@localhost ~]#cd -
/etc/sysconfig/network-scripts
显示当前的工作目录
pwd print working directory
[root@localhost network-scripts]#pwd
/etc/sysconfig/network-scripts
# 查看链接的真正目录
[root@localhost /]#cd lib
[root@localhost lib]#pwd -P
/usr/lib
列出目录或者文件
ls list
命令格式:Usage: ls [OPTION]... [FILE]...
ls -a 显示所有文件
ls -l 以长格式显示文件列表
total 21104
-rw-r--r--. 1 root root 0 Aug 22 17:21 10
权限 硬盘的引用次数 属主 属组 大小 访问时间 文件名称
ls -R 递归显示目录
ls -d 显示目录本身
ls -1(数字1) 文件分行显示
ls -S 安装文件大小排序
ls -r 倒序显示
ls -t 按照时间来排序
ls -lh 显示人类易读的方式
ls -d */ 显示当前目录下的文件夹
l. 只显示隐藏文件
linux下的目录类型
- - 用来表示文件
- d 用来表示目录
- b 块设备
- c 字符设备
- l 表示符号链接文件
- s socket套接字
查看文件状态
File: ‘anaconda-ks.cfg’
Size: 1747 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 33574992 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:admin_home_t:s0
Access: 2019-08-22 12:09:03.288000381 +0900 # 访问时间
Modify: 2019-08-22 11:47:12.262947345 +0900 # 修改时间
Change: 2019-08-22 11:47:12.262947345 +0900 # 改动时间
atime 访问时间 查看文件内容就会改变
mtime 修改时间 改变内容发生变化
ctime 改动时间 元数据发生变化
touch
创建空文件和刷新时间,如果文件存在,则刷新时间,如果文件不存在,则创建文件
-a 只修改atime和ctime
-m 只修改mtime和ctime
文件通配符
- * 所有
- ? 匹配的是任意单个字符
- ~ 表示用户的家目录
- [123] 其中一个
- [^123] 取反
- [0-9] 表示数字
- file[a-z] 字母(有坑)缺少Z
- file[A-Z] 字母(有坑)缺少a
- [:lower:] 小写字母
- [:upper:] 大写字母
- [:alpha:] 所有字母 a-zA-Z
- [:alnum:] 表示字母和数字
- [:digit:] 表示数字
创建目录
mkdir 创建目录
- -p 递归创建
- -v 显示详细过程
显示目录树
安装:yum install -y tree
tree 显示目录树
-d 只显示文件夹
-L # 只显示#层
删除目录
rmdir 只能删除非空目录
-p 递归删除空父目录
-v 显示删除过程
rm -rf 删除非空目录
复制文件和文件夹
cp copy 默认情况下是别名,原来本身命令是不提示覆盖的
Usage: cp [OPTION]... [-T] SOURCE DEST
or: cp [OPTION]... SOURCE... DIRECTORY
or: cp [OPTION]... -t DIRECTORY SOURCE...
-i 显示提示信息
-n 不覆盖
-r -R 递归复制
-d 只复制链接文件,不复制源文件
-a 归档
-v 显示过程
-b 备份原来的文件
--backup=number 备份文件加上数字
-p 保留原来的属性
- 如果源文件是文件的话
- 目标是文件
- 目标文件如果不存在的话,则新建目标文件,并把内容写到目标文件中
- 如果目标文件存在的话,本来的命令是直接覆盖,建议使用-i来提示用户
- 目标是文件夹
- 在文件夹中新建一个同名的文件,并把文件内容写到新文件中
- 目标是文件
- 如果源文件为多个文件的话
- 目标必须是文件夹,文件夹必须存在,其他情况都会报错
- 如果源文件是文件夹的话
- 目标文件是文件: 不可以
- 目标文件必须是文件夹,必须使用-r选项
- 如果目标文件不存在:则直接创建目标文件夹,并把源文件夹的数据都复制到目标文件夹
- 如果目标文件存在:
- 如果是文件的话,则报错
- 如果是文件夹:则在目标文件夹中创建同名文件夹,并把所有数据都复制到新文件夹
移动、重命名
mv move
Usage: mv [OPTION]... [-T] SOURCE DEST
or: mv [OPTION]... SOURCE... DIRECTORY
or: mv [OPTION]... -t DIRECTORY SOURCE...
-i 提示
-f 强制
-b 备份
--backup=number 备份后面加数字
-v 显示过程
删除
rm remove
Usage: rm [OPTION]... FILE...
-i 提示
-r -R 递归删除
-f 强制删除
rm -rf 慎用
rm -rf /*
cd /
rm -rf *
链接
软链接
- 相当于windows的快捷方式
- 创建命令 ln -s 源文件 目标文件
- 可以对目录做软链接
- 指向另外的一个文件或者目录的路径,大小是路径的长度的字符
- 对磁盘引用次数没有影响
- 可以跨分区
- 源文件发生改变,软链接会跟着发生变化
- 源文件删除,软链接不能访问
硬链接
- 磁盘引用次数会发生变化
- 指向的是硬盘上的同一块区域
- 磁盘的引用数会随着硬链接次数来增加
- 不能对目录做硬链接
- 不能跨越分区
- 源文件发生改变,硬链接也会跟着变化
- 源文件删除以后,硬链接可以访问
查看文件类型
file
输入和输出
- 标准输入 默认是来自键盘的输入 stdin 0
- 标准输出 默认输出到终端窗口 stdout 1
- 标准错误输出 默认输出到终端窗口 stderr 2
I/O重定向
> 覆盖
- > 将标准输出重定向到文件中
- 2> 将错误输出重定向到文件中
- &> 将所有的输出都重定向到文件中
禁止、允许覆盖
- 禁止覆盖 set -C
- 允许覆盖 set +C
>> 追加
>> 将标准输出追加到文件中
2>> 将错误输出追加到文件中
&>> 将所有输出追加到文件中
标准输入和错误输入分开保存
[root@localhost ~]#ls f 45yuio > log.log 2> error.log
[root@localhost ~]#cat log.log
f
[root@localhost ~]#cat error.log
ls: cannot access 45yuio: No such file or directory
合并所有的输出
- &> 覆盖重定向
- &>> 追加重定向
- command > file 2>&1
- command >> file 2>&1
- ():合并多个文件的输出
- /dev/null 黑洞
从文件导入stdin
tr 字符替换
-t 截断
-d 删除
-s 压缩,去重
-c 取反
[root@localhost ~]#tr 'a-z' 'A-Z' < /etc/issue
\S
KERNEL \R ON AN \M
[root@localhost ~]#tr 'a-z' 'A-Z'
qwertyy
QWERTYY
12345678
12345678
ASDFGHJ
ASDFGHJ
qwertyuio
QWERTYUIO
^C
[root@localhost ~]#tr ab 12
ab
12
abb
122
asdfghjkl
1sdfghjkl
^C
[root@localhost ~]#tr abc 12
ab
12
abc
122
abc
122
^C
[root@localhost ~]#tr ab 123
ab
12
abb
122
avc
1vc
qbc
q2c
abc
12c
[root@localhost ~]#tr -t abc 12
abc
12c
ab
12
[root@localhost ~]#tr -d abc
qwertyui
qwertyui
an^H^H
n
abc
artyibrtyuiocrtyuiop
rtyirtyuiortyuiop
^C
[root@localhost ~]#tr -d abc < /etc/issue
\S
Kernel \r on n \m
[root@localhost ~]#cat /etc/issue
\S
Kernel \r on an \m
[root@localhost ~]#tr -s a
abc
abc
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabc
abc
^C
[root@localhost ~]#tr -sc a
aasdaaaaaaa
aasdaaaaaaa
^[[A^H^H^C
[root@localhost ~]#tr -sc a
aaaaaaaaabbbbbbbbbbbbbccccccccddddddddddd
aaaaaaaaabcd
[root@localhost ~]#tr -dc a
aaaaaaaaaaaabbbbbbbbbb
asdfghjkqwertyuiozxcvbnmxcvbnm,.
aaaaaaaaaaaaa
ctrl+d 结束
[root@localhost ~]#tr -dc "a\n"
asdfghjk
a
wertyujk;l'
asdfghj
a
[root@localhost test]#tr -d a < issue > issue 处理完成以后不能写会到源文件,要写到新的文件中
[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
12345678910[root@localhost test]#tr -d "\n" < 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]#cat c
1 2 3 4 5 6 7 8 9 10 [root@localhost test]#tr " " "\n" <c
1
2
3
4
5
6
7
8
9
10
多行发送给stdin
# 第一种方式
[root@localhost test]#cat > f1
qwert
wertyui
wertyui
wertyuiopasdfghjk
sdfghjkl
sdfyhjkl;sdfghjkl;xcvb
# 第二种方式
[root@localhost test]#cat > f2 <<EOF
> qwerty
> qwertyu
> wertyui
> qwertyu
> EOF
EOF 不是必须得,只要两个相同就可以
管道
管道使用“|”来表示
命令1|命令2|命令3
- 把命令1的输出结果当做命令2的输出结果,把命令2的输出结果当成命令3的输入结果
- 默认情况下,管道只能传送标准输出
- 如果需要把错误输出也传递,则需要|&
- 一般用来组合多个命令
- 有一些命令是不接受管道的
[root@localhost test]#ls f1|tr 'a-z' 'A-Z'
F1
[root@localhost test]#ls f
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'
LS: CANNOT ACCESS F: NO SUCH FILE OR DIRECTORY
[root@localhost test]#echo file{1..20}|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 切割
cut OPTION... [FILE]...
-c 按照字符切割
tail passwd |cut -c2-5
-d 指定切割符,默认是tab
-f # 显示第#个字段
#,#,# 显示离散的多个
#-# 表示连续的
1-5,7 可以结合使用
tail passwd |cut -d: -f1-5,7
tail passwd |cut -d: -f1-5
tail passwd |cut -d: -f1,3,5
paste 合并
默认是相同行合并到一起,默认是tab键
-d 执行间隔符
-s 将所有的行按照列来显示
paste a.txt b.txt
paste -d: a.txt b.txt
paste -s a.txt b.txt
wc 用来对文本进行统计
[root@localhost test]#wc b.txt
4 5 20 b.txt
行数 单词数 字节数 文件名
-l 只显示行数
-w 只显示单词数
-c 只显示字节数
-m 只显示字符数
-L 显示文件中最长行的长度
sort 排序
Usage: sort [OPTION]... [FILE]...
or: sort [OPTION]... --files0-from=F
默认是按照字母排序
-r 倒序
-R 随机排序
-n 按照数字排序
-f 忽略大小写
-t 指定分隔符
-k # 指定按照第#个字段进行排序
sort -t: -k3 passwd
sort -nt: -k3 passwd
uniq合并相同的行
- 相邻
- 完全一样
-c 显示相同的行出现的次数
-d 只显示重复的行
-u 显示从没有重复过的行
cut -d" " -f4 d|sort |uniq -c
pv page
uv user
diff 对比文件
[root@localhost test]#echo "123" >> f
[root@localhost test]#diff d f
11a12
> 123
[root@localhost test]#echo "1234" >> d
[root@localhost test]#diff d f
12c12
< 1234
---
> 123
chown 用来修改所有者和组
Usage: chown [OPTION]... [OWNER][:[GROUP]] FILE...
or: chown [OPTION]... --reference=RFILE FILE...
chown wu c 修改属主
chown wu:wu c 修改属主和属组
chown root.root c
chown :wu c 直接属组
chown -R wu test 递归修改
chown --reference=c d
chgrp 修改文件的属组
Usage: chgrp [OPTION]... GROUP FILE...
or: chgrp [OPTION]... --reference=RFILE FILE...
权限
9位表示权限
3组
3位表示一组
--- --- ---
-
文件权限可以读以下定义
-
属主 u
-
属组 g
-
其他 o
-
全部 a
-
-
每个文件的权限
-
r 读
-
w 写
-
x 执行
-
-
对于文件来说
- r 可以使用文本查看工具来查看里面的内容
- w 可以修改文本的内容
- x 执行可以直接./file
-
对于目录来说
- r 可以使用ls等文件查看的命令查看
- w 可以创建文件,也可以删除
- x 可以cd进入
-
数字表示
--x
001 1
-w-
010 2
r--
100 4
rw-
110 6
rwx
111 7
r-x
101 5
-wx
011 3
修改权限
- 可以直接修改某一类用户的权限
chmod u+x c 增加
chmod u-x c 删除
chmod u=r c 直接赋值
shabang ---》 解释器
- 可以直接使用数字表示
- 可以基于某个文件来修改
设定特殊权限
chattr +i 不能删除、不能修改、不能变更
lsattr 查看属性
chattr +a 只能追加数据
vi/vim
打开文件
vim [option] .... file....
+# 直接定位到第#行
+/pattern 打开文件后,直接定位到第一个匹配到patter的地方
-b 以二进制方式打开文件
-d file1 file2 对比打开多个文件
-m file 只读方式打开文件
-e 直接以末行模式打开
模式
- 命令模式:可以光标,可以粘贴、复制文本,默认
- 插入模式或者编辑模式:可以修改文本
- 末行模式(扩展命令模式):保存、退出等等
- esc 退出当前的模式
模式之间切换
- 命令模式- 插入模式
- i 光标所在处插入
- I 在当前光标所在的行的行首插入
- a 光标所在位置的后面插入
- A 在当前光标所在的行尾插入
- o 在当前光标所在的行的下一行(新开)插入
- O 在当前光标所在的行的上一行(新开一行)插入
- 插入模式- 命令模式
- esc
- 命令模式 -- 末行模式
- :
- 末行模式 -- 命令模式
- esc esc
- esc enter
关闭文件
- 末行模式
- :w 保存
- :q 退出
- :wq 保存并退出
- :q! 强制退出
- :wq!强制保存退出
- :x 保存并退出
- 命令模式
- ZZ 保存退出
- ZQ 不保存退出
扩展命令行模式
- 按":" 来进入
- w 写入
- q 退出
- wq 保存并退出
- q! 强制退出
- 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 替换当前光标所在处的字符
- R 进入替换模式
- 删除
- d 删除,需要跟字符跳转结合
- d$ 删除到行尾,删除当前位置
- d0 删除到行首,当前位置不删除
- d^ 删除到非空字符
- dw 删除一个单词
- de 向后删除一个单词
- db 向前删除一个单词
- dd 删除正行
- # dd 删除#行
- dG 删除到结尾
- dgg 删除到开头
- D 相当于d$
- 复制
- y,也可以跟字符跳转结合
- y$
- y0
- y^
- yw
- ye
- yb
- yy 一正行
-
yy 复制#行
- yG 复制到结尾
- ygg 复制到开头
- Y 复制整行
- 粘贴
- p 如果是整行的话,则粘贴到当前光标所在行的下一行,否则粘贴到光标的后面
- P 如果是整行的话,则粘贴到当前光标所在行的上一行,否则粘贴到光标的前面
- 改变,删除以后并将模式切换成插入模式
- c 可以跟光标的跳转做结合
- c$
- c0
- c^
- cw
- ce
- cb
-
command
- cc 删除正行并插入
- C 相当于c$
-
[i|I|a|A|o|O]string esc 将string粘贴#次
- 搜索
- /pattern 从当前光标往下搜索
- ?pattern 从当前光标往上搜索
- n 同命令相同的方向
- N 同命令相反的方向
- 撤销
- u 撤销最近的修改
- # u 撤销最近的#次修改
- ctrl +r 撤销之前的撤销动作
- . 重复最后一次操作
-
. 最后一次操作重复执行#次
命令扩展模式
地址定界
:start,end
# 具体到第#行
,# 第#行到第#行
#,+n 从第#开始,到第#+n行结束 1,+2 ==>1,3
. 表示当前光标所在的行
$ 表示最后一行
$-1 表示倒数第二行
% 表示全文
/pat1/,/pat2/ 从第一个pat1匹配到的地方,到pat2第一次匹配到的地方
,/pat/ 从第#行开始,到第一次被pat匹配到的地方
/pat/,$ 从第一次被pat匹配到的到结尾
可以使用的命令
- d
- y
- w file 重新另存为文件
- r file 将文件的内容写到匹配到的下一行
查找并替换
-
要使用地址定界来进行查找
-
s 在扩展命令模式下使用为替换
-
格式: s/要查找的内容/要替换的内容/装饰器
-
要查找的内容可以使用正则
-
替换的内容不能为正则
- 可以为分组:%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 水平分隔
vim -O 垂直分隔
切换ctrl+w 加上上下左右箭头
单文件切割
ctrl+w,s 水平切割
ctrl+w,v 垂直切割
ctrl+w,q 取消相邻的窗口
ctrl+w,o 取消全部窗口
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
- unix set fileformat=unix
- 添加标识线: set cul 取消标识线 set nocul
- 获取帮助: set all
- 获取帮助信息:
- :help
- :help topic
- vimtutor
find
是linux里面的一个实时查找工具,通过制定路径完成文件查找
find [options] ..... [查找路径] [查找条件] [处理动作]
查找路径:查找的位置,默认是当前文件夹
查找条件:制定查找的标准,文件名、大小、类型、日期等等
处理动作:对符合条件的文件做什么操作,默认是输出到屏幕上
查找条件
-
根据文件名查找
- -name 指定名称,可以使用正则
- -iname 忽略大小写
- -links n 引用次数为n的文件
- -regex 后面跟完整路径,而不是文件名, 必须整个路径完全匹配
-
制定搜索的层级
- -maxdepth level 最大的搜索深度,指定的目录为第1层
- -mindepth level 最小的搜索深度,包括level层
-
根据属主、属组来查找
- -user username 查找属主为username的文件
- -group groupname 查找属组为groupname的文件
- -uid id 查找属主为id的文件
- -gid id 查找属组为id的文件
- -nouser 查找没有属主的文件
- -nogroup 查找没有属组的文件
-
根据文件类型 -type
- d 目录
- f 文件
- l 符号链接
- s 套接字
- b 块设备
- c 字符设备
- p 管道文件
-
空文件或者空目录
- -empty
-
条件
- 与 -a
- 或 -o
- 非 -not
-
摩根定律
- 非(A或者B) 非A 且非B
- 非(A且B)非A或非B
-
排除目录
- -path
-
[root@localhost test]#find /etc -name *_config /etc/ssh/ssh_config /etc/ssh/sshd_config [root@localhost test]#find /etc -path /etc/ssh -name *_config
-
按照大小来查找
- -size # (#-1,#] 不包括#-1,包括#
- -size -# [0,#-1] 包括#-1
- -size +# (#,......)
-
按照时间来查找
- -atime # [#,#+1)
- -atime -# (0,#)
- -atime +# [#+1,....]
- 查找7天以后的文件 find -atime +7
- -mtime
- -ctime
- 以分钟为单位
- -amin
- -mmin
- -cmin
处理动作
- -print 默认的处理动作,显示在屏幕上
- -ls 类似于ls -l 显示长格式
- -delete 删除查找到的文件
- -fls file 将查找的结果以长格式保存到文件中
- -ok command {} ; 对每一个查找到的文件执行command命令,在执行命令之前要先提示用户是否要执行
- -exec command {} ; 对查到的每一个文件执行command命令,不需要确认,一次性交给后面命令处理
xargs
- 有的命令不支持管道
- 命令参数过长
- xargs 将管道前面的内容一条一条的交给后面命令处理
- 一般会跟find使用
linux三贱客
grep
awk
sed
grep
grep [option] "模式" file
option
--color=auto 对匹配到的行添加颜色
-v 取反
-i 不区分大小写
-n 查找的内容增加行号
-c 打印匹配到的行数
-o 只显示匹配到的文字
-q 静默模式
-A # after 向下显示#行
-B # before 向上显示#行
—C # context 上下分别显示#行
-e 或者 grep -e 'user' -e 'root' passwd
-E 扩展正则表达式
-F 不使用正则表达式
-r 递归
-w 匹配整个单词
正则表达式元字符
-
字符匹配
- . 任意单个字符
- [] 匹配指定范围内的任意单个字符 [0-9] [a-z] [A-Z]
- [^] 取反
- [:upper:] 大写字母
- [:lower:] 小写字母
- [:alnum:] 字母和数字
- [:alpha:] 大小写字母
- [:digit:] 数字
- [:black:] 空白
- [:punct:] 标点符号
-
匹配次数
- * 表示任意次数
- .* 任意字符任意次数
- ? 表示0或者1次
- \+ 至少一次
- \{n\} 表示n次
- \{m,n\} 最少m次,最多n次
- \{n,\} 至少n次
- \{,n\} 至多n次
-
位置锚定
- ^ 开头
- $结尾
- ^$ 空行
grep -v "^#" /etc/ssh/sshd_config |grep -v "^$" 显示不以#开头并且不是空行
-
分组
grep "\(c\|C\)at" a
-
向后引用
- \1 前面第一个括号出现的内容匹配完成之后再后面在出现一次
- \2
-
扩展正则表达式
- 与正则表达式的区别是不需要转义
压缩
gzip
压缩文件
gzip [option]... file
-c 将压缩结果输出到屏幕,保留原来的文件
gzip -c passwd > passwd.gz
-1-9 指定压缩比,默认9
-d 解压
zcat 不解压的情况下查看压缩比内的内容
gunzip 解压
bzip2
bzip [option] file
直接压缩
bunzip2 解压
-k 保留原来的文件
-d 解压
-1-9 指定压缩比
bzcat 不解压的情况下查看压缩包的内容
xz
xz [option] file
unxz 解压
-k 保留原来的文件
-d 解压
-1-9 指定压缩比
xzcat 不解压直接查看
zip
zip [option] zipfile 要压缩的文件
zip -r network.zip /etc/sysconfig/network-scripts
unzip network.zip
tar
归档工具
归档
tar cpvf etc.tar /etc
c 创建
v 显示过程
f 指定归档文件
p 把原来的属性也带过来
tar -r -f etc.tar /etc 追加
tar -t -f etc.tar 查看归档文件内的内容
tar xf etc.tar 解压文件
tar xf etc.tar -C
-z 使用gzip压缩
-j 使用bzip2压缩
-J 使用xz压缩
--exclude 排除文件
split
split -b 指定大小 文件(只能为文件) 切割以后的名字
-d 指定后缀为数字
-a 指定后缀几位
cat 切割后的文件 > 新文件
用户
- 超级管理员用户 root 0
- 普通用户
- 系统用户: 用来启动系统的一些服务和进程的用户,不可以登陆 1-999(centos7)1-499 (centos6)
- 可登陆用户:能登录系统的用户 1000-65535(centos7)500-65535(centos6)
useradd
Usage: useradd [options] LOGIN
useradd -D
useradd -D [options]
普通用户的id是递增,系统用户的id是递减的
-d 用来指定用户的家目录
-g 指定用户组的id
-G 指定用户的附加组
-k 指定复制那个文件夹下的内容,需要和-m一起使用
-m 创建用户的家目录
-c "message" 指定用户的描述信息
-N 不创建同名的组,以users为组
-s 指定用户登录后使用的shell
-u 指定用户的id
—D 显示系统的默认配置
-D [options] 可以修改系统的默认配置
- 相关文件
- /etc/default/useradd 创建用户的默认文件
- /etc/skel/* 默认复制的文件
用户修改usermode
-c 修改描述信息
-d 修改家目录,默认不会创建新目录,如果想移动家目录,则需要使用-m
-g 修改用户组
-G 修改用户的附加组,默认情况下是替换
-a 追加附加组
-l newname 修改用户的登录名称
-L 锁定用户,不能登录系统,修改密码默认情况下回解锁
-U 解锁用户
-s 修改用户登录后的shell
-u 修改用户的uid
-e 年-月-日 修改用户的过期时间,过期以后不能登录
删除用户 USERDEL
默认删除用户不删除用户的家目录
-r 删除家目录
-f 强制删除
默认情况下,用户登录状态下是不能删除用户,强制删除用户以后,用户还是可以用的
查看用户相关信息id
-g 只显示组id
-G 只显示附加组id
-u 只显示用户id
-n 显示名称,需要和guG来配合使用
切换用户
su [options] [-] [USER [arg]...]
切换用户的方式
- 完整切换:su - username 登录式切换,环境变量等都会切换
- 不完整切换:su username 不会切换用户的环境变量家目录等
- root切换普通用户不需要密码,非root用户切换需要密码
切换用户执行命令
[root@localhost ~]#su - peiqi -c "whoami"
peiqi
执行本身不能执行的命令
sudo 配置文件为/etc/sudoers
peiqi ALL=(ALL) NOPASSWD:ALL
其中的NOPASSWD 是不需要输入密码
/etc/passwd文件
- 用户名称
- 密码,使用x来占位
- uid
- gid
- 描述信息
- 家目录
- 登录后使用的shell
设置密码passwd
passwd [OPTION...] <accountName>
-d 删除指定用户的密码,删除密码之后就不能登录
-l 锁定用户
-u 解锁用户
-e 在下次登录以后强制用户修改密码
-f 强制操作
-x maxday 密码的最长使用时间
-n minday 密码的最短使用时间
-w warnday 密码过期前多长时间提醒
-i inactiveday 密码过期多长时间以后禁用
--stdin 从标准输入读取密码 echo '123'|passwd --stdin peiqi
存放文件/etc/shadow
- 用户名
- 密码 \(加密方式(默认sha512)\)盐\(加密后的字符串\)
- 从1970年1月1日到最近一次修改密码经过的时间
- 密码的最短使用时间(0表示随时可以修改)
- 密码的最长使用时间(99999表示永不过期)
- 密码过期多长时间提醒(默认是一周)
- 密码过期多长时间锁定
- 从1970年1月1日开始算起,多长时间后账号失效
密码的复杂性策略
- 必须包括数字、大小写、特殊字符
- 密码必须12位以上
- 不能为弱口令
- 必须为随机密码
- 3个月或者半年修改一次
机器免密登录
ssh-keygen 一路回车
ssh-copy-id 要登录的机器
修改用户密码策略 chage
-E
-I
-m
-M
-W
change login 可以使用交互式的修改密码策略
chfn 修改用户的个人信息
用户组
- 超级用户组 root 0
- 普通用户组
- 系统用户组 1-999(centos7) 1-499(centos6)
- 可登陆用户组 1000-65535(centos7)500-65535 (centos6)
groupadd
-g 指定组id
-r 创建系统用户组
组的文件
/etc/group
- 组名
- 密码占位
- 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.el7.x86_64.rpm
名字-版本(大版本.小版本.修订版)-打包版本.可用的系统.架构.rpm
架构:
x86_64
x86
i386
i486
i686
ppc
noarch 表示通用
包的来源
- 光盘
- 第三方网站
- 官方网站
- 自己做
- https://pkgs.org
- epel 第三方包的结合地
rpm 包的查询
rpm -q 查询指定的包是否安装
-a all 表示当前系统安装的所有的包
-f filename 查询指定的文件由那个包安装生成
-c 查看指定的包生成了哪些配置文件
-d 查询指定的包生成了哪些文档
-i 查询指定包的详细信息
-l 查询指定的包生成到文件
常用的选项
-qi
-qa
-ql
-qc
-qd
yum
yum 会自动解决依赖关系
仓库 存放的是 多个包和包的元数据信息(所在仓库,依赖关系)
仓库的位置:
- http://
- https: //
- ftp: //
- file: //(本地文件)
- 配置文件存放在/etc/yum.repos.d
yum配置文件
[base] #名称
name=CentOS-$releasever - Base - mirrors.aliyun.com # 描述信息
failovermethod=priority # 定义挑选顺序 priority 按顺序 roundrobin 随机
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/
http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
enabled ={0|1} 是否启用,1启用,0是不启用
gpgcheck={0|1} 使用校验
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 降级
- yum check-update 检查包是否可以更新
- yum remove 卸载包
- yum info pkg 显示包的详细信息
- yum clean all 删除元数据信息
- yum makecache 重新构建元数据信息
- yum search 搜索软件包(包名称、描述信息只要包含就可以搜索出来)
- yum provides 搜索命令是由哪个包提供的
软件包组
- yum grouplist 查看包组
- yum groupinstall 安装
- yum groupinfo 获取包的信息,查看包组有哪些包组成
- yum groupupdate 更新
- yum groupremove 卸载包组
yum选项命令
-y 自动确认
-q 静默模式
源码安装
- 下载 wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tar.xz
- 解压文件 tar xf
- 切换目录 cd
- 可以查看帮助信息 README INSTALL 文件
- 安装所需文件
- 编译(检查程序所需的文件)./configure
- 构建安装程序 make
- 安装程序 make install
- 配置环境变量
全双工通信
磁盘管理
查看磁盘空间的占用
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里面读取内容
of = output file 表示将读出的数据写入到什么地方
bs = byte size 可以是K,M,G,T
RAID 阵列卡
- raid0
- 读、写速度有所提升
- 可用空间N(磁盘的个数)*每一块的大小
- 没有容错能力
- 最少磁盘数2
- raid1
- 读有所提升,写性能下降
- 可用空间,所有磁盘中最小的一块大小
- 有容错能力
- 最少是2,2N
- raid5
- 读写速度有提升
- 可用空间(N-1)*大小
- 有容错能力,最多可以坏一块硬盘
- 最少要3块
- raid6
- 读写速度有所提升
- 可用空间(N-2)*大小
- 有容错能力,最多可以坏2块
- 最少要4块
- raid10
- 先实现raid1,在实现raid0
- 读写性能有提升
- 可用空间N*大小/2
- 有容错能力,每组镜像可以坏一块
- 最少要4块
- raid01
- 先实现raid0,在实现raid1
- 读写性能有提升
- 可用空间N*大小/2
- 有容错能力,只能坏同一组的
- 最少要4块
网络
网络基础知识
ipv4:4段 32位
网络位+主机位
网段:
主机:
A
网络位为8位
主机位为24位
第一位不可以变
0 0000001
0 1111111
1-126
127 有特殊用途,回环地址
可用网段数:2^7 -1
每一个网段有多少可用主机:2^24-2
有两个是不可以用:
主机位全为0,表示一个网段
主机位全为1,表示网段里面的广播地址
私有地址:自己可以用的
子网掩码:255.0.0.0
10 段
共有地址: 都可以访问的地址
1.1.1.1/8
00000001.0.0.0
11111111.0.0.0
1.0.0.0
B
16位网络位
16位为主机位
10 000000 00000000
10 111111 11111111
128
191
可用网段:2^14
每个网段有多少可用主机:2^16-2
私有地址:
172.16-172.31
子网掩码:255.255.0.0
C
前24位为网络位
后8位为主机位
110 00000 000000000 00000000
110 11111 11111111 11111111
192
223
可用网段:2^21
每个网段有多少可用机器:2^8-2
私有地址:
192.168.0 -192.168.255
子网掩码 255.255.255.0
D
作为多播地址
1110 0000
1110 1111
224
239
E
作为科研使用
CIDR(无类域间路由)
网络位向主机位借位
16 +5
21位网络位 11个 2^11 2046
255.255.11111000.0
255.255.248.0
网络位向主机位借位:
24+6 30
2^2 -2
子网掩码
网络位全为1,主机位全为0
ip地址和子网掩码来确定属于那个网段
按位与 :只要有0就是0,全部为1,才是1
1&0 0
2&3 2
按位或:只要有1就是1,全部为0,才是0
1|0 1
2|3 3
异或:相同为0,不同为1
1^0 1
2^3 1
3^5 6
取反:-(n+1)
~2 -3
~-4 3
左移:n*2的左移次方
2<<2 8
10<<3 80
右移:n/2的右移次方(向下取整,不是四舍五入)
12>>2 3
13>>2 3
50>>2 12
2>>2 0
10.20.43.65/10
网段
10.20.43.65
00001010.00010100.
11111111.11000000
10.0.0.0
网络配置
- 手动
- ip
- 配置文件
- 自动分配
- dhcp
ip
-
增加ip地址
ip a add 192.168.21.23/24 dev ens33
-
删除 ip
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/ifcfg-name
TYPE="Ethernet" # 网卡的接口类型 PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="dhcp" # 获取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="c252096f-57e0-41bd-a1d9-5158a86f9ba1" # 设备唯一标识码 DEVICE="ens33" ONBOOT="yes" #开机是否启动 HWADDR="" #mac地址 IPADDR=ip地址 NTEMASK=子网掩码 GATEWAY=网关
DNS配置文件
-
/etc/reslov.conf
nameserver 192.168.21.2
主机名
- 获取主机名 hostname
- 设置主机名 hostname name
- 配置文件
- /etc/hostname centos7
- /etc/sysconfig/network centos6
- 永久生效
- 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 所有地址
解析
- 本地解析 /etc/hosts
- dns解析
- 根节点 总共13组
wget
用来下载网络资源
-q 静默模式
-c 断点续传
-O filename 另存为的名称
-P 保存到指定的目录
-r 递归下载
-p 下载所有的html文件
systemctl
管理服务 service
start name ... 启动服务
stop name ... 关闭服务
reload name 重读配置文件 平滑重启
restart name 重启服务
status name 查看状态
enable name 开机自启动
disabled name 关闭开机自启动
systemctl list-unit-files |grep sshd 查看服务是否开机自启动
centos6
service 动作 服务
chkconfig 用来管理服务的开机启动
补充内容
1.crontab的日志
/var/log/cron
2.命令最好写绝对路径
3.ping
-c 指定次数
ICMP 协议 ---> 自行百度
进程
查看进程 ps
ps [options]
支持的命令格式
- unix格式:-h -e
- BSD格式:a,x,u
- GNU长格式:--help
选项
[root@s22 ~]#ps
PID TTY TIME CMD
28019 pts/4 00:00:00 ps
83674 pts/4 00:00:00 bash
pid 终端 当前命令占用cpu的时间 命令
a 所有的终端
x 包括不连接终端的终端
u 显示进程详细信息
f 显示进程树
k 指定排序方式 ,默认是递增,如果想递减,则需要在排序的字段上加上-
o 指定显示的属性,不能跟u同时使用
L 获取支持的选项,
-L 显示线程
-e 相当于 ax
-f 显示详细信息,相当于u
-F 显示更详细信息
-H 显示树状结构
-U username 获取指定的用户信息
常用选项: aux -ef -eFH
ps输出属性
VSZ 虚拟内存(程序认为可以获取到的)
RSS 实际内存
psr cpu编号
STAT 状态
%cpu cpu的占用率
%mem 内存的占用率
根据名称来查询进程
pidof name
[root@s22 ~]#pidof python
1169 825
系统工具
uptime
[root@s22 ~]#uptime
09:17:40 up 1 day, 22:19, 5 users, load average: 2.14, 1.59, 0.84
当前时间 当前服务器运行时长 当前的在线用户数 cpu的负载 1分钟 5分钟 15分钟
cpu平均负载:在特定时间之内cpu运行的平均进程数,不超过cpu核心数的2倍认为为良好
top
首部信息
-
uptime信息 l 显示与隐藏
-
tasks :进程总数,运行,睡眠数,停止数,僵尸进程 t
-
cpu信息:
%Cpu(s): 0.3 us, 4.6 sy, 0.0 ni, 95.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 用户空间 系统空间 nice值 空闲 等待 硬中断 软中断 虚拟机偷走时间
-
内存信息 m
-
cpu分别显示 1(数字)
排序:
模式是cpu的占用率 P
M:内存占用率
T: cpu的占用时间
退出:q
修改刷新频率:s,默认是3秒
杀死进程:k,默认是第一个
W 保存文件
选项:
-d 刷新时间
-b 显示所有的信息
-n # 指定刷新#次后退出
htop
- epel源
性能分析
free
-b 字节
-k kb
-m mb
-g gb
-h 人类易读方式
-c # 刷新次数
vmstat
vmstat [options] [delay [count]]
[root@s22 ~]#vmstat 1 3 每秒刷新一次,刷新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 37028 162708 0 808588 0 0 8 6 34 34 0 2 97 0 0
0 0 37028 162560 0 808588 0 0 0 0 4535 6893 1 5 95 0 0
0 0 37028 162544 0 808588 0 0 0 0 4463 6772 0 5 95 0 0
procs:
r:正在运行的进程个数
b:阻塞队列的长度
memory:
swap: 虚拟内容大小
free: 空闲物理内存的大小
buff:用于buff的大小
cache:用户cache的大小
swap:
si:从磁盘交换到内存的数据速率(kb/s)
so: 从内存交换到磁盘的数据速率(kb/s)
io:
bi: 从磁盘读取到系统的速率(kb/s)
bo: 从系统写入到磁盘的速率(kb/s)
system:
in:中断频率
cs:进程之前切换的频率
cpu:
us
sy
id
wa
st
iostat
查看磁盘读写速度
iostat 1 10
dstat 查看所有
-c cpu
-d 硬盘
-m 内存
-n 网络
-p 进程
-r io请求
-s swap
--top-cpu 显示占用cpu最多的进程
--top-io 显示占用io最多的进程
--top-mem 显示占用内存最多的进程
--tcp 显示tcp的信息
--udp 显示udp的信息
iftop 显示网卡的流量
进程的管理工具
kill
向进程发送信号,实现对进程的管理,每个信号,对应不同的值,对应不同的含义,不区分大小写
查询可用信号:kill -l
常用信号:
1) sighub 不需要关闭程序,重新加载配置文件
- sigint 终止进程,相当于ctrl+c
9) sigkill 强制杀死进程
- sigterm 终止正在运行的进程
18)sigcont 继续运行
19)sigstop 后台休眠
按照pid: kill-n pid
按照名称:killall -n name
按照名称:pkill -n name
作业管理
- 前台作业:一直占用终端的作业
- 后台作业:不占用当前的终端
让作业运行于后台:
- ctrl+z 对于启动中
- command & 也会输出到终端
脱离终端:
-
nohup command &>/dev/null &
-
screen
-list 查看所有的screen窗口 -r 进入
安全
防火墙
- 绿盟
- 深信服
- 启明星辰
- 飞塔
- 思科
- 华为
- 华三
4表5链
iptables -L 查看 防火墙策略
iptables -F 清空 防火墙
systemctl disable firewalld 开机并启动
systemctl stop firewalled
selinux
美国国家安全局
- 配置文件 /etc/selinux/config
- SELINUX=disabled
- setenforce 0 临时生效
- getenforce 查看selinux的状态
rhcea
rhce
rhca
ccnp
ccie
ccia
ocp
编译后的软件如果想删除,直接删除编译生成到目录就可以
虚拟环境
安装
pip3 install virtualenv -i https://pypi.douban.com/simple
创建虚拟环境
virtualenv --no-site-packages django11
--no-site-packages 创建一个全新的python环境
--python 指定以哪个python来创建虚拟环境
进入虚拟环境
source envdir/bin/activate
退出虚拟环境
deactivate
确保环境一致
在windows上执行如下命令:
将windows上安装的包做快照
pip freeze > requirement.txt
将requirement.txt发送到linux上
切换虚拟机
pip install -r requirement.txt -i https://pypi.douban.com/simple
virtualenvwrapper
为了解决虚拟环境管理的问题,因为虚拟环境可以在任何目录下创建
1. 安装
pip3 install virtualenvwrapper -i https://pypi.douban.com/simple
2.修改文件
vim ~/.bashrc
export WORKON_HOME=/envdir
export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'
export VIRTUALENVWRAPPER_PYTHON=/opt/python36/bin/python3
source /opt/python36/bin/virtualenvwrapper.sh
3. 加载~/.bashrc
source ~/.bashrc
4.创建环境
mkvirtualenv django11 创建并切换
5.进入虚拟环境
workon name
6.切换到当前虚拟环境的文件夹
cdvirtualenv
7.切换到当前虚拟环境的第三方包的文件夹
cdsitepackages
8.退出
deactivate
9.列出当前管理的虚拟环境
lsvirtualenv
10.列出当前虚拟环境的第三方包
lssitepackages
11.删除虚拟环境
rmvirtualenv 必须要退出才能删除
mysql
mariadb 是mysql的分支
可以直接在官方网站下载
下载
wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.27-1.el7.x86_64.rpm-bundle.tar
解压
tar xf MySQL-5.6.44-1.el7.x86_64.rpm-bundle.tar
安装
yum install -y *.rpm
默认安装位置:/var/lib/mysql
报错信息:
2019-08-30T11:18:22.976635Z 0 [Warning] Can't create test file /mydata/mysql/localhost.lower-test
2019-08-30T11:18:22.976687Z 0 [Note] /usr/sbin/mysqld (mysqld 5.7.27) starting as process 2788 ...
2019-08-30T11:18:22.980289Z 0 [Warning] Can't create test file /mydata/mysql/localhost.lower-test
2019-08-30T11:18:22.980338Z 0 [Warning] Can't create test file /mydata/mysql/localhost.lower-test
解决办法:setenforce 0
重置密码
默认密码:
grep 'pass' /var/log/mysqld.log
mysql_secure_installation
输入root密码
是否要修改密码
是否要修改root密码(大小写、数字、特殊字符)
是否要删除匿名用户
是否禁止root远程登录
是否要删除test数据库
是否要刷新表的权限
密码校验规则
设置密码的校验规则
mysql> set global validate_password_policy=0;
0 校验级别最低,只校验密码的长度,长度可以设定
1 必须包括大写字母、小写字母、数字、特殊字符
2 必须满足上面两条,并追加,对于密码中任意连续的4个(或者4个以上) 字符不能是字典中的单词
mysql> set global validate_password_length=3; 修改密码的最短长度
创建用户
create user 'username'@'ip' identified by 'password';
全部ip的话则是%
查看权限
show grants;
用户授权
mysql> grant all on *.* to 'root'@'%' identified by '1234';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql主从
主服务器上配置如下
server-id=1 设置id
log-bin=/mydata/log/master-bin 启动binlog日志
sync_binlog = 1 确保主从复制事务安全
主服务器执行如下sql
mysql> grant replication slave on *.* to 'slave'@'192.168.21.131' identified by '1234';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
show master status\G
从服务配置如下:
server-id =12
relay_log =/mydata/log/slave-log
sync_binlog = 1
read-only=ON
从服务器执行如下sql
CHANGE MASTER TO
MASTER_HOST='master2.example.com',
MASTER_USER='replication',
MASTER_PASSWORD='password',
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.128',master_user='slave',master_password='1234';
# 启动进程
start slave;
# 查看状态
show slave status\G
问题:
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
解决办法:
rm -rf /mydata/mysql/auto.cnf
systemctl restart mysqld
mysql备份与恢复
数据库
备份
mysqldump
- 锁表
- 备份特别慢,适用于数据量较小
- 不可以做增量备份
- 单线程
-A, --all-databases 所有的库
-B 指定备份的库
—F 备份前刷新日志
--flush-privileges 刷新授权表
-p 密码
-u 用户
-P 端口
触发器
存储过程和存储函数
## 备份
mysqldump -uroot -S /mydata/mysql/mysql.sock -A -p > mysql.sql
## 恢复一
直接在数据库里面source mysql.sql文件
## 恢复二
mysql -uroot -p < mysql.sql
xtrabackup
- 多进程
- 支持增量备份
- 锁行
安装
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm # 安装yum仓库
yum install -y percona-xtrabackup-24
--target-dir=name # 指定备份生成的目录
--backup 备份
--prepare 准备
--databases=name filtering by list of databases.
--databases-file=name 配置文件
创建一个用户
mysql> create user 'backup'@'localhost' identified by 'backup';
Query OK, 0 rows affected (0.00 sec)
mysql> grant reload,lock tables,process,replication client on *.* to 'backup'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
备份
xtrabackup --backup --target-dir=/mydata/backup/base -ubackup -pbackup --socket=/mydata/mysql/mysql.sock
### 看得如下信息,代表成功
xtrabackup: Transaction log of lsn (5480853) to (5480862) was copied.
190902 09:25:09 completed OK!
恢复
准备文件
xtrabackup --prepare --target-dir=/mydata/backup/base
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 5482536
190902 09:28:12 completed OK!
恢复文件
cd /mydata/backup/base
cp -rf hello /mydata/mysql/
chown mysql.mysql /mydata/mysql/hello/ -R
恢复全部文件
xtrabackup --copy-back --target-dir=/mydata/backup/base
chown mysql.mysql * -R
增量备份
xtrabackup --backup --target-dir=/mydata/backup/t1 --incremental-basedir=/mydata/backup/base -uroot -p --socket=/mydata/mysql/mysql.sock
--incremental-dir 全备的路径
xtrabackup --backup --target-dir=/mydata/backup/t2 --incremental-basedir=/mydata/backup/t1 -uroot -p --socket=/mydata/mysql/mysql.sock
--incremental-basedir应该是上一次的增量备份目录
xtrabackup --prepare --apply-log-only --target-dir=/mydata/backup/base
恢复(只能全部删除以后再恢复)
xtrabackup --prepare --apply-log-only --target-dir=/mydata/backup/base
xtrabackup --prepare --apply-log-only --target-dir=/mydata/backup/base --incremental-dir=/mydata/backup/t1
xtrabackup --prepare --apply-log-only --target-dir=/mydata/backup/base --incremental-dir=/mydata/backup/t2
xtrabackup --copy-back --target-dir=/mydata/backup/base
chown mysql.mysql * -R
systemctl restart mysqld
nginx
web服务 apache iis
django web框架
lvs 负载均衡 章文嵩博士
vue 尤雨溪
Tengine
F5 硬件负载
A10
安装
wget http://nginx.org/download/nginx-1.16.1.tar.gz
tar xf nginx-1.16.1.tar.gz
cd nginx-1.16.1
yum install gcc zlib2-devel pcre-devel openssl-devel
./configure --prefix=/opt/nginx --with-http_ssl_module --with-http_stub_status_module
make && make install
目录结构
[root@localhost nginx]#ls
conf html logs sbin
conf 配置文件
html 存放静态文件 index.html 是默认的欢迎页面
logs 日志目录
sbin 二进制文件
启动以后会生成一个主进程,根据配置文件的选项来生成子进程(工作进程),主进程不负责处理用户的请求,用来转发用户的请求,真正负责处理用户请求的是子进程
命令格式
./sbin/nginx -h
nginx version: nginx/1.16.1
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
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/nginx/)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file
配置文件
#user nobody; 使用哪个用户来启动子进程
worker_processes 1; #工作进程的个数,配置成cpu的核心数-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;
}
# 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_name ms.s22.com
多域名访问
server {
listen 80;
server_name www.taobao.com taobao.com;
location / {
root /data/taobao;
index index.html;
}
}
server {
listen 80;
server_name www.jd.com jd.com;
location / {
root /data/jd;
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"';
#access_log logs/access.log main;
remote_addr 访问ip地址
remote_user 访问的用户
time_local 本地时间
request 包括请求方式 请求地址 请求协议版本
status 状态码
body_bytes_sent 发送的大小
http_user_agent 用户的请求头
http_x_forwarded_for
禁止访问
可以写在server或者location里面
deny 192.168.21.1;
allow 192.168.21.131;
deny 192.168.21.0/24;
反向代理
- 起到保护网站安全的作用
- 可以缓存静态文件
- 实现负载均衡 F5 A10 lvs haproxy nginx
upstream django {
server 192.168.21.128:81;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://django;
}
权重
weight
upstream django {
server 192.168.21.128:81 weight=3;
server 192.168.21.131:81
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://django;
}
}
得到的结果是:
访问128的3次,才访问131的一次
ip_hash
每个请求的ip做hash运算,这样每个固定的访客都会被负载到后端固定的机器
upstream django {
ip_hash;
server 192.168.21.128:81
server 192.168.21.131:81
}
backup
当前面的都访问不到,则请求backup的备份,只要有一个通,则不会走backup
upstream django {
server 192.168.21.128:81;
server 192.168.21.131:81;
server 192.168.21.131:82 backup;
}
nginx location匹配规则
location = / {
精确匹配/ ,后面不能带其他的东西
[ configuration A ]
}
location / {
所有的以/开头的地址
[ configuration B ]
}
location /documents/ {
只匹配/documents/
[ configuration C ]
}
location ^~ /images/ {
# 匹配以/images/开头。
~严格大小写
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
以(gif|jpg|jpeg)结尾的文件
~* 不区分大小写
[ configuration E ]
}
优先级
= > 完整路径 > ^~ > /
location分离
server {
listen 80 ;
server_name www.taobao.com taobao.com;
location / {
proxy_pass http://192.168.21.131:82;
}
location ~*\.(jpg|gif|png)$ {
root /data/img;
}
status
location /status {
stub_status on;
}
压缩
gzip on
提高响应速度,节省带宽
WSGI
django自带的wsgiref 在调试模式下使用的wsgi的文件,网关接口,协议
uwsgi:协议
uWSGI:具体实现方式
安装
pip3 install uwsgi -i https://pypi.douban.com/simple
准备django程序
启动
cd django目录
uwsgi --http :8080 --module mysite.wsgi
配置文件格式
conf
py
cnf
xml
json
ini
yaml
配置文件启动
[uwsgi]
http = :8080
#项目路径
chdir= /data/mysite
# uwsgi的文件
wsgi-file= mysite/wsgi.py
# 虚拟环境
# virtualenv = /root/env
# 进程个数
processes = 2
# 线程个数
threads=2
# 后台启动,指定日志的输出
daemonize=/data/mysite/django.log
# 清除临时文件
vacuum = true
# python文件发生改变自动重启
py-autoreload=1
uwsgi --ini file
nginx的配置文件
server {
listen 80;
server_name crm.oldboy.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
location /static {
root /data/supercrm;
}
}
在django的配置中要写入
SATAIC_ROOT=os.path.join(BASE_DIR,'static/')
执行命令
python3 manager.py collectstatic #用来收集静态文件
第二种配置方式
uwsgi
socket= :9090
nginx的配置文件
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8080;
}
第三种配置方式
uwsgi
socket = file.sock
nginx的配置文件
location /{
include uwsgi_params;
uwsgi_pass unix://file.sock
}
nosql not only sql
用户画像:
热点数据:经常被使用的数据
mysql
安装
-
可以使用yum 安装,要先配置epel源
yum install -y redis
-
可以编译安装
wget http://download.redis.io/releases/redis-5.0.5.tar.gz tar xf redis-5.0.5.tar.gz cd redis-5.0.5/ make
redis 可执行文件
redis-benchmark #性能测试
redis-check-aof # 检查修复aof文件
redis-check-rdb # 检查修复rdb文件
redis-cli # redis的客户端
redis-sentinel # redis的集群
redis-server # redis的服务端
redis-trib.rb #集群管理
启动redis
./src/redis-server 默认端口是6379,默认启动会占用终端
性能测试
./src/redis-benchmark -q
PING_INLINE: 73855.24 requests per second
PING_BULK: 73800.73 requests per second
SET: 74074.07 requests per second
GET: 72833.21 requests per second
INCR: 73637.70 requests per second
LPUSH: 73855.24 requests per second
RPUSH: 70175.44 requests per second
LPOP: 72202.16 requests per second
RPOP: 74183.98 requests per second
SADD: 74962.52 requests per second
HSET: 75642.96 requests per second
SPOP: 73746.31 requests per second
LPUSH (needed to benchmark LRANGE): 74850.30 requests per second
LRANGE_100 (first 100 elements): 48379.30 requests per second
LRANGE_300 (first 300 elements): 24172.11 requests per second
LRANGE_500 (first 450 elements): 18670.65 requests per second
LRANGE_600 (first 600 elements): 15384.62 requests per second
MSET (10 keys): 78186.08 requests per second
默认是100000,50个同时发起连接
连接
./src/redis-cli
-h ip地址
-p 端口
-s 套接字
-a 密码
-n 指定redis的库
redis的命令是不区分大小写
redis的数据类型
- string
- hash
- list
- set
- zset
命令相关
ping
用来测试redis是否连通,返回值是pong
info
获取系统的信息
echo
打印内容,测试使用
quit
退出
select
切换redis的库,总共有16个,0-15
del
删除指定的一个或者多个key,不存在的key忽略
exists
判断key 是否存在,存在是1,不存在是0
expire key seconds
给指定的key设置存活时间,当key过期以后,就自动删除
ttl
查看key的存活时间,-2 key不存在 -1 永久生效
keys pattern
查找所有符合pattern 的key,支持通配符
move key db
移动当前的key到指定的db里面,成功返回1,失败返回0
pexpire key 毫秒
给一个key 设置过期时间,单位是毫秒
pttl key
查看key的存活时间,但是为毫秒
randromkey
随机获取一个key,但是不删除,如果数据库为空,则返回空
rename
重命名key,如果源key不存在,则报错,如果目标key存在,则覆盖
renamenx
重命名key,如果源key不存在,则报错,如果目标key存在,则不变
type
查看key所存储的数据类型,如果没有这个key,则返回none
string
set
设置key value
如果key存在,则覆盖,不存在,则新建
ex second 设置key的存活时间,单位是秒
px 毫秒 设置key的存活时间,单位是毫秒
nx 如果键不存在,则新建,如果存在,则返回nil
xx 只有键存在,才能操作
get
获取key对应的value,只能获取一个,如果key存在,则返回值,如果key不存在,则返回nil
mset
批量创建key vlaue对应关系,会覆盖已存在的key
mget
批量获取key,如果不存在,则返回nil
getset
给指定的key设置新value,并返回原来的value,如果key不存在,则返回nil
strlen
返回value的长度
append
如果key存在,则追加,如果key不存在,则新建
incr
将key中存在的数加1,只能对数字有效
decr
将key中存在的数值减1,只能对数字有效
incrby
将key中存在的数值指定增加多少,只对数字有效
decrby
将key中存在的数值减少指定的值,只能对数字有效
getrange
切片,同python类似,不能使用步长
incrbyfloat(默认保留17位)
将key中存在的数值增加指定的浮点数
list
lpush
将一个或者多个value插入到列表的头部
lpop
移除并返回列表key的头一个元素
lrange
查看列表指定的元素,全部显示是0,-1
rpush
将一个或者多个value插入到列表的尾部(最后边)
rpop
删除尾部的值
rpushx
将value插入到key的尾部,key必须存在才可以
lpushx
将value插入到key的头部,key必须存在才可以
lindex
从表头开始,获取下标为index的value
linsert
将value插入到key指定的元素前或者后
before 前
after 后
如果value不存在,则不操作
llen
获取列表长度
lrem
删除列表中的value
- count > 0 从表头往表尾的方向查找,删除指定的个数
- count = 0 全部删除
- count < 0 从表尾的位置往表头的方向查找,删除指定的个数
lset
替换指定的索引位置的value,如果索引超出范围,则报错
ltrim
列表的切片
hash
{'db':{"redis":'redis.conf',"mysql':'my.cnf',"nginx":"nginx.conf"}}
hset
给hash增加key value值
hlen
获取hash的长度
hget
获取某个hash里面key的value
hgetall
获取所有的键值对
hmset
批量增加键值对
hmget
批量获取键值对
hsetnx
给指定的hash增加键值对,如果原来的field存在,则操作无效,如果不存在,则新增
hkeys
获取hash表中所有的field
hvals
获取hash表中所有的value
hdel
删除hash表中的一个或者多个field-value
hexists
判断hash表中的field是否存在,如果存在,则为1,不存在则为0
hincrby
给hash表中的field增加指定的数值,只限于数字
hincrbyfloat
给hash表中的field增加指定的浮点,只限于数字
set
sadd
给集合添加值,如果值存在,则什么都不操作,如果值不存在,则添加
SMEMBERS
获取集合所有的成员
scard
获取集合的个数
sdiff
获取两个集合的差集,前面存在,但是后面不存在的
sinter
获取两个集合的交集
sunion
获取两个集合的并集
SISMEMBER
判断元素是否在集合中,如果存在,则为1,如果不存在则为0
smove
将指定的元素从一个集合移动到另外一个集合中,如果源集合存在,则移动,如果不存在,则忽略,如果目标集合存在,直接移动,如果目标集合不存在,则新建集合并移动
spop
随机删除指定个数的元素,并把删除的元素打印出来
SRANDMEMBER
随机获取指定个数的元素
- 默认随机获取一个
- 如果count > 0,
- 如果count大于集合的总数的话,则全部取出
- 如果count小于集合总数的话,则随机取出count个
- 如果count<0,则随机count的绝对值次取出值
srem
删除指定的一个或者多个元素
如何保持环境一致?
pip3 freeze > requerment.txt
pip install -r requerment.txt
1.环境不一致
2.配置文件不一致
3.技术水平不一致,导致部署环境快慢不一致
docker
- 一处编译,到处运行
- 对系统的消耗不是特别的多
- 可以快速启动
- 维护简单
- 扩展容易
镜像
可以理解为操作系统的ios镜像
容器
启动后的镜像
仓库
镜像
私有的仓库
公共的仓库
docker-ce 社区版本
docker-ee 商业版本
底层实现原理
namespace
cgroup
linux 内核的技术
安装
cd /etc/yum.repos.d/
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce
配置加速器
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://1nj0zren.mirror.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn",
"http://f1361db2.m.daocloud.io",
"https://registry.docker-cn.com"
]
}
systemctl daemon-reload
systemctl restart docker
第一个命令
docker run hello-world
docker 搜索镜像
NAME DESCRIPTION STARS OFFICIAL
mysql MySQL is a widely used, open-source relation… 8560 [OK]
name 名字
DESCRIPTION 描述信息
STARS 点赞数
OFFICIAL 是否是官方提供
查看镜像命令
docker images
docker 镜像是分层的
显示镜像的id
docker images -q
列出部分镜像
docker images mysql
删除镜像
docker rmi name|id
删除全部镜像
docker rmi `docker images -q`
启动容器
docker run 镜像名称
先查找本地是否存在镜像
如果不存在则去下载镜像
下载以后再启动
容器启动以后在原来的镜像基础上在新建一层
查看容器
docker ps #默认查询是运行中的容器
-a 查看所有的
-q 只查看容器的id
容器执行命令
docker run centos /bin/echo 'hongxu'
启动并进入镜像
docker run -ti centos /bin/bash
-t 创建一个虚拟终端
-i 将容器的标准输入保持打开
退出 exit
ctrl +d
--name 指定名字
-d 后台运行
—P 将容器的端口暴露在宿主机的随机端口上
-p 宿主机端口:容器端口
-v 宿主机目录:容器指定目录(可以实现将宿主机目录挂载到容器中)
制作自己的镜像
docker commit -m "xinx" mycentos:laster
导出镜像
docker save -o mycentos.tar.gz mycentos
docker save mycentos > mycentos.tar.gz
删除容器
docker rm # 默认只能删除未运行的容器
-f 强制删除
导入镜像
docker load -i mycentos.tar.gz
docker load < mycentos.tar.gz
scp
linux之间互相传递文件
查看端口映射关系
docker port 容器id或者容器名称
关闭docker容器
docker stop 容器id或者容器名称
启动docker容器
docker start 容器id或者容器名称
获取容器的运行状态
docker stats 容器id或者容器名称
查看日志
docker logs 容器id或者容器名称
-f 实时输出
进入容器
docker exec -ti 容器id或者容器名称 /bin/bash
移除所有停止状态的容器
docker container prune
dockerfile
FROM mycentos # 指定基础镜像
COPY epel.repo /etc/yum.repos.d/ # 复制文件
RUN yum install -y nginx # 运行命令
RUN mdkir /data/html
RUN echo 'mynginx' > /data/html/index.html
COPY nginx.conf /etc/nginx/nginx.conf #只复制
ADD # 复制并解压压缩包
ENV alex=alexdsb # 设置环境变量
ENV wulaoban=dsb
WORKDIR /data/html # 设置工作目录,exec进入之后直接进入的目录
EXPOSE 80 # 设置端口
VOLUME # 指定容器的目录
CMD /bin/bash -c systemctl start nginx # 运行命令
RUN和CMD的区别
RUN可以有多个
CMD只能有一个,如果有多个到话,按最后一个算
build
docker build -t name:tag -f dockerfile .
部署django
FROM mycentos
COPY epel.repo /etc/yum.repos.d/
RUN yum install -y python36 python36-pip python36-devel
RUN pip3 install django==1.11 pymysql django-multiselectfield -i https://pypi.douban.com/simple
COPY supercrm /data/supercrm
WORKDIR /data/supercrm
RUN python3 manage.py migrate
EXPOSE 8080
CMD python3 manage.py runserver 0.0.0.0:8080
远程仓库
docker login #登录dockerhub网站
docker tag django wangfeng7399/django # 修改名称
docker push wangfeng7399/django # 上传
本地仓库
本地仓库默认使用是https
docker run -p 5000:5000 -d -v /opt/data/registry:/var/lib/registry registry
docker tag django 127.0.0.1:5000/django
docker push 127.0.0.1:5000/django
## 检查
curl 127.0.0.1:5000/v2/_catalog
{"repositories":["django"]}
解决办法:
cat /etc/docker/daemon.json
{
"registry-mirrors": [
"https://1nj0zren.mirror.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn",
"http://f1361db2.m.daocloud.io",
"https://registry.docker-cn.com"
],
"insecure-registries": [
"192.168.21.128:5000"
]
}
docker tag django 192.168.21.128:5000/django
docker push 192.168.21.128:5000/django
docker 编排工具
- swarm
- mesos
- k8s
- kubernetes
- compose 嫡系
pip3 install docker-compose
语法是基于yaml
- 列表 -
- 字典 key: value
- 后缀名 yaml yml
yaml文件
默认是docker-compose.yml
-f 文件
version: '3.4'
services:
web:
build: #编译
context: .
dockerfile: flaskdf
ports: #指定端口
- "15000:5000"
redis:
image: 'redis' # 指定镜像文件
启动命令是
docker-compose up
发布订阅
subscribe
订阅一个或者多个频道
publish
给指定的频道发送消息
psubscribe
订阅指定模式的频道,*代表所有
pubsub channels
查看当前活跃的频道
pubsub numsub channels
查看当前频道的订阅人数
redis的配置文件
bind 127.0.0.1 # 监听的地址
protected-mode yes # 将redis运行在安全模式下
port 6379 # 端口
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no # 是否以守护进程开启
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1 # 在900秒以内有1次更新,就会持久化
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb # 数据的保存文件
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-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 yes
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
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
requirepass foobared # 给redis设置密码
auth
密码认证
save
保存
flushall
清空所有的数据
redis的主从
只需要在从服务器上进行配置
slaveof ip地址 端口
如果有密码的话
masterauth <password>
命令行设置方式
config set masterauth password
- 基于异步的,平均每秒钟从服务器都会主服务器发送复制的情况
- 一个主可以多个从
- 不止主可以有从服务器,从也可以有从服务器
- 复制功能不会阻塞主服务器
- 复制功能也不会阻塞从服务器
redis的持久化
- rdb
- aof
rdb
- 优点
- 生成二进制文件
- 系统会默认的多长时间保存一次
- 直接手动保存
- 制作快照
- 可以用作备份
- 比较适合做灾难恢复
- 主进程会fork一个子进程出来,子进程用来复制保存数据
- 缺点
- 如果说数据需要尽量保存下来,则不适合实用rdb
- 在数据量庞大的时候,对系统消耗过大
save 900 1 # 在900秒以内有1次更新,就会持久化
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 yes
appendfilename "appendonly.aof"
appendfsync everysec
直接通过命令从rdb切换到aof
config set appendonly yes
config set save ""
redis的高可用
豌豆荚:codis
feckbook:
主观下线:哨兵检测不到服务
客观下线:全部哨兵同一协商
redis cluster
- 16384个槽位
- 最少需要6台服务器
准备配置文件
## 6380
bind 127.0.0.1
port 6380
daemonize yes
pidfile 6380.pid
logfile 6380.log
cluster-enabled yes
cluster-config-file node-6380.conf
cluster-node-timeout 10000
## 6381
bind 127.0.0.1
port 6381
daemonize yes
pidfile 6381.pid
logfile 6381.log
cluster-enabled yes
cluster-config-file node-6381.conf
cluster-node-timeout 10000
## 6382
bind 127.0.0.1
port 6382
daemonize yes
pidfile 6382.pid
logfile 6382.log
cluster-enabled yes
cluster-config-file node-6382.conf
cluster-node-timeout 10000
## 6383
bind 127.0.0.1
port 6383
daemonize yes
pidfile 6383.pid
logfile 6383.log
cluster-enabled yes
cluster-config-file node-6383.conf
cluster-node-timeout 10000
## 6384
bind 127.0.0.1
port 6384
daemonize yes
pidfile 6384.pid
logfile 6384.log
cluster-enabled yes
cluster-config-file node-6384.conf
cluster-node-timeout 10000
## 6385
bind 127.0.0.1
port 6385
daemonize yes
pidfile 6385.pid
logfile 6385.log
cluster-enabled yes
cluster-config-file node-6385.conf
cluster-node-timeout 10000
环境准备
安装ruby
版本必须是2.2以上
wget https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.4.tar.gz
tar ruby-2.6.4.tar.gz
cd ruby-2.6.4
./configure --prefix=/opt/ruby
make && make install
配置环境变量
PATH=/opt/ruby/bin:$PATH
source
安装ruby依赖
gem install redis
安装命令
./src/redis-cli --cluster help
./src/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
create 创建集群
check 检查集群
info 查看集群信息
fix 修复集群
连接命令
redis-cli -c -p 6380