共享资源库系统--FTP、NFS、crond服务介绍

本文介绍了FTP协议的工作原理、状态码、客户端工具以及vsftp的部署配置,包括虚拟用户的创建。接着讲解了NFS服务,阐述了RPC如何与NFS通讯,NFS在企业中的应用以及NFS的部署步骤。最后,探讨了crond服务,包括其功能、使用方法以及如何设置定时任务进行文件备份。

一、什么是FTP

FTP(File Transfer Protocol)是一个非常古老并且应用十分广泛的文件传输协议,FTP协议是现今使用最为广泛的网络文件共享协议之一,我们现在也一直有在用着FTP协议来进行各种文件的传输,FTP为我们提供了一种可靠的方式在网络上进行文件的共享。

二、FTP原理

FTP是C/S架构的服务,拥有一个服务器端和一个客户端,FTP底层通过TCP协议来作为传输协议,所以FTP协议是一种可靠的文件传输方式,FTP提供了两个端口号,20和21号端口,20号是数据接口,提供数据之间的传输,21号是命令接口,提供命令之间的传输
FTP服务端与客户端连接一般有两种模式:主动模式(Active Mode)和被动模式(Passive Mode)
在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,发送FTP用户名和密码,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令,告诉服务端客户端采用主动模式并开放了端口。FTP服务器接收到PORT命令后,会用其本地的FTP数据端口(通常是20)来连接客户端指定的端口N+1,进行数据传输。如图:
在这里插入图片描述

(主动模式)
在被动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,发送用户名和密码进行登陆,同时会开启N+1端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。服务器收到命令后,会开放一个大于1024的端口P(端口P的范围是可以设置的,后面会说到这个是很重要的)进行监听,然后用PORT P命令通知客户端,自己的数据端口是P。客户端收到命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。如图:
在这里插入图片描述

(被动模式)

三、FTP状态码

1xx – 肯定的初步答复
这些状态代码指示一项操作已经成功开始,但客户端希望在继续操作新命令前得到另一个答复。

  • 110 重新启动标记答复。
  • 120 服务已就绪,在 nnn 分钟后开始。
  • 125 数据连接已打开,正在开始传输。
  • 150 文件状态正常,准备打开数据连接。

2xx – 肯定的完成答复
一项操作已经成功完成。客户端可以执行新命令。

  • 200 命令确定。
  • 202 未执行命令,站点上的命令过多。
  • 211 系统状态,或系统帮助答复。
  • 212 目录状态。
  • 213 文件状态。
  • 214 帮助消息。
  • 215 NAME 系统类型,其中,NAME 是 Assigned Numbers 文档中所列的正式系统名称。
  • 220 服务就绪,可以执行新用户的请求。
  • 221 服务关闭控制连接。如果适当,请注销。
  • 225 数据连接打开,没有进行中的传输。
  • 226 关闭数据连接。请求的文件操作已成功(例如,传输文件或放弃文件)。
  • 227 进入被动模式 (h1,h2,h3,h4,p1,p2)。
  • 230 用户已登录,继续进行。
  • 250 请求的文件操作正确,已完成。
  • 257 已创建“PATHNAME”。

3xx – 肯定的中间答复
该命令已成功,但服务器需要更多来自客户端的信息以完成对请求的处理。

  • 331 用户名正确,需要密码。
  • 332 需要登录帐户。
  • 350 请求的文件操作正在等待进一步的信息。

4xx – 瞬态否定的完成答复
该命令不成功,但错误是暂时的。如果客户端重试命令,可能会执行成功。

  • 421 服务不可用,正在关闭控制连接。如果服务确定它必须关闭,将向任何命令发送这一应答。
  • 425 无法打开数据连接。
  • 426 Connection closed; transfer aborted.
  • 450 未执行请求的文件操作。文件不可用(例如,文件繁忙)。
  • 451 请求的操作异常终止:正在处理本地错误。
  • 452 未执行请求的操作。系统存储空间不够。

