Linux grep和find使用方法和区别(四)

在linux下面工作,有些命令能够大大提高效率。本文就向大家介绍find、grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们。本文结构如下:

  • find命令
    • find命令的一般形式
    • find命令的常用选项及实例
    • find与xargs
  • grep命令
    • grep命令的一般形式
    • grep正则表达式元字符集(基本集)
    • grep命令的常用选项及实例

一、find命令

find命令是一个无处不在命令,是linux中最有用的命令之一。find命令用于:在一个目录(及子目录)中搜索文件,你可以指定一些匹配条件,如按文件名、文件类型、用户甚至是时间戳查找文件。下面就通过实例来体验下find命令的强大。

1.1 find命令的一般形式

man文档中给出的find命令的一般形式为:

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path…] [expression]

其实[-H] [-L] [-P] [-D debugopts] [-Olevel]这几个选项并不常用,上面的find命令的常用形式可以简化为:

find [path…] [expression]
  • path:find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录
  • expression:expression可以分为——“-options [-print -exec -ok …]”
  • -options,指定find命令的常用选项,下节详细介绍
  • -print,find命令将匹配的文件输出到标准输出
  • -exec,find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ { } ;,注意{ }和;之间的空格
    find ./ -size 0 -exec rm {} ; 删除文件大小为零的文件 (还可以以这样做:rm -i find ./ -size 0 或 find ./ -size 0 | xargs rm -f &)
    为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中:find . -type f -exec ls -l { } ;
    在/logs目录中查找更改时间在5日以前的文件并删除它们:find /logs -type f -mtime +5 -exec rm { } ;
  • -ok,和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
    find . -name “*.conf” -mtime +5 -ok rm { } ; 在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示

也有人这样总结find命令的结构:

find start_directory test 
     options 
     criteria_to_match 
     action_to_perform_on_results

1.2 find命令的常用选项及实例

  • -name
    按照文件名查找文件。
    find /dir -name filename 在/dir目录及其子目录下面查找名字为filename的文件
    find . -name “*.c” 在当前目录及其子目录(用“.”表示)中查找任何扩展名为“c”的文件
find /dir -name filename
find . name ".c"
  • -perm
    按照文件权限来查找文件。
    find . -perm 755 –print 在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件

  • -prune
    使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
    find /apps -path “/apps/bin” -prune -o –print 在/apps目录下查找文件,但不希望在/apps/bin目录下查找
    find /usr/sam -path “/usr/sam/dir1” -prune -o –print 在/usr/sam目录下查找不在dir1子目录之内的所有文件

  • -user
    按照文件属主来查找文件。
    find ~ -user sam –print 在$HOME目录中查找文件属主为sam的文件

  • -group
    按照文件所属的组来查找文件。
    find /apps -group gem –print 在/apps目录下查找属于gem用户组的文件

  • -mtime -n +n
    按照文件的更改时间来查找文件, – n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。
    find / -mtime -5 –print 在系统根目录下查找更改时间在5日以内的文件
    find /var/adm -mtime +3 –print 在/var/adm目录下查找更改时间在3日以前的文件

  • -nogroup
    查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
    find / –nogroup -print

  • -nouser
    查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
    find /home -nouser –print

  • -newer file1 ! file2
    查找更改时间比文件file1新但比文件file2旧的文件。

  • -type
    查找某一类型的文件,诸如:

b – 块设备文件。
d – 目录。
c – 字符设备文件。
p – 管道文件。
l – 符号链接文件。
f – 普通文件。

find /etc -type d –print 在/etc目录下查找所有的目录
find . ! -type d –print 在当前目录下查找除目录以外的所有类型的文件
find /etc -type l –print 在/etc目录下查找所有的符号链接文件

  • -size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
    find . -size +1000000c –print 在当前目录下查找文件长度大于1 M字节的文件
    find /home/apache -size 100c –print 在/home/apache目录下查找文件长度恰好为100字节的文件
    find . -size +10 –print 在当前目录下查找长度超过10块的文件(一块等于512字节)

  • -depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
    find / -name “CON.FILE” -depth –print 它将首先匹配所有的文件然后再进入子目录中查找

  • -mount:在查找文件时不跨越文件系统mount点。
    find . -name “*.XC” -mount –print 从当前目录开始查找位于本文件系统中文件名以XC结尾的文件(不进入其他文件系统)

  • -follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。

1.3 find与xargs

在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;

而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

来看看xargs命令是如何同find命令一起使用的,并给出一些例子。

  • find . -type f -print | xargs file 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件

  • find / -name “core” -print | xargs echo “” >/tmp/core.log 在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:

  • find . -type f -print | xargs grep “hostname” 用grep命令在所有的普通文件中搜索hostname这个词

  • find ./ -mtime +3 -print|xargs rm -f –r 删除3天以前的所有东西 (find . -ctime +3 -exec rm -rf {} ;)

  • find ./ -size 0 | xargs rm -f & 删除文件大小为零的文件

find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。

二、grep命令

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

2.1 grep命令的一般选项及实例

grep [OPTIONS] PATTERN [FILE…]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]

