Linux网络文件共享服务

前言

先前有介绍显示文件前后内容相关内容Linux文件查看编辑与压缩-CSDN博客,这里补充部分命令介绍。

目录

前言

一、显示文件前后内容(补充)

1. tr

1.1 基本功能转换

1.2 压缩

1.3 删除

2. cut

3. sort

4. uniq

二、网络文件共享

1. 存储类型

2. FTP 文件传输协议

2.1 工作原理

2.2 vsftpd 软件介绍

2.2.1 服务端修改默认命令端口号  

2.2.2 主动模式端口

2.2.3 被动模式端口

2.2.4 使用当地时间

2.2.5 匿名用户登录

2.2.6 匿名用户上传

2.2.7 匿名用户下载删除文件

2.2.8 指定匿名用户的上传文件的默认的所有者和权限

2.2.9 Linux系统用户

2.2.10 将所有系统用户映射为指定的guest用户

2.2.11 禁锢系统用户

2.2.12 pam模块实现用户访问

2.2.13 匿名用户的最大传输速率限制

3. 通过ftp服务搭建内网yum仓库 

4. 通过http协议搭建内网yum仓库 


一、显示文件前后内容(补充)

1. tr

1.1 基本功能转换

格式:tr [选项]... SET1 [SET2]
SET 是一组字符串,一般都可按照字面含义理解

[root@localhost ~]# tr 1 a           #出现1转换成a
111
aaa
[root@localhost ~]# tr [a-z] [A-Z]   #出现小写字母转换成大写字母
aaa
AAA
[root@localhost ~]# tr 123456 abc
123456789
abcccc789                            #最后一个一直用

1.2 压缩

格式:tr -s SET,将连续的字符压缩

[root@localhost ~]# tr -s a.txt   
aaa                               #连续的字符
a                                 #压缩后的结果

1.3 删除

格式:tr -d SET,遇到字符删除

[root@localhost ~]# tr -d abc
12a34bc
1234

2. cut

提取文本文件数据的指定列

格式:cut [选项]... [文件]...

选项:

-d:DELIMITER: 指明分隔符,默认tab
-f:想要获取的字段
     #: 第#个字段,例如 3
     #,#[,#]:离散的多个字段,例如 1,3,6
     #-#:连续的多个字段, 例如 1-6
     混合使用:1-3,7
-c:取字符

[root@localhost ~]# cut -d: -f1,3 /etc/passwd | head -3
#以冒号作为分隔的条件,取文件的第一列和第三列
root:0
bin:1
daemon:2

[root@localhost ~]# df
文件系统                   1K-块    已用     可用 已用% 挂载点
/dev/mapper/centos-root 52403200 3399128 49004072    7% /
devtmpfs                  917604       0   917604    0% /dev
tmpfs                     933524       0   933524    0% /dev/shm
tmpfs                     933524    9216   924308    1% /run
tmpfs                     933524       0   933524    0% /sys/fs/cgroup
/dev/sda1                5232640  182372  5050268    4% /boot
tmpfs                     186708      12   186696    1% /run/user/42
tmpfs                     186708       0   186708    0% /run/user/0
[root@localhost ~]# df | tr -s " " | grep sda | cut -d" " -f5 | tr -d %
4
#查看磁盘剩余量 | 遇到空格压缩 | 筛选含sda行 | 指定空格为分隔符,取文件第五列 | 遇到%删除

[root@localhost ~]# df | tail -n +2 | cut -c54 #使用字符取字段,-c 取当前字符的字段
7
0
0
……

3. sort

默认不是以数字排序,以第一个字符排序

选项:

-r:执行反方向(由上至下)整理
-R:随机排序
-n:执行按数字大小整理
-h:人类可读排序,如: 2K 1G 
-f:选项忽略(fold)字符串中的字符大小写
-u:选项(独特,unique),合并重复项,即去重
-t:指定分隔符
-k:指定列

[root@localhost ~]# cat a.txt
192.168.190.100
192.168.190.100
192.168.190.101
172.19.8.100
172.19.8.100
192.168.190.100
[root@localhost ~]# sort -nr a.txt   #以数字大小倒叙排列
192.168.190.101
192.168.190.100
192.168.190.100
192.168.190.100
172.19.8.100
172.19.8.100

4. uniq

去重,压缩连续字符

选项:

-c: 显示每行重复出现的次数