5xx – 永久性否定的完成答复
该命令不成功,错误是永久性的。如果客户端重试命令,将再次出现同样的错误。

  • 500 语法错误,命令无法识别。这可能包括诸如命令行太长之类的错误。
  • 501 在参数中有语法错误。
  • 502 未执行命令。
  • 503 错误的命令序列。
  • 504 未执行该参数的命令。
  • 530 未登录。
  • 532 存储文件需要帐户。
  • 550 未执行请求的操作。文件不可用(例如,未找到文件,没有访问权限)。
  • 551 请求的操作异常终止:未知的页面类型。
  • 552 请求的文件操作异常终止:超出存储分配(对于当前目录或数据集)。
  • 553 未执行请求的操作。不允许的文件名。

常见的 FTP 状态代码及其原因

  • 150 – FTP 使用两个端口:21 用于发送命令,20 用于发送数据。状态代码 150 表示服务器准备在端口 20 上打开新连接,发送一些数据。
  • 226 – 命令在端口 20 上打开数据连接以执行操作,如传输文件。该操作成功完成,数据连接已关闭。
  • 230 – 客户端发送正确的密码后,显示该状态代码。它表示用户已成功登录。
  • 331 – 客户端发送用户名后,显示该状态代码。无论所提供的用户名是否为系统中的有效帐户,都将显示该状态代码。
  • 426 – 命令打开数据连接以执行操作,但该操作已被取消,数据连接已关闭。
  • 530 – 该状态代码表示用户无法登录,因为用户名和密码组合无效。如果使用某个用户帐户登录,可能键入错误的用户名或密码,也可能选择只允许匿名访问。如果使用匿名帐户登录,IIS 的配置可能拒绝匿名访问。
  • 550 – 命令未被执行,因为指定的文件不可用。例如,要 GET 的文件并不存在,或试图将文件 PUT 到您没有写入权限的目录。

四、FTP客户端

ftp命令程序:是最简单的FTP客户端工具,Windows和Linux都拥有ftp命令程序,可以连接到FTP服务器进行交互式的上传、下载通信。
图形化FTP客户端工具:Windows中较常用的包括CuteFTP、FlashFXP、LeapFTP、Filezilla等,在图形化的客户端程序中,用户通过鼠标和菜单即可访问、管理FTP资源,而不需要掌握FTP交互命令,更易于使用。
下载工具:FlashGet、Wget等,包括大多数网页浏览器程序,都支持通过FTP协议下载文件,但因不具备FTP上传管理功能,通常不称为FTP客户端工具。
本案例采用的FTP客户端工具:Filezilla、LFTP(yum安装)。
官方网站:https://filezilla-project.org/download.php?show_all=1

1.vsftp部署安装介绍

可用yum源安装:
# yum install -y vsftpd
主配置文件:/etc/vsftpd/vsftpd.conf
主程序:/usr/sbin/vsftpd

常用的全局配置项:
listen=YES:是否以独立运行的方式监听服务
listen_address=192.168.x.x:设置监听的 IP 地址
listen_port=21:设置监听 FTP 服务的端口号
write_enable=YES:是否启用写入权限
download_enable=YES:是否允许下载文件
userlist_enable=YES:是否启用 user_list 列表文件
userlist_deny=YES:是否禁用 user_list 中的用户
max_clients=0:限制并发客户端连接数
max_per_ip=0:限制同一 IP 地址的并发连接数
guest_enable=YES:启用虚拟用户
user_config_dir=/etc/vsftpd/vsftpd_user_conf :虚拟用户使用的配置文件目录
allow_writeable_chroot=YES:允许写入用户主目录

常用的匿名 FTP 配置项:
anonymous_enable=YES:启用匿名访问
anon_umask=022:匿名用户所上传文件的权限掩码
anon_root=/var/ftp:匿名用户的 FTP 根目录
anon_upload_enable=YES:允许上传文件
anon_mkdir_write_enable=YES:允许创建目录
anon_other_write_enable=YES:开放其他写入权
anon_max_rate=0:限制最大传输速率(字节/秒)