grep命令用于搜索由Pattern参数指定的模式,并将每个匹配的行写入标准输出中。这些模式是具有限定的正则表达式,它们使用ed或egrep命令样式。如果在File参数中指定了多个名称,grep命令将显示包含匹配行的文件的名称。对 shell 有特殊含义的字符 ($, *, [, |, ^, (, ), ) 出现在 Pattern参数中时必须带双引号。如果 Pattern参数不是简单字符串,通常必须用单引号将整个模式括起来。在诸如 [a-z], 之类的表达式中,-(减号)cml 可根据当前正在整理的序列来指定一个范围。整理序列可以定义等价的类以供在字符范围中使用。如果未指定任何文件,grep会假定为标准输入。

2.2 grep正则表达式元字符集(基本集)

^ 锚定行的开始 如:’^grep’匹配所有以grep开头的行。

$ 锚定行的结束 如:’grep$’匹配所有以grep结尾的行。

. 匹配一个非换行符的字符 如:’gr.p’匹配gr后接一个任意字符,然后是p。

* 匹配零个或多个先前字符 如:’ grep’匹配所有一个或多个空格后紧跟grep的行。 .一起用代表任意字符。

[] 匹配一个指定范围内的字符,如'[Gg]rep’匹配Grep和grep。

[^] 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep’匹配不包含A-F和H-Z的一个字母开头,紧跟rep的行。

(..) 标记匹配字符,如:’(love)’,love被标记为1。

< 锚定单词的开始,如:’<grep’匹配包含以grep开头的单词的行。

> 锚定单词的结束,如’grep>’匹配包含以grep结尾的单词的行。

x{m} 连续重复字符x,m次,如:’o{5}’匹配包含连续5个o的行。

x{m,} 连续重复字符x,至少m次,如:’o{5,}’匹配至少连续有5个o的行。

x{m,n} 连续重复字符x,至少m次,不多于n次,如:’o{5,10}’匹配连续5–10个o的行。

w 匹配一个文字和数字字符,也就是[A-Za-z0-9],如:’Gw*p’匹配以G后跟零个或多个文字或数字字符,然后是p。

W w的反置形式,匹配一个非单词字符,如点号句号等。W*则可匹配多个。

b 单词锁定符,如: ‘bgrepb’只匹配grep,即只能是grep这个单词,两边均为空格。

2.3 grep命令的常用选项及实例

-?

同时显示匹配行上下的?行,如:grep -2 pattern filename同时显示匹配行的上下2行。

-b,–byte-offset

打印匹配行前面打印该行所在的块号码。

-c,–count

只打印匹配的行数,不显示匹配的内容。

-f File,–file=File

从文件中提取模板。空文件中包含0个模板,所以什么都不匹配。

-h,–no-filename

当搜索多个文件时,不显示匹配文件名前缀。

-i,–ignore-case

忽略大小写差别。

-q,–quiet

取消显示,只返回退出状态。0则表示找到了匹配的行。

-l,–files-with-matches

打印匹配模板的文件清单。

-L,–files-without-match

打印不匹配模板的文件清单。

-n,–line-number

在匹配的行前面打印行号。

-s,–silent

不显示关于不存在或者无法读取文件的错误信息。

-v,–revert-match

反检索,只显示不匹配的行。

-w,–word-regexp

如果被<和>引用,就把表达式做为一个单词搜索。

-V,–version

显示软件版本信息。

=====

  • ls -l | grep ‘^a’ 通过管道过滤ls -l输出的内容,只显示以a开头的行。

  • grep ‘test’ d* 显示所有以d开头的文件中包含test的行。

  • grep ‘test’ aa bb cc 显示在aa,bb,cc文件中匹配test的行。

  • grep ‘[a-z]’ aa 显示所有包含每个字符串至少有5个连续小写字符的字符串的行。

  • grep ‘w(es)t.’ aa 如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.),这些字符后面紧跟着另外一个es(),找到就显示该行。如果用egrep或grep -E,就不用””号进行转义,直接写成’w(es)t.*’就可以了。

  • grep -i pattern files :不区分大小写地搜索。默认情况区分大小写

  • grep -l pattern files :只列出匹配的文件名,

  • grep -L pattern files :列出不匹配的文件名,

  • grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’),

  • grep -C number pattern files :匹配的上下文分别显示[number]行,

  • grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,

  • grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。

Linux查找含有某字符串的所有文件

如果你想在当前目录下 查找”hello,world!”字符串,可以这样:

grep -rn "hello,world!" *
  • * : 表示当前目录所有文件,也可以是某个文件名
  • -r 是递归查找
  • -n 是显示行号
  • -R 查找所有文件包含子目录
  • -i 忽略大小写

下面是一些有意思的命令行参数:

  • grep -i pattern files :不区分大小写地搜索。默认情况区分大小写,
  • grep -l pattern files :只列出匹配的文件名,
  • grep -L pattern files :列出不匹配的文件名,
  • grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’),
  • grep -C number pattern files :匹配的上下文分别显示[number]行,
  • grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,
  • grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。

这里还有些用于搜索的特殊符号:

  • < 和 > 分别标注单词的开始与结尾。

例如:

  • grep man * 会匹配 ‘Batman’、‘manic’、‘man’等,

  • grep ‘<man’ * 匹配‘manic’和‘man’,但不是‘Batman’,

  • grep ‘<man>’ 只匹配‘man’,而不是‘Batman’或‘manic’等其他的字符串。

  • ‘^’:指匹配的字符串在行首,

  • ‘$’:指匹配的字符串在行尾,

Ubuntu16.04安装vsftpd,搭建ftp服务

Ubuntu16为例:

1、有问题时完全卸载vsftpd

sudo apt-get purge vsftpd

2、安装vsftpd

udo apt-get install vsftpd

3、创建ftp用户

方法一:直接在系统设置添加用户

方法二:

创建用户目录 sudo mkdir /home/uftp

创建用户 sudo useradd -d /home/uftp -s /bin/bash uftp //uftp就是用户名称

修改密码 sudo passwd uftp //输入不显示

sudo chown uftp:uftp /home/uftp //修改完成后将目录/home/uftp的所属者和所属组都改为uftp,否则无权上传

4、配置vsftpd.conf,输入错误可以按ctrl加z键退出

