Linux_Shell脚本学习第二章-命令之乐(上)

一、用cat 进行拼接

1.1 读取文件内容

1.1.1 打印单个文件的内容

$ cat file.txt
This is a line inside file.txt
This is the second line inside file.txt

1.1.2 打印多个文件的内容

$ cat one.txt two.txt
This line is from one.txt
This line is from two.txt

1.2 从标准输入中读取数据

管道操作符可以将数据作为cat命令的标准输入:

OUTPUT_FROM_SOME COMMANDS | cat

1.3 将文件内容与终端输入拼接在一起

下面的命令将stdin和另一个文件中的数据组合在一起,-被作为stdin文本的文件名:

$ echo 'Text through stdin' | cat - file.txt
Text throught stdin
This is file.txt

1.3 去除多余的空白行

有时候文本文件中可能包含多处连续的空白行。如果你想删除这些额外的空白行,可以这样做:

$ cat -s file

例如:

$ cat multi_blanks.txt
line1

line2

line3

line4
$ cat -s multi_blanks.txt #压缩相邻的空白行
line 1
line 2
line 3
line 4

1.4 将制表符显示为^I

用cat命令的-T选项能够将制表符标记成^I。例如:

$ cat file.py
def function():
var = 5
next = 6
third = 7
$ cat -T file.py
def function():
^Ivar = 5
^I^Inext = 6
^Ithird = 7^I

1.5 显示行号

cat命令的-n选项会在输出的每一行内容之前加上行号。例如:

$ cat lines.txt
line
line
line
$ cat -n lines.txt
1 line
2 line
3 line

二、查找并列出文件

2.1 预备知识

find命令的工作方式如下:沿着文件层次结构向下遍历,匹配符合条件的文件,执行相应的操作。默认的操作是打印出文件和目录,这也可以使用-print选项来指定。

2.2 实战演练

2.2.1 列出给定目录下所有的文件和子目录

$ find base_path

bash_path可以是任意位置(例如/home/slynux),find会从该位置开始向下查找。例如:

$ find . -print
.history
Downloads
Downloads/tcl.fossil
Downloads/chapter2.doc
…

print选项使用\n(换行符)分隔输出的每个文件或目录名。而-print0选项则使用空字符’\0’来分隔。

2.2.2 根据文件名或正则表达式进行搜索

-name选项指定了待查找文件名的模式。这个模式可以是通配符,也可以是正则表达式。在下面的例子中,’*.txt’能够匹配所有名字以.txt结尾的文件或目录。

$ find /home/slynux -name '*.txt' -print