常用的本地用户 FTP 配置项:
local_enable=YES:是否启用本地系统用户
local_umask=022:本地用户所上传文件的权限掩码
local_root=/var/ftp:设置本地用户的 FTP 根目录
chroot_local_user=YES:是否将用户禁锢在主目录

2.虚拟用户配置

在vsftpd服务器中,使用虚拟用户的主要好处在与:可以将FTP登录的账号与系统登录账号区分开,用户名、密码都不相同,从而进一步增强了FTP服务器的安全性。
基本步骤。如下图:
在这里插入图片描述

(1)建立虚拟FTP用户的账号数据库文件

①创建文本格式的用户名、密码列表。

奇数行:账号名,偶数行:密码(即上一行中账号的密码)

②转化为 Berkeley DB 格式的数据文件

需要db_load 转换工具,默认已安装。
“-f”用于指定数据源文件
“-T”表示允许非Berkeley DB的应用程序使用从文本格式转换的DB数据文件
“-t hash”用于指定读取数据文件的基本方法

③为了提高虚拟用户账号文件的安全性,应将文件权限设置为600,以免数据外泄。

(2)创建 FTP 根目录及虚拟用户映射的系统用户

(此账号无需设置密码及登录shell)

(3)建立支持虚拟用户的PAM认证文件

创建好虚拟用户的账号数据文件后,还需要对vsftpd服务的配置做相应的调整,以便识别并读取新的用户信息。在vsftpd服务器中,用户认证是通过PAM(Pluggable Authentication Module,可插拔认证模块)机制来实现的,该机制包含灵活的选择认证方式。Vsftpd服务默认的PAM认证文件位于/etc/pam.d/vsftpd,该文件适用于以Linux主机的系统用户账号进行认证。若要读取虚拟用户的账号数据文件,则需要创建新的PAM认证配置。

(4)在 vsftpd.conf 文件中添加虚拟用户支持配置

(5)为不同的虚拟用户建立独立的配置文件

通过前面的几个步骤,实际上已经可以重新加载vsftpd并提供服务了,使用任一个虚拟用户账号都可以登录FTP服务器并下载文件。但因为所有的虚拟用户都映射到同一个系统用户账号,因此FTP访问权限也是相同的,要么只能下载,要么只能上传。
若要为不同的虚拟用户账号设置不同的访问权限,可以通过为每个虚拟用户建立单独的配置文件来实现。为FTP用户启用独立配置文件,需要修改vsftpd.conf配置文件,添加“user_config_dir”配置项。
在vsftpd.conf文件中启用了“user_config_dir”配置项以后,应该为每一个虚拟用户都建立一个单独的配置文件(可以是空文件),否则该用户可能无法登录。在每个用户的独立配置文件中,可以添加新的配置项来限制访问权限、下载速率等。

(6)重启服务

# systemctl restart vsftpd

五、什么是NFS

它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。
NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利;
而 NFS是通过网络来进行服务器端和客户端之间的数据传输,那么两者之间的传输数据就要有相对应的网络端口;基本上NFS服务器的端口开在2049上,但是由于文件系统较为复杂,NFS其他程序需要开启一些额外的端口,而这些额外端口又是随机的;那么客户端如何去知道这些额外随机端口呢?
通过远程过程调用(Remote Procedure Call,RPC)协议来实现!

六、 RPC与NFS如何通讯

因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。
通讯步骤:
1)首先服务器端启动RPC服务,并开启111端口;
2)服务器端启动NFS服务,并向RPC注册端口信息;
3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口;
4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端;
5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。

七、NFS企业在企业中的应用场景

在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件,通常网站用户上传的文件都会放到NFS共享中,例如BBS产品的图片、附件、头像(网站BBS的程序不要放在NFS共享中),然后前端所有节点在访问这些静态资源时都会读取NFS存储上的资源。
NFS是当前互联网系统架构中最常用的数据存储服务之一,特别是中小型网站应用频率更高

八、NFS部署

1.NFS服务端及客户端的部署