sudo vi /etc/vsftpd.conf

编辑vsftpd.conf文件

write_enable=YES
//write_enable=YES前面的#号删除。按x删除,按esc退出编辑,按shift键加:号,输入wq保存或者wq!强制保存。注意为英文半角符号

5、启动停止重启服务

sudo /etc/init.d/vsftpd start //启动
sudo /etc/init.d/vsftpd stop //停止
sudo /etc/init.d/vsftpd restart //重启

Vsftpd使用MySQL验证实验

实验环境:

操作系统:CentOS 6.5 64位

未分类

实验步骤:

第1步:安装vsftpd并测试可用性(在vsftp.xruan.com,192.168.0.12上执行)

[root@CentOS6lsrv02 ~]# yum install -y vsftpd
[root@CentOS6lsrv02 ~]# yum install -y lftp
[root@CentOS6lsrv02 ~]# lftp 192.168.0.12
lftp 192.168.0.12:~>

第2步:安装mysql-server并创建用户和表(在mysql.xruan.com,192.168.0.11上执行)

[root@CentOS6lsrv01 ~]# yum install -y mysql-server &> /dev/null
[root@CentOS6lsrv01 ~]# rpm -q mysql-server
mysql-server-5.1.71-1.el6.x86_64

启动mysqld服务

[root@CentOS6lsrv01 ~]# service mysqld start
Initializing MySQL database:  WARNING: The host 'CentOS6lsrv01' could notbe looked up with resolveip.
This probably means that your libc libraries arenot 100 % compatible
with this binary MySQL version. The MySQLdaemon, mysqld, should work
normally with the exception that host nameresolving will not work.
This means that you should use IP addressesinstead of hostnames
when specifying MySQL privileges !
Installing MySQL system tables...
OK
Filling help tables...
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right placefor your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQLroot USER !
To do so, start the server, then issue thefollowing commands:

/usr/bin/mysqladmin -u root password'new-password'
/usr/bin/mysqladmin -u root -h CentOS6lsrv01password 'new-password'

Alternatively you can run:
/usr/bin/mysql_secure_installation

which will also give you the option of removingthe test
databases and anonymous user created bydefault.  This is
strongly recommended for production servers.

See the manual for more instructions.

You can start the MySQL daemon with:
cd /usr ; /usr/bin/mysqld_safe &

You can test the MySQL daemon withmysql-test-run.pl
cd /usr/mysql-test ; perl mysql-test-run.pl

Please report any problems with the/usr/bin/mysqlbug script!

                                                             [ OK  ]
Starting mysqld:                                          [  OK  ]

运行 /usr/bin/mysql_secure_installation 按提示设置好mysql中root用户密码,这里我设置为“xruan”。

创建数据库并授予用户权限

mysql> CREATE DATABASE vsftpd;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL ON vsftpd.* TO vsftpd@'%'IDENTIFIED BY 'passwd';
Query OK, 0 rows affected (0.00 sec)
mysql> use vsftpd
Database changed

创建表

mysql> create table users (
    ->id int AUTO_INCREMENT NOT NULL,
    ->name char(20) binary NOT NULL,
    ->password char(50) binary NOT NULL,
    ->primary key(id)
    ->);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into users(name,password) values('xruan',password('xruan'));    插入1行用户信息
Query OK, 1 row affected (0.00 sec)
mysql> insert into users(name,password) values('redhat',password('redhat'));    插入1行用户信息
Query OK, 1 row affected (0.00 sec)
mysql> FLUSH PRIVILEGES;    刷新权限
Query OK, 0 rows affected (0.00 sec)

第3步:配置vsftpd基于MySQL表的虚拟用户(在vsftp.xruan.com,192.168.0.12上执行)

首先必须完成基于MySQL表的认证,需要通过pam_mysql模块实现,先安装pam_mysql

先安装epel源

到官方网站下载epel源的rpm安装包

https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
[root@CentOS6lsrv02 ~]# rpm -ivh epel-release-latest-6.noarch.rpm
[root@CentOS6lsrv02 ~]# yum install -y pam_mysql &> /dev/null
[root@CentOS6lsrv02 pam.d]# rpm -q pam_mysql
pam_mysql-0.7-0.12.rc1.el6.x86_64

建立pam认证所需要的配置文件(/etc/pam.d/vsftpd.mysql)

[root@CentOS6lsrv02 ~]# vi /etc/pam.d/vsftpd.mysql
auth required /lib64/security/pam_mysql.souser=vsftpd passwd=passwd host=192.168.0.11 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required /lib64/security/pam_mysql.souser=vsftpd passwd=passwd host=192.168.0.11 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

创建虚拟用户映射的系统用户

[root@CentOS6lsrv02 ~]# useradd -r -s /sbin/nologin vuser -d /var/ftproot
[root@CentOS6lsrv02 ~]# mkdir /var/ftproot
[root@CentOS6lsrv02 var]# chown vuser:vuser ftproot

编辑vsftpd配置文件 /etc/vsftpd/vsftpd.conf ,按如下设置:

listen=YES
anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
chroot_local_user=YES
guest_enable=YES
guest_username=vuser
pam_service_name=vsftpd.mysql
user_config_dir=/etc/vsftpd/vusers_config

为每个用户单独提供配置文件

user_config_dir=/etc/vsftpd/vusers_config  #在主配置文件(/etc/vsftpd/vsftpd.conf)中添加这个选项
[root@CentOS6lsrv02 vsftpd]# mkdir/etc/vsftpd/vusers_config
[root@CentOS6lsrv02 vsftpd]# vi vusers_config/xruan      #设置xruan用户有所有权限
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@CentOS6lsrv02 vsftpd]# vi vusers_config/redhat     #设置redhat用户只有upload权限
anon_upload_enable=YES

