等级 0 关机模式
等级 1 单用户模式
等级 2 无网络的多用户命令行模式
等级 3 有网络的多用户命令行模式
等级 4 被系统保留
等级 5 带图形界面的多用户模式
等级 6 重启模式
[命令] Linux 命令 chmod (管理权限)
内容目录:
内容一:普通权限的管理
1.1 普通权限的介绍
1.1.1 对于文件而言
1.1.2 对于目录而言
1.1.3 用数字代替权限的方法
1.2 管理权限案例
1.2.1 给一个文件或目录添加权限的案例
1.2.1.1 案例一
1.2.1.2 案例二
1.2.1.3 案例三
1.2.1.4 案例四
1.2.2 给一个文件或目录撤销权限的案例
1.2.2.1 案例一
1.2.2.2 案例二
1.2.2.3 案例三
1.2.2.4 案例四
1.2.3 设定某一个文件或目录的权限的案例
1.2.3.1 案例一
1.2.3.2 案例二
1.2.3.3 案例三
1.2.3.4 案例四
1.2.3.5 案例五
1.2.3.6 案例六
1.2.3.7 案例七
内容二:特殊权限的管理
2.1 特殊权限 SUID
2.1.1 SUID 介绍
2.1.2 SUID 权限的添加的案例
2.1.2.1 添加 SUID 权限的案例
2.1.2.2 查看 SUID 权限的添加情况的案例
2.1.2.2.1 查看有 SUID 权限,但是所属主没有执行权限的文件的案例
2.1.2.2.2 查看有 SUID 权限,并且所属主有执行权限的文件的案例
2.2 特殊权限 SGID
2.2.1 SGID 介绍
2.2.2 SGID 权限的添加的案例
2.2.2.1 添加 SGID 权限的案例
2.2.2.2 查看 SGID 权限的添加情况的案例
2.2.2.2.1 查看有 SGID 权限,但是所属组没有执行权限的目录的案例
2.2.2.2.2 查看有 SGID 权限,并且所属组有执行权限的目录的案例
2.3 特殊权限 SBIT
2.3.1 SBIT 介绍
2.3.2 SBIT 权限的添加的案例
2.3.2.1 添加 SBIT 权限的案例
2.3.2.2 查看 SBIT 权限的添加情况的案例
2.3.2.2.1 查看有 SBIT 权限,但是所属主没有执行权限的目录的案例
2.3.2.2.2 查看有 SBIT 权限,并且所属主有执行权限的目录的案例
具体的内容:
内容一:普通权限的管理
1.1 普通权限的介绍
1.1.1 对于文件而言
1) r 代表读权限
2) w 代表写权限
3) x 代表执行权限
1.1.2 对于目录而言
1) r 代表可以看到目录
2) w 代表可以对目录进行增、删、改、查和在里面创建文件和目录
3) x 代表可以进入目录
1.1.3 用数字代替权限的方法
1) 0 代表 —
2) 1 代表 –x
3) 2 代表 -w-
4) 3 代表 -wx
5) 4 代表 r–
6) 5 代表 r-x
7) 6 代表 rw-
8) 7 代表 rwx
1.2 管理权限案例
1.2.1 给一个文件或目录添加权限的案例
1.2.1.1 案例一
# chmod u+x test.txt
(补充:这里以给 test.txt 文件的所属主添加执行权限为例)
1.2.1.2 案例二
# chmod u+r,g+w test.txt
(补充:这里以给 test.txt 文件的所属主添加执行权限,给文件的所属组添加写权限)
1.2.1.3 案例三
# chmod +x test.txt
(补充:这里以给 test.txt 文件的所属主、所属组和其他用户添加执行权限)
1.2.1.4 案例四
# chmod a+x test.txt
(补充:这里以给 test.txt 文件的所属主、所属组和其他用户添加执行权限)
1.2.2 给一个文件或目录撤销权限的案例
1.2.2.1 案例一
# chmod u-x test.txt
(补充:这里以给 test.txt 文件的所属主撤销执行权限)
1.2.2.2 案例二
# chmod u-r,g-w test.txt
(补充:这里以给 test.txt 文件的所属主撤销执行权限,给文件的所属组撤销写权限)
1.2.2.3 案例三
# chmod -x test.txt
(补充:这里以给 test.txt 文件的所属主、所属组和其他用户撤销执行权限)
1.2.2.4 案例四
# chmod a-x test.txt
(补充:这里以给 test.txt 文件的所属主、所属组和其他用户撤销执行权限)
1.2.3 设定某一个文件或目录的权限的案例
1.2.3.1 案例一
# chmod u=rwx test.txt
(补充:这里以设置 test.txt 文件的所属主拥有读、写和执行的权限)
1.2.3.2 案例二
# chmod u=rw- test.txt
(补充:这里以设置 test.txt 文件的所属主拥有读和写的权限,但是没有执行的权限)
1.2.3.3 案例三
# chmod u=--- test.txt
(补充:这里以设置 test.txt 文件的所属主没有任何权限)
1.2.3.4 案例四
# chmod u=
(补充:这里以设置 test.txt 文件的所属主没有任何权限)
1.2.3.5 案例五
# chmod u=rw,g=, test.txt
(补充:这里以设置 test.txt 文件的所属主拥有读和写的权限,但是没有执行的权限。设置文件的所属组没有任何权限)
1.2.3.6 案例六
# chmod u=rw,g=---,0= test.txt
(补充:这里以设置 test.txt 文件的所属主拥有读和写的权限,但是没有执行的权限。设置文件的所属组没有任何权限。设置文件的其他用户没有任何权限)
1.2.3.7 案例七
# chmod 755 test.txt
(补充:这里以设置 test.txt 文件的所属主拥有读、写和执行的权限。设置文件的所属组有读和执行的权限。设置文件的其他用户有读和执行的权限)
内容二:特殊权限的管理
2.1 特殊权限 SUID
2.1.1 SUID 介绍
1) SUID:全名 Set UID
2) SUID 的作用:让没有此文件执行权限的用户,可以执行这个文件
3) SUID 的权限数字 4000
2.1.2 SUID 权限的添加的案例
2.1.2.1 添加 SUID 权限的案例
# chmod u+s test.txt
或者:
# chmod 4644 test.txt
(补充:这里以对 test.txt 文件进行操作为例)
2.1.2.2 查看 SUID 权限的添加情况的案例
2.1.2.2.1 查看有 SUID 权限,但是所属主没有执行权限的文件的案例
# ls -l test.txt
-rwSr--r-- 1 root root 0 12月 8 05:27 test.txt
(补充:这里以对 test.txt 文件进行操作为例)
2.1.2.2.2 查看有 SUID 权限,并且所属主有执行权限的文件的案例
# ls -l test.txt
-rwsr--r-- 1 root root 0 12月 8 05:27 test.txt
(补充:这里以对 test.txt 文件进行操作为例)
2.2 特殊权限 SGID
2.2.1 SGID 介绍
1) SGID:全名 Set GID
2) SGID 的作用:在此目录下创建的文件,将都和此目录的所属组一样
3) SGID 的权限数字 2000
2.2.2 SGID 权限的添加的案例
2.2.2.1 添加 SGID 权限的案例
# chmod g+s test
或者:
# chmod 2644 test
(补充:这里以对 test.txt 文件进行操作为例)
2.2.2.2 查看 SGID 权限的添加情况的案例
2.2.2.2.1 查看有 SGID 权限,但是所属组没有执行权限的目录的案例
# ls -l test
-rw-r-Sr-- 1 root root 0 12月 8 05:27 test
(补充:这里以对 test.txt 文件进行操作为例)
2.2.2.2.2 查看有 SGID 权限,并且所属组有执行权限的目录的案例
# ls -l test
-rw-r-sr-- 1 root root 0 12月 8 05:27 test
(补充:这里以对 test.txt 文件进行操作为例)
2.3 特殊权限 SBIT
2.3.1 SBIT 介绍
1) SBIT:全名 Sticky Bit
2) SBIT 的作用:在此目录下创建的文件,只有创建此文件的用户和 root 用户可以删除
3) SBIT 的权限数字 1000
2.3.2 SBIT 权限的添加的案例
2.3.2.1 添加 SBIT 权限的案例
# chmod o+t test
或者:
# chmod 1644 test
(补充:这里以对 test.txt 文件进行操作为例)
2.3.2.2 查看 SBIT 权限的添加情况的案例
2.3.2.2.1 查看有 SBIT 权限,但是所属主没有执行权限的目录的案例
# ls -l test
-rw-r--r-T 1 root root 0 12月 8 05:27 test
(补充:这里以对 test.txt 文件进行操作为例)
2.3.2.2.2 查看有 SBIT 权限,并且所属主有执行权限的目录的案例
# ls -l test
-rw-r--r-t 1 root root 0 12月 8 05:27 test
(补充:这里以对 test.txt 文件进行操作为例)
[实验] Redis 数据库集群 Redis 数据库的添加和删除
纪念:站主于 2019 年 11 月完成了此开源实验,并将过程中的所有命令经过整理和注释以后,形成以下教程
注意:
在给 Redis 数据库集群添加和删除 Redis 数据库之前要先搭建 Redis 数据库集群
软件准备:
在 Redis 的官网上下载软件 Redis:
在 rubygems 的官网上下载软件 rubygems
正文:
步骤目录:
步骤一:规划拓扑
1.1 服务器列表
1.2 服务器列表简介
步骤二:系统环境要求
步骤三:所有数据库服务器安装 Redis 数据库
3.1 安装 Redis 数据库的相关依赖包
3.2 安装 Redis 数据库
3.2.1 解压安装包
3.2.2 进入安装包目录
3.2.3 编译安装包
3.2.4 安装软件包
3.2.5 进入配置目录
3.2.6 安装软件包
步骤四:将 Redis 数据库添加到别的集群
4.1 修改所有服务器上的 Redis 数据库配置文件
4.2 重启所有服务器上的 Redis 数据库
4.2.1 关闭 Redis 数据库
4.2.2 开启 Redis 数据库
4.3 将 redis7 和 redis8 添加到现有的 Redis 集群中
4.3.1 查看现有集群的状况
4.3.2 添加 redis7 并将其视为主数据库
4.3.3 添加 redis8 并将其视为从数据库
4.3.4 确认 redis7 和 redis8 已经加入到了集群中
4.4 让新加入的 redis 数据库也能存储数据
4.4.1 重新分配集群的存储块
4.4.2 确认集群的存储块已经覆盖所有主数据库
步骤五:将部分 Redis 数据库从集群中删除
5.1 将存储块从要被删除的 redis 主数据库里拿走
5.2 将部分 Redis 数据库从集群中删除
5.2.1 将作为主库的 Redis 数据库从集群中删除
5.2.2 将作为从库的 Redis 数据库从集群中删除
5.3 确认部分 Redis 数据库已经从集群中删除
具体的操作步骤:
步骤一:规划拓扑
1.1 服务器列表
现有的 Redis 集群
redis7 IP 地址:192.168.1.57 端口号:1057
redis8 IP 地址:192.168.1.58 端口号:1058
(补充:在本次实验中现有的 redis 集群管理服务器是 redis1,IP 地址是 192.168.1.57,端口号是 1057)
1.2 服务器列表简介
redis7 作为主库 redis8 作为从库加入到一个现有的 Redis 集群中
步骤二:系统环境要求
1) 所有服务器的系统都需要是 CentOS 7 版本
2) 所有服务器都要关闭防火墙
3) 所有服务器都要关闭 SELinux
4) 所有服务器系统都要配置好可用的软件源
5) 需要按照拓扑图给对应的服务器配置好 IP 地址和主机名
6) 所有服务器都要可以相互 ping 通自己和对方的 IP 地址和主机名
(注意:现有的 Redis 集群因为已经是创建好了的,所以不用执行以上操作)
步骤三:所有数据库服务器安装 Redis 数据库
3.1 安装 Redis 数据库的相关依赖包
(分别在 redis7 和 redis8 上执行以下步骤)
# yum -y install gcc gcc-c++ make
3.2 安装 Redis 数据库
3.2.1 解压安装包
(分别在 redis7 和 redis8 上执行以下步骤)
# tar -zxf redis-5.0.5.tar.gz
(补充:这里要安装的 Redis 版本是 5.0.5)
3.2.2 进入安装包目录
(分别在 redis7 和 redis8 上执行以下步骤)
# cd redis-5.0.5/
(补充:这里要安装的 Redis 版本是 5.0.5)
3.2.3 编译安装包
(分别在 redis7 和 redis8 上执行以下步骤)
# make
3.2.4 安装软件包
(分别在 redis7 和 redis8 上执行以下步骤)
# make install
3.2.5 进入配置目录
(分别在 redis7 和 redis8 上执行以下步骤)
# cd utils/
3.2.6 安装软件包
(分别在 redis7 和 redis8 上执行以下步骤)
# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server]
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
步骤四:将 Redis 数据库添加到别的集群
4.1 修改所有服务器上的 Redis 数据库配置文件
(只在 redis7 上执行以下步骤)
# vim /etc/redis/6379.conf
将部分内容修改如下:
......
#bind 127.0.0.1
bind 192.168.1.57
......
port 1057
......
daemonize yes
......
pidfile /var/run/redis_1057.pid
......
cluster-enabled yes
......
cluster-config-file nodes-1057.conf
......
cluster-node-timeout 5000
......
(
补充:
1) 这里的 #bind 127.0.0.1 代表取消数据库可以被本地登录
2) 这里的 bind 192.168.1.57 是本机的 IP 地址
3) 这里的 port 1057 代表数据库使用到的端口是 1057,集群里的各个数据库端口号不能一样
4) 这里的 daemonize yes 代表以进程的形式启动
5) 这里的 pidfile /var/run/redis_1057.pid 代表使用的 PID 文件是 /var/run/redis_1057.pid,集群里的各个数据库 PID 文件不能一样
6) 这里的 cluster-enabled yes 代表启用集群,但是前面的 daemonize 必须也启用
7) 这里的 cluster-config-file nodes-1057.conf 代表使用的数据库配置文件是 nodes-1057.conf,集群里的各个数据库的配置文件不能一样
8) 这里的 cluster-node-timeout 5000 代表集群通信超时时间为 5000
)
(只在 redis8 上执行以下步骤)
# vim /etc/redis/6379.conf
将部分内容修改如下:
......
#bind 127.0.0.1
bind 192.168.1.58
......
port 1058
......
daemonize yes
......
pidfile /var/run/redis_1058.pid
......
cluster-enabled yes
......
cluster-config-file nodes-1058.conf
......
cluster-node-timeout 5000
......
(
补充:
1) 这里的 #bind 127.0.0.1 代表取消数据库可以被本地登录
2) 这里的 bind 192.168.1.58 是本机的 IP 地址
3) 这里的 port 1058 代表数据库使用到的端口是 1058,集群里的各个数据库端口号不能一样
4) 这里的 daemonize yes 代表以进程的形式启动
5) 这里的 pidfile /var/run/redis_1058.pid 代表使用的 PID 文件是 /var/run/redis_1058.pid,集群里的各个数据库 PID 文件不能一样
6) 这里的 cluster-enabled yes 代表启用集群,但是前面的 daemonize 必须也启用
7) 这里的 cluster-config-file nodes-1058.conf 代表使用的数据库配置文件是 nodes-1058.conf,集群里的各个数据库的配置文件不能一样
8) 这里的 cluster-node-timeout 5000 代表集群通信超时时间为 5000
)
4.2 重启所有服务器上的 Redis 数据库
4.2.1 关闭 Redis 数据库
(分别在 redis7 和 redis8 上执行以下步骤)
# redis-cli shutdown
4.2.2 开启 Redis 数据库
(分别在 redis7 和 redis8 上执行以下步骤)
# /etc/init.d/redis_6379 start
4.3 将 redis7 和 redis8 添加到现有的 Redis 集群中
4.3.1 查看现有集群的状况
(只在 redis1 上执行以下步骤)
# redis-cli --cluster check 192.168.1.51:1051
4.3.2 添加 redis7 并将其视为主数据库
(只在 redis1 上执行以下步骤)
# redis-cli --cluster add-node 192.168.1.57:1057 192.168.1.51:1051
4.3.3 添加 redis8 并将其视为从数据库
(只在 redis1 上执行以下步骤)
# redis-cli --cluster add-node 192.168.1.58:1058 192.168.1.51:1051 --cluster-slave
4.3.4 确认 redis7 和 redis8 已经加入到了集群中
(只在 redis1 上执行以下步骤)
# redis-cli --cluster check 192.168.1.51:1051
192.168.1.51:1051 (5d030ec0...) -> 1 keys | 5461 slots | 1 slaves.
192.168.1.53:1053 (c4f884e7...) -> 2 keys | 5461 slots | 1 slaves.
192.168.1.52:1052 (7477c04d...) -> 1 keys | 5462 slots | 1 slaves.
192.168.1.57:1057 (10bb6a57...) -> 0 keys | 0 slots | 1 slaves.
[OK] 4 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.51:1051)
M: 5d030ec05f9de86ebeedc1b035b2122addaa61d8 192.168.1.51:1051
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: eac6a0586ad00375bea9aa352951c784be57e9ad 192.168.1.55:1055
slots: (0 slots) slave
replicates 5d030ec05f9de86ebeedc1b035b2122addaa61d8
S: 93d8988475c754a3b58d5172522163664c391da2 192.168.1.58:1058
slots: (0 slots) slave
replicates 10bb6a5732f629ee62801417cb44ddb670e99e86
S: a5cddda6c1bc7c6d3397e17e1ba29571bb7a1657 192.168.1.54:1054
slots: (0 slots) slave
replicates c4f884e7e4ce6adb4f5bc4f6eb398680beb26089
M: c4f884e7e4ce6adb4f5bc4f6eb398680beb26089 192.168.1.53:1053
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: 7477c04d8ebf9d498ed5586d5f4e6d513fdb3c30 192.168.1.52:1052
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: 10bb6a5732f629ee62801417cb44ddb670e99e86 192.168.1.57:1057
slots: (0 slots) master
1 additional replica(s)
S: fd973bbcc376bfccf5888ba06dba97feb9ef1273 192.168.1.56:1056
slots: (0 slots) slave
replicates 7477c04d8ebf9d498ed5586d5f4e6d513fdb3c30
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
4.4 让新加入的 redis 数据库也能存储数据
4.4.1 重新分配集群的存储块
(只在 redis1 上执行以下步骤)
# redis-cli --cluster reshard 192.168.1.51:1051
......
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? 10bb6a5732f629ee62801417cb44ddb670e99e86
......
Source node #1: all
......
Do you want to proceed with the proposed reshard plan (yes/no)? yes
......
4.4.2 确认集群的存储块已经覆盖所有主数据库
(只在 redis1 上执行以下步骤)
# redis-cli --cluster check 192.168.1.51:1051
192.168.1.51:1051 (5d030ec0...) -> 0 keys | 4096 slots | 1 slaves.
192.168.1.53:1053 (c4f884e7...) -> 1 keys | 4096 slots | 1 slaves.
192.168.1.52:1052 (7477c04d...) -> 1 keys | 4096 slots | 1 slaves.
192.168.1.57:1057 (10bb6a57...) -> 2 keys | 4096 slots | 1 slaves.
[OK] 4 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.51:1051)
M: 5d030ec05f9de86ebeedc1b035b2122addaa61d8 192.168.1.51:1051
slots:[1365-5460] (4096 slots) master
1 additional replica(s)
S: eac6a0586ad00375bea9aa352951c784be57e9ad 192.168.1.55:1055
slots: (0 slots) slave
replicates 5d030ec05f9de86ebeedc1b035b2122addaa61d8
S: 93d8988475c754a3b58d5172522163664c391da2 192.168.1.58:1058
slots: (0 slots) slave
replicates 10bb6a5732f629ee62801417cb44ddb670e99e86
S: a5cddda6c1bc7c6d3397e17e1ba29571bb7a1657 192.168.1.54:1054
slots: (0 slots) slave
replicates c4f884e7e4ce6adb4f5bc4f6eb398680beb26089
M: c4f884e7e4ce6adb4f5bc4f6eb398680beb26089 192.168.1.53:1053
slots:[12288-16383] (4096 slots) master
1 additional replica(s)
M: 7477c04d8ebf9d498ed5586d5f4e6d513fdb3c30 192.168.1.52:1052
slots:[6827-10922] (4096 slots) master
1 additional replica(s)
M: 10bb6a5732f629ee62801417cb44ddb670e99e86 192.168.1.57:1057
slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
1 additional replica(s)
S: fd973bbcc376bfccf5888ba06dba97feb9ef1273 192.168.1.56:1056
slots: (0 slots) slave
replicates 7477c04d8ebf9d498ed5586d5f4e6d513fdb3c30
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
步骤五:将部分 Redis 数据库从集群中删除
(这里以删除 redis7 和 redis8 为例)
5.1 将存储块从要被删除的 redis 主数据库里拿走
(只在 redis1 上执行以下步骤)
# redis-cli --cluster reshard 192.168.1.51:1051
......
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? 5d030ec05f9de86ebeedc1b035b2122addaa61d8
......
Source node #1: 10bb6a5732f629ee62801417cb44ddb670e99e86
Source node #2: done
......
Do you want to proceed with the proposed reshard plan (yes/no)? yes
......
5.2 将部分 Redis 数据库从集群中删除
5.2.1 将作为主库的 Redis 数据库从集群中删除
(只在 redis1 上执行以下步骤)
# redis-cli --cluster del-node 192.168.1.57:1057 10bb6a5732f629ee62801417cb44ddb670e99e86
>>> Removing node 10bb6a5732f629ee62801417cb44ddb670e99e86 from cluster 192.168.1.57:1057
>>> Sending CLUSTER FORGET messages to the cluster...
5.2.2 将作为从库的 Redis 数据库从集群中删除
(只在 redis1 上执行以下步骤)
# redis-cli --cluster del-node 192.168.1.58:1058 023abbc600cd4fb1ca8bb7ce8c45099e186041f8
>>> Removing node 023abbc600cd4fb1ca8bb7ce8c45099e186041f8 from cluster 192.168.1.58:1058
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
5.3 确认部分 Redis 数据库已经从集群中删除
# redis-cli --cluster check 192.168.1.51:1051
192.168.1.51:1051 (5d030ec0...) -> 0 keys | 4096 slots | 1 slaves.
192.168.1.53:1053 (c4f884e7...) -> 1 keys | 4096 slots | 1 slaves.
192.168.1.52:1052 (7477c04d...) -> 1 keys | 4096 slots | 1 slaves.
[OK] 4 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.51:1051)
M: 5d030ec05f9de86ebeedc1b035b2122addaa61d8 192.168.1.51:1051
slots:[0-6826],[10923-12287] (4096 slots) master
1 additional replica(s)
S: eac6a0586ad00375bea9aa352951c784be57e9ad 192.168.1.55:1055
slots: (0 slots) slave
replicates 5d030ec05f9de86ebeedc1b035b2122addaa61d8
replicates 10bb6a5732f629ee62801417cb44ddb670e99e86
S: a5cddda6c1bc7c6d3397e17e1ba29571bb7a1657 192.168.1.54:1054
slots: (0 slots) slave
replicates c4f884e7e4ce6adb4f5bc4f6eb398680beb26089
M: c4f884e7e4ce6adb4f5bc4f6eb398680beb26089 192.168.1.53:1053
slots:[12288-16383] (4096 slots) master
1 additional replica(s)
M: 7477c04d8ebf9d498ed5586d5f4e6d513fdb3c30 192.168.1.52:1052
slots:[6827-10922] (4096 slots) master
1 additional replica(s)
S: fd973bbcc376bfccf5888ba06dba97feb9ef1273 192.168.1.56:1056
slots: (0 slots) slave
replicates 7477c04d8ebf9d498ed5586d5f4e6d513fdb3c30
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[命令] Linux 命令 find (查找文件或目录)
内容目录:
内容一:find 格式
内容二:find 选项
内容三:find 参数
3.1 匹配名称的参数
3.2 匹配属性的参
3.3 匹配所有者的参数
3.4 匹配权限的参数
3.5 匹配时间的参数
3.6 匹配大小的参数
3.7 匹配目录的参数
3.8 匹配格式化方式的参数
3.9 逻辑匹配参数
内容四:find 的使用案例
4.1 案例一:匹配名称的参数
4.2 案例二:匹配属性的参
4.3 案例三:匹配所有者的参数
4.3.1 从当前目录开始查找所属主是 root 的文件和目录
4.3.2 从当前目录开始查找没有所属主和所属组的文件和目录
4.3.3 查找所有所属主是 natasha 的文件并将它们复制到 /root/findfiles 目录下
4.4 案例四:匹配权限的参数
4.4.1 从当前目录开始查找所有权限为 0777 的文件,并将其显示出来
4.4.2 从当前目录开始查找权限为 222 的文件
4.4.3 从当前目录开始查找有任何执行权限的文件和目录
4.4.4 查找所有包含特殊权限的文件和目录
4.5 案例五:匹配时间的参数
4.5.1 从当前目录开始查找 10 天内被修改过的文件
4.5.2 从 /var/log/mysql 目录开始查找在过去 3 天被修过的文件和目录,并在确认后将其删除
4.6 案例六:匹配大小的参数
4.6.1 从当前目录开始查找所有大小为 0 的文件,并将其显示出来
4.6.2 从当前目录开始查找所有大小为 0 的文件
4.7 案例七:匹配目录的参数
4.8 案例八:匹配格式化方式的参数
4.9 案例九:逻辑匹配参数
4.9.1 从当前目录开始查找以 “.txt” 结尾和以 “.dox” 结尾的文件
4.9.2 从当前目录开始查找权限不是 777 的文件
4.9.3 从当前目录开始查找权限为 2000 和 4000 的文件,并分析文件属性
具体的内容:
内容一:find 格式
# find <directory> <parameter> <parameter> ...... -print <-exec|-ok> <command|file> {<command>} \;
内容二:find 选项
1) 目录 指需要查找的目录
2) 参数 限制匹配的条件,可以有多个
3) -print 将匹配的结果进行标准输出
4) -exec 对匹配的结果执行后面的步骤
5) -ok 和 -exec 的作用相同,只不过每执行一步就需要用户确认一下
6) command 对匹配的结果执行命令
7) file 对匹配的结果进行文件种类分析,后面的 {} 里的命令必须为空
8) 命令 对匹配结果要执行的命令
(注意:<-exec|-ok> {} \;,这是一个固定格式,谁也不能被缺少。并且 {<命令>} 和 \ 之间有一个空格)
内容三:find 参数
3.1 匹配名称的参数
1) -name n 名称是 n 的文件或目录
2) -iname n 名称是 n 的文件或目录,并且忽略大小写
3) -lname n 名称是 n 的链接
(注意:在 3) 参数中,n 是被链接文件的名称而不是链接文件本身的名称)
3.2 匹配属性的参
-type n :文件类型是 n 的文件
(补充:这里的 n 可以是 d、f、l,它们分别代表目录、文件、链接)
3.3 匹配所有者的参数
1) -uid n 所属 gid 是 n 的文件或目录
2) -user n 所属主名称为 n 的文件或目录
3) -gid n 所属 gid 是 n 的文件或目录
4) -group n 所属组名称为 n 的文件或目录
5) -nouser 匹配无所属主的文件或目录
6) -nogroup 匹配无所属组的文件或目录
3.4 匹配权限的参数
1) -perm /u=n 所属主权限是 n 的文件或目录
2) -perm /u=n 所属组权限是 n 的文件或目录
3) -perm /o=n 所其他的权限是 n 的文件或目录
(补充:在以上 1) 到 3) 参数中 n 可以是 r、w、x 它们分别代表读权限、写权限、执行权限)
4) -perm -n 所属主、所属组、其他的权限是 n 的文件或目录
(补充:在 (4 参数中 n 是可以是 1、2、4)
5) -perm nnn 权限是 nnn 的文件或目录
(
补充:
在 5) 参数中:
n 是数字
第一个 n 是特殊权限
第二个 n 是所属主的权限
第三个 n 是所属组的权限
第四个 n 是其他的权限
例:600
)
6) -perm nnnn 权限是 nnnn 的文件或目录
(
补充:
在 6) 参数中:
n 是数字
第一个 n 是特殊权限
第二个 n 是所属主的权限
第三个 n 是所属组的权限
第四个 n 是其他的权限
例:0600
)
3.5 匹配时间的参数
1) -amin n 在过去 n 分钟内被读取过的文件或目录
2) -anewer file 比文件 file 更晚被读取过的文件或目录
3) -atime n 在过去 n 天内被读取过的文件或目录
4) -mmin n 在过去 n 分钟内被修改过内容的文件或目录
5) -mnewer file 比文件 file 更晚被修改过内容的文件或目录
6) -mtime n 在过去 n 天内被修改过内容的文件或目录
7) -cmin n 在过去 n 分钟内被修改过属性(比如新建)的文件或目录
8) -cnewer file 比文件 file 更晚被修改过属性(比如新建)的文件或目录
9) -ctime n 在过去 n 天内被修改过属性(比如新建)的文件或目录
(补充:在以上 1) 到 9) 参数中 n 是数字, +n 表示 n 以前,-n 表示 n 以内,n 表示第 n)
3.6 匹配大小的参数
1) -empty 为空的文件或目录
2) -size n 文件大小是 n 的文件或目录
(补充:在 2) 参数中 n 是数字, +n 表示比 n 大,-n 表示比 n 小,单位有 b、m、g 等)
3.7 匹配目录的参数
1) -path ‘n’ 路径名称符合 n 的文件或目录
2) -ipath ‘n’ 路径名称符合 n 的文件或目录,并且忽略大小写
3) -depth n 路径深度为 n 的文件或目录
4) -maxdepth n 最大路劲深度为 n 的文件或目录
(补充:在以上 1) 到 4) 参数中 n 是数字)
3.8 匹配格式化方式的参数
1) -fstype n 匹配硬盘格式为 n 文件或目录
(补充:1) 参数中 n 可以是 ext3、ext4、xfs 等硬盘格式)
2) -mount 是被挂载的文件或目录
3.9 逻辑匹配参数
1) -not 不匹配后面的参数,需要放在其他参数前面
2) ! 不匹配后面的参数,需要放在其他参数前面
3) -a 和,需要放在两个参数之前
4) -and 和,需要放在两个参数之前
5) -o 或,需要放在两个参数之前
6) -or 或,需要放在两个参数之前
7) <参数> ( <参数> n <参数> ) 指定将某两个参数作为一个整体和另一个逻辑参数进行匹配
8) <参数> -prune -n <参数> <参数> 指定某两个参数进行逻辑匹配
(补充:在以上 7) 到 8) 参数中 n 可以是 -a、-and、-o、-or 以上 3) 到 6) 参数)
内容四:find 的使用案例
4.1 案例一:匹配名称的参数
从当前目录开始查找以 txt 结尾的文件和目录
# find . -name "*\.txt"
4.2 案例二:匹配属性的参
从当前目录开始查找目录
# find . -type d
4.3 案例三:匹配所有者的参数
4.3.1 从当前目录开始查找所属主是 root 的文件和目录
# find . -user root
4.3.2 从当前目录开始查找没有所属主和所属组的文件和目录
# find . -nouser -o -nogroup
4.3.3 查找所有所属主是 natasha 的文件并将它们复制到 /root/findfiles 目录下
# find find / -user natasha -exec cp -rp {} /root/findfiles/ \;
4.4 案例四:匹配权限的参数
4.4.1 从当前目录开始查找所有权限为 0777 的文件,并将其显示出来
# find . -type f -perm 0777 -exec ls -l {}\;
4.4.2 从当前目录开始查找权限为 222 的文件
# find . -type f -perm -2
4.4.3 从当前目录开始查找有任何执行权限的文件和目录
# find . -perm /a=x
4.4.4 查找所有包含特殊权限的文件和目录
# find / -type f \( -perm -1000 -o -perm -2000 -o -perm -4000 \) -print
4.5 案例五:匹配时间的参数
4.5.1 从当前目录开始查找 10 天内被修改过的文件
# find . -ctime -10
4.5.2 从 /var/log/mysql 目录开始查找在过去 3 天被修过的文件和目录,并在确认后将其删除
# find /var/log/mysql -type f -mtime +3 -ok rm {}\;
4.6 案例六:匹配大小的参数
4.6.1 从当前目录开始查找所有大小为 0 的文件,并将其显示出来
# find . -type f -size 0 -exec ls -l {} \;
4.6.2 从当前目录开始查找所有大小为 0 的文件
# find . -type f -empty
4.7 案例七:匹配目录的参数
从 / 目录和 /proc/ 目录开始查找文件格式为 ext3 无所属主或所属组的文件和目录
# find / -path '/proc/*' -prune -o -fstype ext3 -nouser -o -nogroup
4.8 案例八:匹配格式化方式的参数
从 \ 目录开始查找以
# find . -type f
4.9 案例九:逻辑匹配参数
4.9.1 从当前目录开始查找以 “.txt” 结尾和以 “.dox” 结尾的文件
# find . -type f \( -name "*.txt" -or -name "*.dox" \)
4.9.2 从当前目录开始查找权限不是 777 的文件
# find . -type f ! -perm 777
4.9.3 从当前目录开始查找权限为 2000 和 4000 的文件,并分析文件属性
# find . -type f \( -perm -2000 -o -perm -4000 \) -exec file {} \;
[工具] Shell 批量检测服务器 TCP 端口的联通状态 (telnet 版)
介绍:
作者:朱明宇
名称:批量检测服务器 TCP 端口的联通状态
作用:批量检测服务器 TCP 端口的联通状态,并将此服务器无法联通的端口存储到 $checklist 文件里
使用方法:
1. 将此脚本和端口清单 $portlist 文件放在同一目录下
2. 端口清单 $portlist 每一个端口占用一行,格式为:<要联通端口号对应的 IP 地址>:<要联通的端口号>:<端口功能>,并和此脚本放在同一目录下
3. 在此脚本的分割线内写入相应的内容
4. 给此脚本添加执行权限
5. 执行此脚本,并将要测试的服务器 IP 地址跟在脚本的后面,例:. <脚本名> <服务器 IP 地址 1> <服务器 IP 地址 2> ……
脚本分割线里的变量:
1. portlist=tcp_ports.txt #存放要测试的 TCP 端口的文件
2. checklist=tcp_ports_checklist.txt #存放测试结果的文件
注意:
1. 此脚本执行前必须要先保证执行本脚本的用户能无密码 ssh 远程这些远程服务器
2. 此脚本会清空 $checklist
3. 执行此脚本前确保 telnet 命令已经安装
4. 执行此脚本可能有些慢
脚本:
#!/bin/bash
####################### Separator ########################
portlist=tcp_ports.txt
checklist=tcp_ports_checklist.txt
####################### Separator ########################
echo > $checklist
maxnum=`cat $portlist | wc -l`
for hosts in $*
do
echo $hosts >> $checklist
for i in `seq 1 $maxnum`
do
ips=`sed -n $[i]p $portlist | awk -F':' '{print $1}'`
ports=`sed -n $[i]p $portlist | awk -F':' '{print $2}'`
remarks=`sed -n $[i]p $portlist | awk -F':' '{print $3}'`
ssh $hosts "(sleep 1;) | telnet $ips $ports 2>&1" | grep 'timed out' >> $checklist
if [ $? == 0 ];then
echo "`sed -n $[i]p $portlist`" >> $checklist
echo >> $checklist
fi
done
echo >> $checklist
done