检查环境:

[root@nfs ~]# uname -a
Linux nfs 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

安装所需依赖包:
# yum install -y nfs-utils rpcbind
安装完后查看nfsnobody用户在不在:

[root@nfs ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)

启动NFS相关服务:
启动rpc服务:
# systemctl start rpcbind
# systemctl enable rpcbind
查看rpc端口:

[root@nfs ~]# netstat -tnulp|grep rpc
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1869/rpcbind        
tcp6       0      0 :::111                  :::*                    LISTEN      1869/rpcbind        
udp        0      0 0.0.0.0:772             0.0.0.0:*                           1869/rpcbind        
udp        0      0 0.0.0.0:111             0.0.0.0:*                           1869/rpcbind        
udp6       0      0 :::772                  :::*                                1869/rpcbind        
udp6       0      0 :::111                  :::*                                1869/rpcbind 

查看端口映射情况:

[root@nfs ~]# rpcinfo -p localhost	(注:这里nfs服务没启动,看不到nfs端口的映射情况)
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper

启动nfs服务:
# systemctl start nfs
# systemctl enable nfs
关闭防火墙及安全规则:
# systemctl stop firewalld
# systemctl disable firewalld
# setenforce 0

2.NFS配置

nfs配置文件/etc/exports的格式:
NFS共享的目录 NFS客户端地址(参1,参2,……) NFS客户端地址2(参1,参2,……)或者
NFS共享的目录 NFS客户端地址(参1,参2,……)
NFS共享的常用参数,具体如下:
ro 只读访问
rw 读写访问
sync 所有数据在请求时写入共享
async NFS在写入数据前可以相应请求
secure NFS通过1024以下的安全TCP/IP端口发送
insecure NFS通过1024以上的端口发送
subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check 和上面相对,不检查父目录权限
all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash 保留共享文件的UID和GID(默认)
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squash root用户具有根目录的完全管理访问权限
anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID
注: 如果同时指定no_root_squash与all_squash 用户将被压缩为 nfsnobody,如果设置了anonuid、anongid将被压缩到所指定的用户与组,即no_root_squash不生效 ;

3.生效配置与检验测试

重新加载nfs服务生效配置的方法:
方法1:
# systemctl restart nfs #重启服务
方法2:
# exportfs -rv #重新挂载配置
用于管理NFS(Network File System)文件系统,在不直接编辑/etc/exports文件的情况下,可用exportfs来操作(命令属性、磁盘管理、命令属权限、超级用户、普通用户)。
# exportfs [-aruv]
参数说明如下:
-a:全部挂载(或卸载)/etc/exports文件内的设定。
-r:重新挂载/etc/exports中的设置,此外同步更新/etc/exports及/var/lib/nfs/xtab中的内容。
-u:卸载某一目录。
-v:在export时将共享的目录显示在屏幕上。

检查有权限挂载的服务器是否能挂载:
运用showmount命令查询
# showmount --help
Usage: showmount [-adehv]
[–all] [–directories] [–exports]
[–no-headers] [–help] [–version] [host]
-a或–all 以 host:dir 这样的格式来显示客户主机名和挂载点目录。
-d或–directories 仅显示被客户挂载的目录名。
-e或–exports 显示NFS服务器的输出清单。
-h或–help 显示帮助信息。
-v或–version 显示版本信。
–no-headers 禁止输出描述头部信息。

显示指定NFS服务器连接NFS客户端的信息
# showmount 192.168.100.12 #此ip为nfs服务器的
显示输出目录列表
# showmount -e
显示指定NFS服务器输出目录列表(也称为共享目录列表)
# showmount -e 192.168.100.12
显示被挂载的共享目录
# showmount -d
显示客户端信息和共享目录
# showmount -a
显示指定NFS服务器的客户端信息和共享目录
# showmount -a 192.168.100.12
showmount -e IP地址或localhost

永久挂载:
方法1:
编辑/etc/fstab,把挂载信息写进去,每次开机后就会自动挂载上去了!