注意*.txt两边的单引号。shell会扩展没有引号或是出现在双引号(")中的通配符。单引号能够阻止shell扩展*.txt,使得该字符串能够原封不动地传给find命令。
find命令有一个选项-iname(忽略字母大小写),该选项的作用和-name类似,只不过在匹配名字时会忽略大小写。例如:

$ ls
example.txt EXAMPLE.txt file.txt
$ find . -iname "example*" -print
./example.txt
./EXAMPLE.txt

find命令支持逻辑操作符。-a和-and选项可以执行逻辑与(AND)操作,-o和-or选项可以执行逻辑或(OR)操作。

$ ls
new.txt some.jpg text.pdf stuff.png
$ find . \( -name '*.txt' -o -name '*.pdf' \) -print
./text.pdf
./new.txt

上面的命令会打印出所有的.txt和.pdf文件,因为这个find命令能够匹配所有这两类文件。\(以及\)用于将 -name '.txt’ -o -name '.pdf’视为一个整体。

下面的命令演示了如何使用-and操作符选择名字以s开头且其中包含e的文件:

$ find . \( -name '*e*' -and -name 's*' \)
./some.jpg

-path选项可以限制所匹配文件的路径及名称。

$ find /home/users -path '*/slynux/*' -name '*.txt' –print

2.2.3 否定参数

find也可以用!排除匹配到的模式

$ find . ! -name "*.txt" -print

上面的find命令能够匹配所有不以.txt结尾的文件。该命令的运行结果如下:

$ ls
list.txt new.PY new.txt next.jpg test.py
$ find . ! -name "*.txt" -print
.
./next.jpg
./test.py
./new.PY

2.2.4 基于目录深度的搜索

find命令在查找时会遍历完所有的子目录。默认情况下,find命令不会跟随符号链接。-L选项可以强制其改变这种行为。但如果碰上了指向自身的链接,find命令就会陷入死循环中。

-maxdepth和–mindepth选项可以限制find命令遍历的目录深度。这可以避免find命令没完没了地查找。

/proc文件系统中包含了系统与当前执行任务的信息。特定任务的目录层次相当深,其中还有一些绕回到自身(loop back on themselves)的符号链接。系统中运行的每个进程在proc中都有对应的子目录,其名称就是该进程的进程ID。这个目录下有一个叫作cwd的链接,指向进程的当前工作目录。
下面的例子展示了如何列出运行在含有文件bundlemaker.def的目录下的所有任务:

$ find -L /proc -maxdepth 1 -name 'bundlemaker.def' 2>/dev/null

-L选项告诉find命令跟随符号链接
从/proc目录开始查找
-maxdepth 1将搜索范围仅限制在当前目录
-name 'bundlemaker.def’指定待查找的文件
2>/dev/null将有关循环链接的错误信息发送到空设备中

2.2.5 根据文件类型搜索

类Unix系统将一切都视为文件。文件具有不同的类型,例如普通文件、目录、字符设备、块设备、符号链接、硬链接、套接字以及FIFO等。

find命令可以使用-type选项对文件搜索进行过滤。借助这个选项,我们可以告诉find命令只匹配指定类型的文件。

只列出所有的目录(包括子目录):

$ find . -type d -print

只列出普通文件:

$ find . -type f -print

只列出符号链接:

$ find . -type l -print

find能够识别出的类型与参数在这里插入图片描述

2.2.6 根据文件的时间戳进行搜索

Unix/Linux文件系统中的每一个文件都有3种时间戳,如下所示。

访问时间(-atime):用户最近一次访问文件的时间。
修改时间(-mtime):文件内容最后一次被修改的时间。
变化时间(-ctime):文件元数据(例如权限或所有权)最后一次改变的时间。

打印出在最近7天内被访问过的所有文件:

$ find . -type f -atime -7 -print

打印出恰好在7天前被访问过的所有文件:

$ find . -type f -atime 7 -print

打印出访问时间超过7天的所有文件。

$ find . -type f -atime +7 -print

-mtime选项会根据修改时间展开搜索,-ctime会根据变化时间展开搜索。

-atime、-mtime以及-ctime都是以“天”为单位来计时的。find命令还支持以“分钟”为计时单位的选项。这些选项包括:
-amin(访问时间);
-mmin(修改时间);
-cmin(变化时间)。

打印出7分钟之前访问的所有文件:

$ find . -type f -amin +7 -print

–newer选项可以指定一个用于比较修改时间的参考文件,然后找出比参考文件更新的(更近的修改时间)所有文件。

–newer选项可以指定一个用于比较修改时间的参考文件,然后找出比参考文件更新的(更近的修改时间)所有文件。
例如,找出比file.txt修改时间更近的所有文件:

$ find . -type f -newer file.txt -print

2.2.7 基于文件大小的搜索

可以根据文件的大小展开搜索:

# 大于2KB的文件
$ find . -type f -size +2k
# 小于2KB的文件
$ find . -type f -size -2k
# 大小等于2KB的文件
$ find . -type f -size 2k

除了k之外,还可以用其他文件大小单位。
 b:块(512字节)。
 c:字节。
 w:字(2字节)。
 k:千字节(1024字节)。
 M:兆字节(1024K字节)。
 G:吉字节(1024M字节)。

2.2.8 基于文件权限和所有权的匹配

根据文件权限进行文件匹配。列出具有特定权限的文件。
-perm选项指明find应该只匹配具有特定权限值的文件。

$ find . -type f -perm 644 -print
# 打印出权限为644的文件

也可以根据文件的所有权进行搜索。用选项 -user USER就能够找出由某个特定用户所拥有的文件。参数USER可以是用户名或UID。

例如,可以使用下面的命令打印出用户slynux拥有的所有文件:

$ find . -type f -user slynux -print

2.2.9 利用find执行相应操作

a. 删除匹配的文件

find命令的-delete选项可以删除所匹配到的文件。下面的命令能够从当前目录中删除.swp文件:

$ find . -type f -name "*.swp" -delete
b. 执行命令

利用-exec选项,find命令可以结合其他命令使用。

find命令使用一对花括号{}代表文件名。在下面的例子中,对于每一个匹配的文件,find命令会将{}替换成相应的文件名并更改该文件的所有权。如果find命令找到了root所拥有的两个文件,那么它会将其所有者改为slynux:

# find . -type f -user root -exec chown slynux {} \;

注意该命令结尾的;。必须对分号进行转义,否则shell会将其视为find命
令的结束,而非chown命令的结束。

另一个例子是将给定目录中的所有C程序文件拼接起来写入单个文件all_c_files.txt。各种实现方法如下:

$ find . -type f -name '*.c' -exec cat {} \;>all_c_files.txt
$ find . -type f -name '*.c' -exec cat {} > all_c_files.txt \;
$ fine . -type f -name '*.c' -exec cat {} >all_c_files.txt +

我们使用 > 操作符将来自find的数据重定向到all_c_files.txt文件,没有使用>>(追加)的原因是find命令的全部输出就只有一个数据流(stdin),而只有当多个数据流被追加到单个文件中时才有必要使用>>。

2.2.10 让find跳过特定的目录

在搜索时排除某些文件或目录的技巧叫作修剪。下面的例子演示了如何使用-prune选项排
除某些符合条件的文件:

$ find devel/source_path -name '.git' -prune -o -type f -print

-name “.git” –prune是命令中负责进行修剪的部分,它指明了.git目录应该被排除在外。
-type f –print描述了要执行的操作。

三、玩转xargs

3.1 预备知识

xargs命令从stdin处读取一系列参数,然后使用这些参数来执行指定命令。它能将单行或
多行输入文本转换成其他格式,例如单行变多行或是多行变单行。
xargs命令应该紧跟在管道操作符之后。它使用标准输入作为主要的数据源,将从stdin中
读取的数据作为指定命令的参数并执行该命令。下面的命令将在一组C语言源码文件中搜索字符串main:

ls *.c | xargs grep main

3.2 实战演练

3.2.1 将多行输入转换成单行输出

xargs默认的echo命令可以用来将多行输入转换成单行输出:

$ cat example.txt # 样例文件
1 2 3 4 5 6
7 8 9 10
11 12
$ cat example.txt | xargs
1 2 3 4 5 6 7 8 9 10 11 12

3.2.1 将单行输入转换成多行输出

xargs的-n选项可以限制每次调用命令时用到的参数个数。下面的命令将输入分割成多
行,每行N个元素:

$ cat example.txt | xargs -n 3
1 2 3
4 5 6
7 8 9
10 11 12

3.3 工作原理

xargs命令接受来自stdin的输入,将数据解析成单个元素,然后调用指定命令并将这些元素作为该命令的参数。xargs默认使用空白字符分割输入并执行/bin/echo。

我们可以定义一个用来分隔参数的分隔符。-d选项可以为输入数据指定自定义的分隔符:

$ echo "splitXsplit2Xsplit3Xsplit4" | xargs -d X
Split1 split2 split3 split4

xargs命令可以同find命令很好地结合在一起。find的输出可以通过管道传给xargs,由后
者执行-exec选项所无法处理的复杂操作。**如果文件系统的有些文件名中包含空格,find命令的-print0选项可以使用0(NULL)来分隔查找到的元素,然后再用xargs对应的-0选项进行解析。**下面的例子在Samba挂载的文件系统中搜索.docx文件,这些文件名中通常会包含大写字母和空格。其中使用了grep找出内容中不包含image的文件:

$ find /smbMount -iname '*.docx' -print0 | xargs -0 grep -L image

3.4 在命令行中格式化数据

3.4.1 读取stdin,为命令传入格式化参数

下面是一个短小的脚本cecho,可以用来更好地理解xargs是如何提供命令行参数的:

#!/bin/bash
#文件名: cecho.sh
echo $*'#

当参数被传递给文件cecho.sh后,它会打印这些参数并以 #字符作为结尾。例如:

$ ./cecho.sh arg1 arg2
arg1 arg2 #
'

这里有一个常见的问题。
有一个包含着参数列表的文件(每行一个参数)要提供给某个命令(比如cecho.sh)。我
需要以不同的形式来应用这些参数。在第一种形式中,每次调用提供一个参数。

./cecho.sh arg1
./cecho.sh arg2
./cecho.sh arg3

使用xargs时

$ cat args.txt | xargs -n 1 ./cecho.sh
arg1 #
arg2 #
arg3 #

接下来,每次调用提供一到两个参数。

./cecho.sh arg1 arg2
./cecho.sh arg3

使用xargs时

$ cat args.txt | xargs -n 2 ./cecho.sh
arg1 arg2 #
arg3 #

最后,在单次调用中提供所有参数。

./cecho.sh arg1 arg2 arg3

使用xargs时

$ cat args.txt | xargs ./cecho.sh
arg1 arg2 arg3 #

xargs命令可以格式化参数,满足各种需求。

在上面的例子中,由xargs添加的参数都被放置在指定命令的尾部。但我们可能需要在命令末尾有一个固定的参数,并希望xargs能够替换居于中间位置的参数,就像这样:

./cecho.sh -p arg1 -l

在命令执行过程中,**arg1是唯一的可变内容,其余部分都保持不变。**args.txt中的参数是像
这样提供给命令的:

./cecho.sh -p arg1 -l
./cecho.sh -p arg2 -l
./cecho.sh -p arg3 -l

xargs有一个选项-I,可以用于指定替换字符串,这个字符串会在xargs解析输入时被参
数替换掉。如果将-I与xargs结合使用,对于每一个参数,指定命令只会执行一次。来看看解决方法:

$ cat args.txt | xargs -I {} ./cecho.sh -p {} -l
-p arg1 -l #
-p arg2 -l #
-p arg3 -l #

-I {}指定了替换字符串。为该命令提供的各个参数会通过stdin读取并依次替换掉字符
串{}。使用-I的时候,命令以循环的方式执行。如果有3个参数,那么命令就会连
同{}一起被执行3次。{}会在每次执行中被替换为相应的参数。

3.4.2 结合find使用xargs

xargs和find可以配合完成任务。不过在结合使用的时候需要留心。考虑下面的例子:

$ find . -type f -name "*.txt" -print | xargs rm -f

这样做很危险,有可能会误删文件。我们无法预测find命令输出的分隔符究竟是什么(究
竟是’\n’还是’ ‘)。如果有文件名中包含空格符(’ '),xargs会将其误认为是分隔符。例如,bashrc text.txt会被视为bashrc和text.txt。因此上面的命令不会删除bashrc text.txt,而是会把bashrc删除。

使用find命令的-print0选项生成以空字符(’\0’)作为分隔符的输出,然后将其作为
xargs命令的输入。
下列命令会查找并删除所有的.txt文件:

$ find . -type f -name "*.txt" -print0 | xargs -0 rm -f

3.4.3 统计源代码目录中所有C程序文件的行数

$ find source_code_dir_path -type f -name "*.c" -print0 | xargs -0 wc –l

四、用tr 进行转换

4.1 预备知识

tr只能通过stdin(标准输入)接收输入(无法通过命令行参数接收)。其调用格式如下:

tr [options] set1 set2

来自stdin的输入字符会按照位置从set1映射到set2(set1中的第一个字符映射到set2
中的第一个字符,以此类推),然后将输出写入stdout(标准输出)。set1和set2是字符类或字符组。如果两个字符组的长度不相等,那么set2会不断复制其最后一个字符,直到长度与set1相同。如果set2的长度大于set1,那么在set2中超出set1长度的那部分字符则全部被忽略。

4.2 实战演练

要将输入中的字符由大写转换成小写,可以使用下面的命令:

$ echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z'
hello who is this

‘A-Z’和’a-z’都是字符组。我们可以按照需要追加字符或字符类来构造自己的字符组。
‘ABD-}’、‘aA.,’、‘a-ce-x’以及’a-c0-9’等均是合法的集合。定义集合也很简单,不
需要书写一长串连续的字符序列,只需要使用“起始字符-终止字符”这种格式就行了。这种写法也可以和其他字符或字符类结合使用。如果“起始字符-终止字符”不是有效的连续字序列,那么它就会被视为含有3个元素的集合(起始字符、-和终止字符)。你也可以使用像’\t’、’\n’这种特殊字符或其他ASCII字符。

4.3 加密与解密

在tr中利用集合的概念,可以轻松地将字符从一个集合映射到另一个集合中。下面来看一个用tr进行数字加密和解密的例子:

$ echo 12345 | tr '0-9' '9876543210'
87654 # 已加密
$ echo 87654 | tr '9876543210' '0-9'
12345 # 已解密

tr命令可以用来加密。ROT13是一个著名的加密算法。在ROT13算法中,字符会被移动13
个位置,因此文本加密和解密都使用同一个函数:

$ echo "tr came, tr saw, tr conquered." | tr 'a-zA-Z' 'n-za-mN-ZA-M'

输出如下:

ge pnzr, ge fnj, ge pbadhrerq.

对加密后的密文再次使用同样的ROT13函数,我们可以采用:

$ echo ge pnzr, ge fnj, ge pbadhrerq. | tr 'a-zA-Z' 'n-za-mN-ZA-M'

输出如下:

tr came, tr saw, tr conquered.

4.4 用tr删除字符

tr有一个选项-d,可以通过指定需要被删除的字符集合,将出现在stdin中的特定字符清
除掉:

$ cat file.txt | tr -d '[set1]'
#只使用set1,不使用set2

例如:

$ echo "Hello 123 world 456" | tr -d '0-9'
Hello world
# 将stdin中的数字删除并打印删除后的结果

4.5 字符组补集

我们可以利用选项-c来使用set1的补集。下面的命令中,set2是可选的:

tr -c [set1] [set2]

如果只给出了set1,那么tr会删除所有不在set1中的字符。如果也给出了set2,tr会将不
在set1中的字符转换成set2中的字符。如果使用了-c选项,set1和set2必须都给出。如果-c与-d选项同时出现,你只能使用set1,其他所有的字符都会被删除。

下面的例子会从输入文本中删除不在补集中的所有字符:

$ echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'
124

接下来的例子会将不在set1中的字符替换成空格:

$ echo hello 1 char 2 next 4 | tr -c '0-9' ' '
1 2 4

4.6 用tr压缩字符

tr命令能够完成很多文本处理任务。例如,它可以删除字符串中重复出现的字符。基本实现形式如下:

tr -s '[需要被压缩的一组字符]'
$ echo "GNU is not UNIX. Recursive right ?" | tr -s ' '
GNU is not UNIX. Recursive right ?

tr命令还可以用来删除多余的换行符:

$ cat multi_blanks.txt | tr -s '\n'
line 1
line 2
line 3
line 4

将文件中的数字列表进行相加:

$ cat sum.txt
1
2
3
4
5
$ cat sum.txt | echo $[ $(tr '\n' '+' ) 0 ]
15

在命令中,tr命令将’\n’替换成了’+’,我们因此得到了字符串1+2+3+…5+,但是在字符
串的尾部多了一个操作符+。为了抵消这个多出来的操作符,我们再追加一个0。
$[ operation ]执行算术运算,因此就形成了以下命令:

echo $[ 1+2+3+4+5+0 ]

如果有一个包含字母和数字的文件,我们想计算其中的数字之和,这需要更强的技巧性:

$ cat test.txt
first 1
second 2
third 3

利用tr的-d选项删除文件中的字母,然后将空格替换成+:

$ cat test.txt | tr -d [a-z] | echo "total: $[$(tr ' ' '+')]"
total: 6

$[$(tr ' ' '+')]被替换为 $[+1+2+3]

4.7 字符类

tr可以将不同的字符类作为集合使用,所支持的字符类如下所示。
 alnum:字母和数字。
 alpha:字母。
 cntrl:控制(非打印)字符。
 digit:数字。
 graph:图形字符。
 lower:小写字母。
 print:可打印字符。
 punct:标点符号。
 space:空白字符。
 upper:大写字母。
 xdigit:十六进制字符。
可以按照下面的方式选择所需的字符类:

tr [:class:] [:class:]

例如:

$ echo "hello world" | tr '[:lower:]' '[:upper:]'
HELLO WORLD

五、校验与核实

5.1 MD5校验和算法

5.1.1 实战演练

md5sum校验和计算的方法如下:

$ md5sum file1 file2 file3 ..

当使用多个文件时,输出中会在每行中包含单个文件的校验和:

[checksum1] file1
[checksum1] file2
[checksum1] file3

使用下列命令计算md5sum:

$ md5sum filename
68b329da9893e34099c7d8ad5cb9c940 filename

如上所示,md5sum是一个长度为32个字符的十六进制串。我们可以将输出的校验和重定向到一个文件中,以备后用:

$ md5sum filename > file_sum.md5

可以按照下面的方法用生成的文件核实数据完整性:

$ md5sum -c file_sum.md5
test.txt: OK
# 这个命令会输出校验和是否匹配的信息

5.2 对目录进行校验

校验和是从文件中计算得来的。对目录计算校验和意味着需要对目录中的所有文件以递归的方式进行计算。

md5deep或sha1deep命令可以遍历目录树,计算其中所有文件的校验和。你的系统中可能并没有安装这两个程序。可以使用apt-get或yum来安装md5deep软件包。该命令的用法如下:

$ md5deep -rl directory_path > directory.md5
# -r使用递归遍历
# -l使用相对路径。默认情况下,md5deep会输出文件的绝对路径

或者也可以结合find来递归计算校验和:

$ find directory_path -type f –print0 | xargs -0 md5sum >> directory.md5

用下面的命令进行核实:

$ md5sum -c directory.md5

5.3 shadow-like散列(加盐散列)

在Linux中,用户密码是以散列值形式存储在文件/etc/shadow中的。该文件中典型的一行内容类似于下面这样:

test:$6$fG4eWdUi$ohTKOlEUzNk77.4S8MrYe07NTRV4M3LrJnZP9p.qc1bR5c.
EcOruzPXfEu1uloBFUa18ENRH7F70zhodas3cR.:14790:0:99999:7:::

该行中的

$6$fG4eWdUi$ohTKOlEUzNk77.4S8MrYe07NTRV4M3LrJnZP9p.qc1bR5c.
EcOruzPXfEu1uloBFUa18ENRH7F70zhodas3cR

是密码对应的散列值。
有时候,我们编写的一些脚本需要编辑密码或是添加用户。在这种情况下,我们必须生
成shadow密码字符串,向shadow文件中写入类似于上面的文本行。可以使用openssl来
生成shadow密码。shadow密码通常都是加盐密码(salted password)。所谓的“盐”(SALT)就是一个额外的字符串,起混淆的作用,使加密更加难以破解。盐是由一些随机位组成的,它们作为密钥生成函数的输入之一,产生密码的加盐散列。

$ openssl passwd -1 -salt SALT_STRING PASSWORD
$1$SALT_STRING$323VkWkSLHuhbt1zkSsUG.

将SALT_STRING替换为随机字符串并将PASSWORD替换成你想要使用的密码。

六、加密工具与散列

6.1 crypt

crypt命令通常并没有安装在Linux系统中。它是一个简单的加密工具,相对而言不是那
么安全。该命令从stdin接受输入,要求用户创建口令,然后将加密数据输出到 stdout:

$ crypt <input_file >output_file
Enter passphrase:

我们在命令行上提供口令:

$ crypt PASSPHRASE <input_file >encrypted_file

如果需要解密文件,可以使用:

$ crypt PASSPHRASE -d <encrypted_file >output_file

6.2 gpg(GNU privacy guard,GNU隐私保护)

用gpg加密文件:

$ gpg -c filename

命令会采用交互方式读取口令并生成filename.gpg。使用以下命令解密gpg文件:

$ gpg filename.gpg

上述命令读取口令并解密文件。

6.3 base64

Base64是一组相似的编码方案,它将二进制数据转换成以64为基数的形式(radix-64
representation),以可读的ASCII字符串进行描述。这类编码程序可用于通过E-mail传输二进制数据。base64命令能够编码/解码Base64字符串。要将文件编码为Base64格式,可以使用:

$ base64 filename > outputfile

或者

$ cat file | base64 > outputfile

base64命令可以从stdin中读取。
解码Base64数据:

$ base64 -d file > outputfile

或者

$ cat base64_file | base64 -d > outputfile
©️2020 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值