重启vsftpd服务

[root@CentOS6lsrv02 vsftpd]# service vsftpd restart
Shutting down vsftpd:                                      [ OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]

第4步:测试

[root@CentOS6lsrv02 vsftpd]# lftp -u xruan 192.168.0.12    <--使用xruan用户登录
Password:
lftp [email protected]:~> lcd /etc 
lcd ok, local cwd=/etc
lftp [email protected]:/> put fstab    <--可以上传文件
1224 bytes transferred
lftp [email protected]:~> rm fstab
rm ok, `fstab' removed   可以删除文件

[root@CentOS6lsrv02 vsftpd]# lftp -u redhat 192.168.0.12       <--使用redhat用户登录
Password:
lftp [email protected]:~> lcd /etc
lcd ok, local cwd=/etc lftp [email protected]:/>put selinux/config    <--可以上传文件
457 bytes transferred
lftp [email protected]:/> rm config
rm: Access failed: 550 Permission denied.(config)     <--不能删除文件

到此,实验成功!!!!!

实验—–实现基于文件验证的vsftpd虚拟用户

准备安装包:yum install vsftpd

启动服务: systemctl start vsftpd

步骤:

一、创建虚拟用户数据库文件

①编辑文本文件

vim /etc/vsftpd/ftpuser.txt   奇数行是用户名,偶数行是密码
    ftpuser1
    123456
    ftpuser2
    123456    

②此文件需要被编码为hash格式

cd /etc/vsftpd/
db_load -T -t hash -f ftpuser.txt ftpuser.db  编码为hash格式
chmod 600 ftpser.db               为了安全修改权限
file ftpuser.db                查看文件格式

未分类

二、创建系统用户和访问FTP目录

①useradd -r -m -d /var/ftproot -s /sbin/nologin ftpuser 即/var/ftproot是根目录

②chmod 555 /var/ftproot/ 根目录上不能有写权限,否则不能登录

③mkdir /var/ftproot/upload 创建子目录,方便用户访问

④setfacl -m u:ftpuser:rwx /var/ftproot/upload 给予系统用户对该目录的rwx权限

三、创建pam配置文件,用来完成用户认证

vim /etc/pam.d/vsftpd.db
    auth required pam_userdb.so db=/etc/vsftpd/ftpuser[.db]  
    account required pam_userdb.so db=/etc/vsftpd/ftpuser[.db]
     后缀db可省略,会自动识别

未分类

四、编辑vsftpd配置文件,指定pam配置文件

vim /etc/vsftpd/vsftpd.conf

添加下面两行

guest_enable=YES
guest_username=ftpuser       映射为系统用户ftpuser

修改下行:

pam_service_name=vsftpd.db     pam配置文件

五、SELinux设置

禁用selinu,或者setenforce 0

六、虚拟用户建立独立的配置文件

说明:vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可。

①mdkir /etc/vsftpd/ftpuser.d/ 创建配置文件存放的路径

②编辑vsftp配置文件,指明用户配置文件路径:

vim /etc/vsftpd/vsftpd.conf
    user_config_dir=/etc/vsftpd/ftpuser.d/

③创建用户ftpuser1自已的配置文件,登陆目录为默认目录

(/var/ftproot/)
  vim /etc/vsftpd/ftpuser.d/ftpuser1     文件名同用户名
    anon_upload_enable=YES        支持上传
    anon_mkdir_write_enable=YES       支持创建文件夹

实现效果:wang用户连接ftp登陆之后,进入upload目录可以上传文件和创建文件夹了

④创建用户ftpuser2的配置文件,实现登陆目录改变至指定目录

mkdir /var/ftproot2;chmod 555 /var/ftproot2   作为ftpuser2的登陆目录
 vim /etc/vsftpd/ftpuser.d/ftpuser2 
    local_root=/var/ftproot2       登录目录改变至指定的目录

七、重启vsftpd服务

systemctl restart vsftpd

八、客户端测试:需要事先安装ftp客户端工具(yum install ftp)

①ftp 192.168.199.140(vsftpd服务器ip)

使用ftpuser1登陆,可以使用put上传文件并且可以创建文件夹。效果如下:

未分类

②ftp 192.168.199.140

使用ftpuser2登陆,使用ls看不到任何文件,说明已经更改登陆目录,效果如下:

未分类

CentOS7上搭建FTP服务+VSFTPD配置全解析

FTP 服务

   FTP是早期的应用级协议之一,是一种基于C/S结构的双通道协议。

   可以作为FTP服务器的软件有很多,比如Wu-ftpd,Proftpd,Pureftpd,ServU,IIS,都可以。其中vsftpd是CentOS默认的FTP服务器。也是我们今天的主角,接下来将会进行重点介绍。   既然是一种C/S结构的应用,有服务端就会有客户端。在Linux平台上可以作为FTP客户端的软件也有很多,诸如ftp,lftp,lftpget,wget,curl等。在Windows上也有很多的图形界面客户端,例如 filezilla,CuteFtp,FlashFXP,LeapFtp 等。

FTP 用户认证

FTP 的用户一共有三种类型

  • 匿名用户:ftp,anonymous,对应Linux用户ftp
  • 系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
  • 虚拟用户:特定服务的专用用户,独立的用户名/密码文件

VSFTPD服务

  • vsftpd 服务,由vsftpd包提供,直接使用yum安装就可以。
  • 用户认证配置文件:/etc/pam.d/vsftpd
  • 服务脚本: /usr/lib/systemd/system/vsftpd.service,/etc/rc.d/init.d/vsftp
  • 配置文件:/etc/vsftpd/vsftpd.conf
  • 匿名用户(映射为系统用户ftp )共享文件位置:/var/ftp
  • 系统用户共享文件位置:用户家目录
  • 虚拟用户共享文件位置:为其映射的系统用户的家目录

VSFTPD服务配置

vsftpd 服务配置 大多数都在配置文件/etc/vsftpd/vsftpd.conf中,所以我们的大部分配置只要修改这个文件就可以。

查看帮助文档

可以使用man命令查看配置文件的帮助文档,查看有哪些选项是我们需要的,以及各种值分别代表什么含义。

man 5 vsftpd.conf

命令端口

ftp默认端口是21端口,如果配置文件中没有明确指定的话,就是21端口。当然也可以明确指定,或者指定为别的端口。在配置文件中添加下面这一行就可以。

listen_port=21

主动模式端口

ftp 的链接方式有两种,分别是主动模式和被动模式。这两种模式都是从服务器的角度来查看和定义的。

# 这这里的选项一直定义为YES就可以。
# 如果不写这一行,默认的也是YES
connect_from_port_20=YES 

# 如果要重新定义主动模式的端口为其他的值的话,那就再加上下面行,并指定端口值
ftp_data_port=2020 

被动模式端口范围

linux客户端默认使用被动模式,windows 客户端默认使用主动模式。在配置文件中加入下面两行,代表可以定义被动模式的端口范围。

pasv_min_port=6000 
pasv_max_port=6010

# 如果这个属性指定为0的话,那么就随机分配
pasv_min_port=0 

使用当地时间

设置是否使用当地时间。默认就是YES.

use_localtime=YES

匿名用户

是否支持匿名用户

# YES 支持匿名用户
anonymous_enable=YES

匿名用户略过口令检查,默认为no。如果为YES的时候,匿名用户登陆时,不会提示用户名和密码,直接登陆。如果为NO的话,匿名用户登陆时还是会提示输入密码,只不过,系统不会再去验证密码的正确性。系统默认的匿名账户有两个,分别是ftp和anonymous。

no_anon_password=YES

匿名上传。首先,文件系统上用户的家目录,要具备写权限。其次,ftp服务器要开启允许匿名上传的配置。也就是说,ftp用户的家家目录需要进行配置权限。

anon_upload_enable=YES 

匿名用户能够创建目录。这一点与匿名上传一样,不仅需要注意服务的配置,同时需要注意用户的家目录权限。

anon_mkdir_write_enable=YES

默认只能下载全部读的文件。这句话的意思是说,如果启动了这句话,则匿名用户只能下载所有用户都具备读权限的文件。如果有一个文件,有一个用户不剧本读权限,匿名用户就不能够下载。

anon_world_readable_only=YES

匿名用户能否删除和修改上传的文件。默认是no,也就是不可以。

anon_other_write_enable=YES

指定匿名上传文件的umask值。umask的值可以直接影响到上传文件的权限。

anon_umask=077 

指定上传文件的默认的所有者和权限。 完成了这些指定之后,匿名用户上传的元数据就是我们指定的那些内容。

chown_uploads=YES(默认NO)
chown_username=wang
chown_upload_mode=0644

系统用户

默认情况下,操作系统的账户是可以直接使用用户名和密码来登陆的。并且登陆成功之后,默认进入到了自己的家目录。
所有系统用户都映射成guest用户,但是映射的guest账户,需要人为地去指定下。同时这个guest账户与匿名账户类似,不允许家目录具有写权限,否则容易导致安全隐患。

guest_enable=YES

#配合上面选项才生效,指定guest用户
guest_username=ftp 

是否允许Linux用户登陆,默认是允许的,当然也可以禁止。

local_enable=YES 

是否允许Linux用户上传文件,如果用户默认允许登陆的话,linux用户登陆成功之后,默认位于自己的家目录,这时是允许上传文件的。 如果将下面的这句话,改成no,则服务拒绝linux用户上传文件,即便位于自己的家目录也不可以。

write_enable=YES

指定系统用户上传文件的默认权限

local_umask=022

非匿名用户登录所在目录,当使用Linux用户登陆成功之后,就不会默认在自己的家目录了。相反,会位于下面指定的目录里。

local_root=/ftproot

禁锢所有系统用户在家目录中

禁锢所有的用户在家目录中的意思是说,用户登陆成功之后,不能够随意切换目录,只能够在自己的家目录中进行操作。 服务默认是NO,也就是不禁锢,这样的话,有比较大的安全隐患。

chroot_local_user=YES

禁锢或者不禁锢特定的用户

可以针对某一些用户进行单独的设置,例如对某一些用户进行禁锢,而对另外一些用户进行禁锢。
在/etc/vsftpd/chroot_list文件中,指定需要做出特殊处理的用户。当chroot_list_enable选项为YES的时候,列表中的用户不被禁锢。而不在列表中的用户则被禁锢。反之,则相反。

chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

wu-ftp日志:默认启用

wu-ftp日志,默认安装,默认启用。

xferlog_enable=YES (默认)启用记录上传下载日志
xferlog_std_format=YES (默认)使用wu-ftp日志格式
xferlog_file=/var/log/xferlog (默认)可自动生成

vsftpd日志:默认不启用

vsftpd日志,默认不启用,如果想要启用的话,应该手动进行配置修改。

#使用vsftpd日志格式,默认不启用
dual_log_enable=YES 
#(默认)可自动生成
vsftpd_log_file=/var/log/vsftpd.log

登录提示信息

登陆提示信息图形界面是看不到的,只适用于ftp作为客户端的时候。可以使用下面的方式来进行配置。但是优先级却不一样。

ftpd_banner=“welcome to mage ftp server"

# 这一句话优先生效
banner_file=/etc/vsftpd/ftpbanner.txt 

目录访问提示信息

当用户进入到某一个目录之后,可以给用户一个提示消息。用来提示这个目录的作用。在相应的目录下建立一个隐藏文件 .message,在该文件中进行信息提示描述。

dirmessage_enable=YES (默认)
message_file=.message(默认)

使用pam(Pluggable Authentication Modules)完成用户认证

pam模块是Linux中的一种安全验证机制。所以vsftpd也可以根据pam模块进行用户的认证。 pam的配置文件/etc/pam.d/vsftpd,在这个文件中指定了默认文件/etc/vsftpd/ftpusers 默认文件中用户拒绝登录. 而vaftpd配置文件中,定义了pam模块。

pam_service_name=vsftpd

是否启用控制用户登录的列表文件

在黑名单中的用户,连密码提示都没有。

# 默认有此设置
# YES的时候启用了userlist
userlist_enable=YES

# YES(默认值)黑名单,不提示口令,NO为白名单
userlist_deny=YES

userlist_file=/etc/vsftpd/users_list 此为默认值

连接限制

链接限制,可以指定链接用户的最大数量,也就是最大的并发链接数。

# 最大并发连接数
# 如果为0的话,默认不限制
max_clients=0 

# 每个IP同时发起的最大连接数
# 如果为0的话,则默认不限制数量
max_per_ip=0 

vsftpd服务指定用户身份运行

vsftpd服务启动时要开启相应的进程,那么相应的进程就有一定的用户身份。如果指定了,那么服务启动之后,就会以指定的用户来启动服务进程。

nopriv_user=nobody

限定传输速率:字节/秒
如果在上传和下载的过程中,没有对速率进行限制,很容易对服务器造成损坏。所以最好进行一下限定。注意单位是 字节

# 匿名用户的最大传输速率
# 如果为0的话,则默认不限制
anon_max_rate=0 

# 本地用户的最大传输速率
# 如果为0的话,则默认不限制
local_max_rate=0 

限定链接时间:秒

指定用户连接到ftp服务器上的时间。时间单位是秒,这样做的好处是,如果用户连接到服务器之后,却不做任何操作的话,很容易浪费资源。这样是一种浪费。

# 主动模式数据连接超时时长
connect_timeout=60
# 被动模式数据连接超时时长
accept_timeout=60 
# 数据连接无数据输超时时长
data_connection_timeout=300 
# 无命令操作超时时长
idle_session_timeout=60 

优先以文本方式传输

文件在传输的过程中,可以指定是以文本方式传输,还是以二进制的方式传输。默认是以二进制的形式进行传输。 这里有一点需要注意,如果指定了以文本方式传输的话,Linux平台和Windows平台对文本的处理方式是不一样的,打个比方说,Linux平台上回车符是一个字节,但是在Windows的平台上是两个字节,也就是CRLF,这样也就导致,如果在Windows平台上使用客户端从Linux上FTP服务器下载文件,Windows会自动对文本进行转化的,反之也是一样。

如果我们传输一个二进制文件的话,二进制文件应该就会被破坏掉。

ascii_upload_enable=YES
ascii_download_enable=YES

配置FTP服务以非独立服务方运行:listen=NO,默认为独立方式

FTP服务既可以作为独立服务运行,也可以作为非独立服务进行运行。所谓非独立服务,指的就是使用xinetd服务代替FTP服务来监听21端口,当有用户访问FTP服务的时候,xinetd服务就会自动启动FTP服务,并提供给用户访问。

listen=YES,表示以独立的服务运行,listen=no表示以非独立的服务进行运行。

cat /etc/xinetd.d/vsftpd
service ftp
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
log_on_failure += USERID
disable = no
}

实现基于SSL的FTPS

FTP服务,默认用户登陆时的口令是明文的。这样很容易被获取到,那么vsftpd服务是否支持SSL来进行加密呢?

查看是否支持SSL

# 使用下面的命令能够查看到是否支持SSL
# 查看到libssl.so
ldd `which vsftpd` 

创建自签名证书

# 进入到证书路径
cd /etc/pki/tls/certs/
# 使用下面的命令生成证书私钥和证书
make vsftpd.pem

openssl x509 -in vsftpd.pem -noout –text

配置vsftpd服务支持SSL:/etc/vsftpd/vsftpd.conf

#  启用SSL
ssl_enable=YES 
#  匿名不支持SSL
allow_anon_ssl=NO 
#  本地用户登录加密
force_local_logins_ssl=YES 
#  本地用户数据传输加密
force_local_data_ssl=YES
#  指定证书路径
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem

vsftpd虚拟用户

虚拟用户:

所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录。

各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定。

虚拟用户帐号的存储方式:

文件:编辑文本文件,此文件需要被编码为hash格式

奇数行为用户名,偶数行为密码

db_load -T -t hash -f vusers.txt vusers.db

  
关系型数据库中的表中:

实时查询数据库完成用户认证

mysql库:pam要依赖于pam-mysql

/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7/README

实现基于文件验证的vsftpd虚拟用户

1、创建用户数据库文件

# 创建用户文件
vim /etc/vsftpd/vusers.txt

ftp1    用户名
ftp1pass  密码
tom     用户名
tompass 密码


# 进入到相应的目录下
cd /etc/vsftpd/

# 创建数据库文件
db_load -T -t hash -f vusers.txt vusers.db

# 修改数据库权限
chmod 600 vusers.db

2、创建系统用户和访问FTP目录

虚拟用户访问FTP服务器的时候,要进入到自己的家目录下,但是系统中没有虚拟账户所对应的账号家目录,所以我们要创建一个系统用户,与虚拟账户关联起来,这样,当虚拟用户登陆之后,就会进入到我们创建的系统用户的家目录,然后进行数据访问。

对于CentOS7,家目录有写权限,用户在登陆的时候会出错的。所以要做一些特殊处理

# 创建系统用户并指定家目录
useradd -d /var/ftproot -s /sbin/nologin vuser
# 修改家目录权限
chmod +rx /var/ftproot/  

#CentOS 7 中要做出一些特殊的配置 

# 去掉家目录写权限
chmod -w /var/ftproot/

mkdir /var/ftproot/upload
setfacl -m u:vuser:rwx /var/ftproot/upload

3、创建pam配置文件

修改vsftpd的pam模块的配置文件 /etc/pam.d/vsftpd.db ,让vsftpd支持pam模块进行身份验证。

auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers

4、指定pam配置文件

修改vsftpd的配置文件 /etc/vsftpd/vsftpd.conf ,给vsftpd指定pam模块。

guest_enable=YES
guest_username=vuser
pam_service_name=vsftpd.db

5、SELinux设置

如果对SELinux有什么特殊要求的话,可以单独对SELinux进行设置,如果没有特殊要求的话,直接禁用SELinux就可以。

6、虚拟用户建立独立的配置文件

在vsftpd的配置文件中指定,用户配置文件的存储路径,然后在/etc/目录下,创建相应的目录,并且在目录中定义与用户名一致的配置文件并写入相应权限就可以了。

在vsftpd的配置文件 /etc/vsftpd/vsftpd.conf 中指定如下路径.

user_config_dir=/etc/vsftpd/vusers.d/

在etc目录下,创建如下的文件目录,这一个目录与前面在vsftpd配置文件中定义的一致。

mdkir /etc/vsftpd/vusers.d/

进入到/etc/vsftpd/vusers.d/ 目录下,创建与用户名同名的配置文件,例如用户为tom,那么就创建一个与tom一致的配置文件。 将下面的内容,写入配置文件,就可以进行权限控制。

# 虚拟用户上传权限
anon_upload_enable=YES
# 虚拟用户创建文件夹
anon_mkdir_write_enable=YES
# 虚拟的其他用户对指定用户目录的写权限
anon_other_write_enable=YES

或者还可以改变用户的默认登陆目录。也就是FTP用户登陆成功之后的默认路径。

#登录目录改变至指定的目录
local_root=/ftproot

Redis-慢查询分析

一、慢查询日志

慢查询日志帮助开发和运维人员定位系统存在的慢操作。慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(慢查询ID,发生时间戳,耗时,命令的详细信息)记录下来。Redis客户端一条名利分为如下四部分执行:

未分类

需要注意的是,慢查询日志只是统计步骤3)执行命令的时间,所以慢查询并不代表客户端没有超时问题。

二、慢查询的配置参数

2.1 慢查询的预设阀值 slowlog-log-slower-than

slowlog-log-slower-than参数就是预设阀值,单位是微秒,默认值是1000,如果一条命令的执行时间超过10000微妙,那么它将被记录在慢查询日志中。

如果slowlog-log-slower-than的值是0,则会记录所有命令。

如果slowlog-log-slower-than的值小于0,则任何命令都不会记录日志。

2.2 慢查询日志的长度slowlog-max-len

slowlog-max-len只是说明了慢查询日志最多存储多少条。Redis使用一个列表来存储慢查询日志,showlog-max-len就是列表的最大长度。当慢查询日志已经到达列表的最大长度时,又有慢查询日志要进入列表,则最早插入列表的日志将会被移出列表,新日志被插入列表的末尾。

三、慢查询日志的组成

慢查询日志由以下四个属性组成:标识ID,发生时间戳,命令耗时,执行命令和参数

四、慢查询日志的访问和管理

4.1 获取慢查询日志slowlog get [n]

命令:slowlog get [N]

选型:N,可选,代表获取的日志条数

例如:showlog get 5

返回:

1) 1) (integer) 1
2) (integer) 1499338521
    3) (integer) 10101
    4) 1) "SETEX"
     2) "com.yonyou.iuap.portal.integration.ticket.entity.Ticket/AhZwvMNspZnYEy3Zs5BhdA"
     3) "3600"
     4)"{"id":"AhZwvMNspZnYEy3Zs5BhdA","usercode":"b540903b584144d38a365a1fc593ee68","expire":1499342121122,"extendAttributes":{}}"
2)1) (integer) 0
   2)(integer) 1499251333
   3)(integer) 42683
   4)1) "HGETALL"
     2) "IUAP_SESSION_USER:b540903b584144d38a365a1fc593ee68"

4.2 获取慢查询日志列表的当前长度slowlog len

命令:slowlog len

返回:慢日志列表的当前长度

例如:slowlog len

返回:2

4.3 慢查询日志重置slowlog reset

慢查询日志重置实际是对列表做清理操作。

命令:slowlog reset

例如:slowlog reset

slowlog len

返回: 0

五、慢查询日志最佳实践

(1)slowlog-max-len的设置建议
线上环境建议调大慢查询日志的列表,记录慢查询日志时Redis会对长命令做截断操作,并不会占用大量内存。增大慢查询列表可以减缓慢查询被剔除出列表的可能性。例如线上可以设置为1000以上。

(2)slowlog-log-lower-than的设置建议
需要根据redis的并发量调整该值。由于redis采用单线程响应名利,对于高流量的场景,如果执行命令的时间在1毫秒以上,那么redis最多可支撑OPS(每秒操作次数)不到1000,因此高OPS场景的REDIS建议设置为1毫秒。

(3)慢查询只记录命令执行时间,并不包括命令排队时间和网络传输时间。因此客户端
命令的执行时间要大于redis服务器实际执行命令的时间。因为命令执行排队极致,慢查询会导致命令级联阻塞,因此当客户端出现请求超时,需要检查该时间点是否有对应的慢查询,从而分析是否因为慢查询导致的命令级联阻塞

(4)慢查询日志是一个先进先出队列,慢查询较多的情况下,可能会丢失部分慢查询命令,可以定期执行slow get命令将慢查询日志持久化到其他存储中。然后制作可视化界面查询。

Redis Set 实现关注,粉丝功能

采用 Redis 的 Set 类型 ,这是一种 string 类型的无序集合,成员具有唯一性,哈希表实现,复杂度为 O(1) ,成员的最大数量是 $2^{32-1}$,大约是40亿。

关注Key:followUID

粉丝Key:fansStaffID

往 key = follow417 添加一个 Staff147 成员

127.0.0.1:6379> SADD follow417 Staff147
(error) WRONGTYPE Operation against a key holding the wrong kind of value

发现报错了,字面意思是传值不对,其实是 operation417 这个 key 我之前用过,设置为 SetBit 类型了。用 del key 删除,重新执行 sadd 命令即可。

127.0.0.1:6379> type follow417
none
127.0.0.1:6379> del follow417
(integer) 1
127.0.0.1:6379> SADD follow417  147
(integer) 1
127.0.0.1:6379> SADD follow417  148
(integer) 1
# 给 集合中添加两个元素 147 ,148

查看集合的成员数目

127.0.0.1:6379> scard follow417
(integer) 2

查看所有成员

127.0.0.1:6379> smembers follow417
1) "147"
2) "148"

删除 集合中的某个元素

127.0.0.1:6379> srem follow417 147
(integer) 1
127.0.0.1:6379> scard follow417
(integer) 1
127.0.0.1:6379> SMEMBERS follow417
1) “148”

设置粉丝集合

127.0.0.1:6379> SMEMBERS fans1477
1) "40"
127.0.0.1:6379>

查看集合的交集

127.0.0.1:6379> SINTER follow407 fans407
(empty list or set)
# 可以查看两个人的共同关注
127.0.0.1:6379> SINTER follow407 follow417
1) “148”

Redis 官网集群步骤

1. 创建目录

要让集群正常运作至少需要三个主节点, 不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点
创建一个新目录 redis,并在其中创建六个以端口号为名字的子目录,每个子目录都是一个 redis

mkdir redis
cd redis
mkdir 7000 7001 7002 7003 7004 7005

2. 修改配置文件

分别进入每个子目录,修改 redis.conf 中如下的配置项

port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

其中端口号 port 分别为 7000-7005

3. 运行实例

接着,从 https://github.com/antirez/redis 页面的 unstable 分支中下载最新代码,然后编译出可执行文件放在 redis 文件夹中。(其实从我们的任一子目录里面编译后在 src 文件夹里拿出来也可以)通过如下命令分别创建出 6 个实例

cd 7000
../redis-server ./redis.conf

4. 创建集群

可以使用 src 目录中的 redis-trib 程序来创建集群,首先需要安装 redis gem 才能运行 redis-trib

gem install redis

然后创建集群

./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

然后终端会列出集群的情况,并礼貌性的问你这样创建可以吗,当然是输入 yes

>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: 968f13cefb4f895cec739794835fcd160bde22af 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 3c088766a36ed8ccd7bef5e6e2fbe75c48bc10c0 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: 433145fbee24fa60a3e7194b9b8056b02f375023 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
S: d29b5ce6e4ea9a33a9044d4211ba37aafa5198f8 127.0.0.1:7003
   replicates 968f13cefb4f895cec739794835fcd160bde22af
S: ba9052a112e11e757a563ce6ed89adde463c7ec5 127.0.0.1:7004
   replicates 3c088766a36ed8ccd7bef5e6e2fbe75c48bc10c0
S: 130bfe6c6e1b8d31ed1e030ae7c41902be268a1f 127.0.0.1:7005
   replicates 433145fbee24fa60a3e7194b9b8056b02f375023
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join...
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 968f13cefb4f895cec739794835fcd160bde22af 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: 433145fbee24fa60a3e7194b9b8056b02f375023 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: 3c088766a36ed8ccd7bef5e6e2fbe75c48bc10c0 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: ba9052a112e11e757a563ce6ed89adde463c7ec5 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 3c088766a36ed8ccd7bef5e6e2fbe75c48bc10c0
S: d29b5ce6e4ea9a33a9044d4211ba37aafa5198f8 127.0.0.1:7003
   slots: (0 slots) slave
   replicates 968f13cefb4f895cec739794835fcd160bde22af
S: 130bfe6c6e1b8d31ed1e030ae7c41902be268a1f 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 433145fbee24fa60a3e7194b9b8056b02f375023
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

到此集群就创建成功了。

但很明显这是个伪集群,如果条件允许的话建议使用 6 台机器来创建集群,只需修改相应的地址和端口,并在防火墙开放该端口就行。

5. 简单测试

使用 redis-cli 进行简单的命令测试

$ redis-cli -c -p 7000
redis 127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK
redis 127.0.0.1:7002> set hello world
-> Redirected to slot [866] located at 127.0.0.1:7000
OK
redis 127.0.0.1:7000> get foo
-> Redirected to slot [12182] located at 127.0.0.1:7002
"bar"
redis 127.0.0.1:7000> get hello
-> Redirected to slot [866] located at 127.0.0.1:7000
"world"

redis统计大key

redis的–bigkeys参数:对redis整个keyspace进行统计(数据量大时采样,调用scan命令),寻找每种数据类型较大的keys,给出数据统计

redis-cli –bigkeys -i 0.1 -h 127.0.0.1