-d: 仅显示重复过的行

-u: 仅显示不曾重复的行

uniq常和sort 命令一起配合使用

[root@localhost ~]# cat a.txt
192.168.190.100
192.168.190.100
192.168.190.101
172.19.8.100
172.19.8.100
192.168.190.100
[root@localhost ~]# sort -n a.txt | uniq -c | sort -r  #倒序排列出现相同ip的次数
      3 192.168.190.100
      2 172.19.8.100
      1 192.168.190.101

二、网络文件共享

1. 存储类型

  • 直连式存储:Direct-Attached Storage,简称DAS
  • 存储区域网络:Storage Area Network,简称SAN(可以使用空间,管理也是你来管理)
  • 网络附加存储:Network-Attached Storage,简称NAS(存储和管理空间都在远程)

区别:

DASNASSAN
传输类型SCSI、FCIPIP、FC、SAS
数据类型数据块文件数据块
典型应用任何文件服务器数据库应用
优点磁盘与服务器分离,便于统一管理

不占用应用服务器资源

广泛支持报作系统

扩展较容易

即插即用,安装简单方便

高扩展性

高可用性

数据集中,易管理

缺点

连接距离短

数据分散,共享困难存储间利用率不高扩展性有限

不适合存储量大的块级应用数据备份及恢复占用网络带宽相比NAS成本较高安装和升级比NAS复杂

应用场景:

  • DAS虽然比较古老了,但是还是很适用于那些数据量不大,对磁盘访问速度要求较高的中小企业
  • NAS多适用于文件服务器,用来存储非结构化数据,虽然受限于以太网的速度,但是部署灵活,成本低
  • SAN则适用于大型应用或数据库系统,缺点是成本高、较为复杂

2. FTP 文件传输协议

2.1 工作原理

FTP(File Transfer Protocol)是一种用于在网络上进行文件传输的协议。它是一个客户端-服务器协议,客户端通过FTP客户端软件连接到FTP服务器,然后通过FTP协议进行文件传输。
FTP工作原理如下: 

  • 客户端向FTP服务器发送连接请求。
  • 服务器接受连接请求,并向客户端发送连接成功的响应。
  • 客户端通过FTP命令向服务器发送请求,比如列出目录、上传文件、下载文件等。
  • 服务器接收到请求后,执行相应的操作,并返回响应给客户端。
  • 客户端接收到响应后,根据响应执行相应的操作,比如显示目录列表、下载文件等。
  • 当传输文件时,客户端和服务器之间通过FTP协议建立数据连接,进行文件传输。
  • 文件传输完成后,关闭数据连接,终止FTP会话。

FTP使用两个端口进行通信,一个是控制端口(默认端口号为21),用于建立FTP连接、发送FTP命令和接收FTP响应;另一个是数据端口,用于传输文件。数据端口可以是FTP服务器的任意端口,也可以是客户端的任意端口,具体取决于FTP服务器和客户端的配置。需要注意的是,FTP协议是明文传输,不安全,容易被窃听和篡改。因此,在传输敏感信息时,建议使用加密的FTP协议,比如SFTP(Secure File Transfer Protocol)或FTP over SSL/TLS 。

两种模式:从服务器角度

  • 主动(PORT style):服务器主动连接客户端

    命令(控制):客户端:随机port ---> 服务器:21/tcp

    数据:客户端:随机port <---服务器:20/tcp

  • 被动(PASV style):服务器被动等待客户端连接

    命令(控制):客户端:随机port ---> 服务器:21/tcp

    数据:客户端:随机port ---> 服务器:随机port /tcp

图示:

用户认证:

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

FTP服务状态码:

  • 1XX:信息 125:数据连接打开
  • 2XX:成功类状态 200:命令OK     230:登录成功
  • 3XX:补充类     331:用户名OK
  • 4XX:客户端错误 425:不能打开数据连接
  • 5XX:服务器错误 530:不能登录

2.2 vsftpd 软件介绍

vsftpd(Very Secure FTP Daemon)是一个开源的FTP服务器软件,被广泛用于Linux和Unix系统中。它以安全性和性能为重点设计,是一个轻量级、稳定可靠的FTP服务器软件。

用户认证配置文件:/etc/pam.d/vsftpd ;配置文件:/etc/vsftpd/vsftpd.conf 

2.2.1 服务端修改默认命令端口号  

服务端: 