[root@nfs ~]# vi /etc/fstab 
/dev/sdb1       /data                ext4    defaults        0  0  
/dev/sdb2       /backup/weekbackup   ext4    defaults        0  0

方法2:
/etc/rc.local将挂载命令写到这个里面,每次开机都会自动去执行命令!

九、定时计划与备份脚本

1.crond服务介绍

crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
Linux下的任务调度分为两类,系统任务调度和用户任务调度。
① 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。
在/etc/crontab文件,这个就是系统任务调度的配置文件。

② 用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。
用户可以使用 crontab 工具来定制自己的计划任务。
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command

各个字段的含义:
minute:表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
星号():代表所有可能的值,例如day字段如果是星号,则表示在满足其它字段的制约条件后每天都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“3-6”表示“3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如在hour字段中“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如
/10,如果用在minute字段,表示每十分钟执行一次。

2.如何使用crondtab

检验是否安装crontab:

[root@nfs ~]# rpm -qa | grep crontabs
crontabs-1.11-6.20121102git.el7.noarch

如果未安装crontab,运用本地yum安装部署:
# yum install crontabs

crontab 命令常用选项及功能:
-u user 用来设定某个用户的 crontab 服务,例如 “-u demo” 表示设备 demo
用户的 crontab 服务,此选项一般有 root 用户来运行。
-e 编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。
-l 显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。
-r 从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。
-i 在删除用户的 crontab 文件时,给确认提示。
例如:
进入编辑界面:

# crontab -e
*/5 * * * * echo "11" >> /opt/test			#每隔5分钟往test文件里面写入一行“11”

列出crontab文件:

# crontab -l
*/5 * * * * echo "11" >> /opt/test

删除root用户所有的定时任务:
# crontab -r

# crontab -l
no crontab for root

删除计划任务加上确认提示:

# crontab -ri
crontab: really delete root's crontab? y

书写 crontab 定时任务时,需要注意以下几个事项:
6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。
crontab 定时任务的最小有效时间是分钟,最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。
在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆。
在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错

3.备份脚本

根据案例需求写一个使用shell脚本备份共享资源文件,这个脚本需要满足以下条件:
① 判断备份目录是否存在,不在则创建。
② 每次执行按照日期在备份目录中生成一个日期目录,并判断其是否存在,存在则删除上上周的目录;
③ 运用rsync将共享资源增量备份到日期目录中,并且输出结果。

rsync服务:
rsync是可以实现增量备份的工具。配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时同步。

rsync的选项说明:
-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P:显示文件传输的进度信息。(实际上"-P"="–partial --progress",其中的"–progress"才是显示进度信息的)。
-n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-r --recursive:递归到目录中去。
-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新检查出mtime不同从而导致增量传输无效。
-o --owner:保持owner属性(属主)。
-g --group:保持group属性(属组)。
-p --perms:保持perms属性(权限,不包括特殊权限)。
-D :是"–device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-z :传输时进行压缩提高效率。

例如:
# rsync /etc/fstab /tmp # 在本地同步
# rsync -r 192.168.100.12:/etc /tmp # 将远程主机的/etc目录拷贝到本地/tmp下,以保证本地/tmp目录和远程/etc保持同步。
# rsync -a /etc /tmp #归档模式
rsync的选项非常多,能够实现非常具有弹性的功能,以上选项仅仅只是很小一部分常用的选项,但最常用的选项组合是"avz",即压缩和显示部分信息,并以归档模式传输。

[root@nfs ~]# vi /usr/local/sbin/backup.sh
[root@nfs ~]# chmod 755 /usr/local/sbin/backup.sh

脚本添加可执行权限:
[root@nfs ~]# chmod 755 /usr/local/sbin/backup.sh
添加定时任务:(每7天凌晨1点执行一次脚本)

[root@nfs ~]# crontab -e
* 1 */7 * * sh /usr/local/sbin/backup.sh
[root@nfs ~]# crontab -l
* 1 */7 * * /bin/bash /usr/local/sbin/backup.sh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值