[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y vsftpd
[root@localhost ~]# rpm -qc vsftpd 
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
129 listen_port=888              #默认命令端口号为21,随便一行插入自定义端口号
[root@localhost ~]# systemctl restart vsftp
[root@localhost ~]# ss  -ntl | grep 888
LISTEN     0      32          :::888                     :::*  

客户端: 

[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y ftp
[root@localhost ~]# ftp 192.168.190.100 888           #连接时需要指明端口号
Connected to 192.168.190.100 (192.168.190.100).
220 (vsFTPd 3.0.2)
Name (192.168.190.100:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quit                                             #退出,或者ctrl+d
221 Goodbye.
[root@localhost ~]# ss -nt
State       Recv-Q Send-Q           Local Address:Port                          Peer Address:Port              
ESTAB       0      0              192.168.190.101:37842                      192.168.190.100:888                
ESTAB       0      36             192.168.190.101:22                           192.168.190.1:8642
2.2.2 主动模式端口
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
43 connect_from_port_20=YES
ftp_data_port=20 (默认)指定主动模式的端口,随便插入一行
2.2.3 被动模式端口
pasv_min_port=6000   0为随机分配,端口范围会影响客户端的并发数
pasv_max_port=6010
2.2.4 使用当地时间
use_localtime=YES 使用当地时间(默认为NO,使用GMT)
格林威治比我们慢8小时
2.2.5 匿名用户登录
anonymous_enable=YES 支持匿名用户,CentOS8 默认不允许匿名
no_anon_password=YES 匿名用户略过口令检查,默认NO
服务端:
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
129 no_anon_password=YES
[root@localhost ~]# systemctl restart vsftpd

客户端:
[root@localhost ~]# ftp 192.168.190.100
Connected to 192.168.190.100 (192.168.190.100).
220 (vsFTPd 3.0.2)
Name (192.168.190.100:root): ftp
230 Login successful.                     #无需输入密码
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 221 Goodbye.
2.2.6 匿名用户上传

服务端: 

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
29 anon_upload_enable=YES
33 anon_mkdir_write_enable=YES
[root@localhost ~]# cd /var/ftp
[root@localhost ftp]# ls
pub
[root@localhost ftp]# setfacl -m u:ftp:rwx /var/ftp/pub/
[root@localhost ftp]# getfacl pub/
# file: pub/
# owner: root
# group: root
user::rwx
user:ftp:rwx
group::r-x
mask::rwx
other::r-x
[root@localhost ftp]# systemctl restart vsftpd

客户端:

[root@localhost ~]# ftp 192.168.190.100
Connected to 192.168.190.100 (192.168.190.100).
220 (vsFTPd 3.0.2)
Name (192.168.190.100:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir test
257 "/pub/test" created
ftp> ls
227 Entering Passive Mode (192,168,190,100,145,76).
150 Here comes the directory listing.
drwx------    2 14       50              6 Jan 15 10:42 test
226 Directory send OK.
ftp> put anaconda-ks.cfg 
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (192,168,190,100,52,138).
150 Ok to send data.
226 Transfer complete.
2037 bytes sent in 0.00101 secs (2014.84 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,190,100,216,232).
150 Here comes the directory listing.
-rw-------    1 14       50           2037 Jan 15 10:42 anaconda-ks.cfg
drwx------    2 14       50              6 Jan 15 10:42 test
2.2.7 匿名用户下载删除文件

服务端: 

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
129 anon_world_readable_only=NO     #只能下载全部读的文件, 默认YES
130 anon_umask=0333                 #指定匿名上传文件的umask,默认0077,注意:0333中的0不能省略
131 anon_other_write_enable=YES     #可删除和修改上传的文件,默认NO   
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ftp]# cd /var/ftp/pub/
[root@localhost pub]# touch 2.txt

 客户端:

[root@localhost ~]# touch 1.txt
[root@localhost ~]# ftp 192.168.190.100
Connected to 192.168.190.100 (192.168.190.100).
220 (vsFTPd 3.0.2)
Name (192.168.190.100:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,190,100,88,124).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Jan 15 11:19 2.txt
226 Directory send OK.
ftp> put 1.txt 
local: 1.txt remote: 1.txt
227 Entering Passive Mode (192,168,190,100,122,255).
150 Ok to send data.
226 Transfer complete.
ftp> ls
227 Entering Passive Mode (192,168,190,100,229,60).
150 Here comes the directory listing.
-r--r--r--    1 14       50              0 Jan 15 11:24 1.txt
-rw-r--r--    1 0        0               0 Jan 15 11:19 2.txt
226 Directory send OK.
ftp> delete 1.txt                          #删除1.txt
250 Delete operation successful.
ftp> get 2.txt                             #下载2.txt
local: 2.txt remote: 2.txt
227 Entering Passive Mode (192,168,190,100,170,233).
150 Opening BINARY mode data connection for 2.txt (0 bytes).
226 Transfer complete.
ftp> 221 Goodbye.
[root@localhost ~]# ls
1.txt  2.txt                               #获得下载文件2.txt
2.2.8 指定匿名用户的上传文件的默认的所有者和权限

匿名用户上传文件默认的所有者是ftp用户是可以修改的

客户端:
[root@localhost pub]# ll
总用量 0
-r--r--r--. 1 ftp  ftp  0 1月  15 19:28 1.txt  #默认上传的匿名用户为ftp
[root@localhost pub]# vim /etc/vsftpd/vsftpd.conf
48 chown_uploads=YES
50 chown_username=fql
133 chown_upload_mode=0644
[root@localhost pub]# systemctl restart vsftpd

服务端:
ftp> put 1.txt                                 #匿名用户上传1.txt
local: 1.txt remote: 1.txt
227 Entering Passive Mode (192,168,190,100,109,47).
150 Ok to send data.
226 Transfer complete.

客户端:
[root@localhost pub]# ll
总用量 0
-rw-r--r--. 1 fql  ftp  0 1月  15 19:34 1.txt  #匿名用户上传文件默认的所有者已改为fql用户
2.2.9 Linux系统用户

系统用户登录:使用普通用户登录默认是在系统用户的家目录

服务端:
[root@localhost pub]# vim /etc/vsftpd/vsftpd.conf
16 local_enable=YES         #否允许linux用户登录
19 write_enable=YES         #允许linux用户上传文件
23 local_umask=022          #指定系统用户上传文件的默认权限对应umask
以上均为默认配置

客户端:
[root@localhost ~]# ftp 192.168.190.100
Connected to 192.168.190.100 (192.168.190.100).
220 (vsFTPd 3.0.2)
Name (192.168.190.100:root): fql
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/fql"
2.2.10 将所有系统用户映射为指定的guest用户

控制系统用户等信息:

服务端:
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
135 guest_enable=YES
136 guest_username=ftp
[root@localhost ~]# systemctl restart vsftpd

客户端:
[root@localhost ~]# ftp 192.168.190.100
Connected to 192.168.190.100 (192.168.190.100).
220 (vsFTPd 3.0.2)
Name (192.168.190.100:root): fql
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"                                    #系统用户映射成guest用户
ftp> ls
227 Entering Passive Mode (192,168,190,100,93,190).
150 Here comes the directory listing.
drwxrwxr-x    2 0        0              32 Jan 15 11:34 pub
226 Directory send OK.

让每个用户拥有独有配置:

服务端:
root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
137 user_config_dir=/etc/vsftpd/conf.d/             #可以自由指定
[root@localhost ~]# mkdir -p /etc/vsftpd/conf.d     #针对fql用户建立好配置文件夹
[root@localhost ~]# vim /etc/vsftpd/conf.d/fql      #编写子配置文件
[root@localhost ~]# mkdir -p /data/fql
[root@localhost ~]# #touch  /data/fql/f.txt
[root@localhost ~]# systemctl restart vsftpd

客户端:
[root@localhost ~]# ftp 192.168.190.100
Connected to 192.168.190.100 (192.168.190.100).
220 (vsFTPd 3.0.2)
Name (192.168.190.100:root): fql
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/data/fql"                                     #再次登录就存放固定路径
2.2.11 禁锢系统用户
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
103 chroot_local_user=YES
104 chroot_list_enable=YES
#当chroot_local_user=YES和chroot_list_enable=YES时,则chroot_list中用户不禁锢,即白名单,在文件里的不禁锢
#当chroot_local_user=NO和chroot_list_enable=YES时, 则chroot_list中用户禁锢,即黑名单,在文件里的禁锢
106 chroot_list_file=/etc/vsftpd/chroot_list
[root@localhost ~]# vim /etc/vsftpd/chroot_list
#fql                                               #如果添加了即为白名单,这个不添加
[root@localhost home]# chmod 555 fql
[root@localhost home]# ll
总用量 0
dr-xr-xr-x. 3 fql fql 78 1月   9 21:31 fql         #给文件夹添加执行权限


客户端:
[root@localhost ~]# ftp 192.168.190.100
Connected to 192.168.190.100 (192.168.190.100).
220 (vsFTPd 3.0.2)
Name (192.168.190.100:root): fql
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"                  #禁锢后会将fql用户的家目录作为根,默认ftp服务的加目录是不能有写权限
2.2.12 pam模块实现用户访问
[root@localhost ~]# vim /etc/pam.d/vsftpd
#将sense=deny默认是deny 修改为 sense=allow
auth       required     pam_listfile.so item=user sense=allow  file=/etc/vsftpd/ftpusers
#allow代表白名单,deny代表黑名单

服务端:
[root@localhost ~]# cat /etc/vsftpd/ftpusers
# Users that are not allowed to login via ftp
root                                              #sense=allow,已允许
[root@localhost ~]# vim /etc/vsftpd/user_list
7 #root                                           #注释掉否则无法登录
[root@localhost ~]# systemctl restart vsftpd

客户端:
[root@localhost ~]# ftp 192.168.190.100
Connected to 192.168.190.100 (192.168.190.100).
220 (vsFTPd 3.0.2)
Name (192.168.190.100:root): fql
331 Please specify the password.
Password:
530 Login incorrect.                              #不在白名单中,拒绝登录
Login failed.
ftp> 221 Goodbye.
[root@localhost ~]# ftp 192.168.190.100
Connected to 192.168.190.100 (192.168.190.100).
220 (vsFTPd 3.0.2)
Name (192.168.190.100:root): root
331 Please specify the password.
Password:
230 Login successful.                             #在白名单中,可以登录
Remote system type is UNIX.
Using binary mode to transfer files.
2.2.13 匿名用户的最大传输速率限制

服务器: 

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
129 anon_max_rate=1024000
130 local_max_rate=102400                         #限速
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# dd if=/dev/zero of=/var/ftp/pub/bigfile bs=1M count=100
记录了100+0 的读入
记录了100+0 的写出
104857600字节(105 MB)已复制,0.144648 秒,725 MB/秒

客户端测试下载: 

3. 通过ftp服务搭建内网yum仓库 

服务端:
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y vsftpd
[root@localhost ~]# systemctl start vsftpd
[root@localhost ~]# mkdir /var/ftp/centos7
[root@localhost ~]# mount /dev/sr0 /var/ftp/centos7
mount: /dev/sr0 写保护,将以只读方式挂载

客户端:
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# mkdir bak
[root@localhost yum.repos.d]# mv *.repo bak
[root@localhost yum.repos.d]# vim ftp.repo
[ftp]
name=ftp
baseurl=ftp://192.168.190.100/centos7
gpgcheck=0
[root@localhost yum.repos.d]# yum clean all
[root@localhost yum.repos.d]# yum makecache
[root@localhost yum.repos.d]# yum install -y tree
[root@localhost yum.repos.d]# yum repolist
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
源标识                                                 源名称                                               状态
ftp                                                    ftp                                                  3,894
repolist: 3,894

4. 通过http协议搭建内网yum仓库 

服务端:
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y httpd
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# ss -natp | grep 80
LISTEN     0      128         :::80                      :::*                   users:(("httpd",pid=2324,fd=4),("httpd",pid=2323,fd=4),("httpd",pid=2322,fd=4),("httpd",pid=2321,fd=4),("httpd",pid=2320,fd=4),("httpd",pid=2317,fd=4))
[root@localhost ~]# cd /var/www/html
[root@localhost html]# mkdir centos7
[root@localhost html]# mount /dev/sr0 /var/www/html/centos7
mount: /dev/sr0 写保护,将以只读方式挂载

客户端:
客户端:
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# mv ftp.repo http.repo
[root@localhost yum.repos.d]# vim http.repo
[http]
name=http
baseurl=http://192.168.190.100/centos7
gpgcheck=0
[root@localhost yum.repos.d]# yum clean all
[root@localhost yum.repos.d]# yum makecache
[root@localhost yum.repos.d]# yum install -y tree
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
源标识                                                 源名称                                               状态
http                                                   http                                                 3,894
repolist: 3,894

  • 34
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值