Linux就是这个范儿之第一次亲密接触(3)

Linux 专栏收录该内容
21 篇文章 0 订阅

原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和本声明。否则将追究法律责

1.4 返璞归真的命令行

有一种说法,现代计算机不是靠电力驱动,而是靠“鼠标”。多少应用程序的界面需要移动和点击鼠标来执行的。计算机本来的用意是把人类从反复单调的工作中解放出来,但适得其反,摆在我们身边的残酷现实是我们每个人每天不得不移动和点击鼠标,确保养家糊口的工作能够顺利正确地完成。

别叹气,存在另一个世界,那就是命令行,让你暂时远离鼠标。对那些苦哈哈的程序猿来讲,这也许是另一种情调的工作方式。我们突然之间拥有了另一种意想不到的收获,例如我想看看用户目录下的的文件大小,然后按升序排列产生个报表。如果用C/C++完成这项工作,至少得用好几十行代码,但是用一句命令行就能完成上面的功能。

du -s * | sort -nr > $HOME/space_report.txt

命令行有它的存在价值吧。还有把 Linux 桌面操作录制成一段视频。想起来就是一件复杂的任务,在Linux上用一句命令就能轻松搞定。

ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg

卖个关子,这个命令会在《多媒体篇》有详细解释。

估计你可能会迫不及待的想要实验一下刚才所提到的命令,但是苦于现在都流行的图形界面,我们推荐的Cent OS默认也进入了图形界面,看来做点实验还是有点难度的。不过不用着急,Linux的老手们一定是要命令行的,所以想通过键盘输入命令,一个合格的Linux发行版一定会做得十分方便,只是要先搞清楚一些概念。

1.4.1 开始执行命令

用户和系统不是直接打交道,他们中间有个名字叫Shell的联系人。我们从键盘中输入命令给ShellShell再把它们交给操作系统去执行。

从哪里开始输入命令呢?当然你可以在字符界面输入命令(暂时先放放,稍后再看)。Linux系统还提供一个叫终端模拟器的程序。这个程序打开一个窗口,让我们与Shell交流。Linux系统上的各种软件向来是百花齐放,模拟器终端也不例外,例如gnome-terminalkonsolextermrxvtkvtnxtermeterm等,而大多数Linux发行版会同时支持几种。

使用过Windows操作系统的你,在登录Linux桌面系统后,应该也能轻松地从菜单中选择启动终端的图标点击就可以进入终端模拟器。当然你也可以在文件浏览器中找到叫“konsole”(KDE桌面)或“gnome-terminal”(Gnome桌面)的程序双击执行打开终端窗口。更有意思的是你可以打开任意多个窗口,每个窗口给你一个shell会话。你从中选择了一个窗口开始键盘输入magic。在终端上会显示你刚才敲入的字符magic。接下来还有magic的事情呢,当你按向上箭头时可以看到前一个命令,再按向上箭头又可以看到前一个的前一个命令,按向下箭头命令又可以往回输入显示,最后我们又回到了magic输入,你还可以使用左右箭头移动光标进行字符输入。

哦,我记得有个cp命令,那就试试吧:

$ cp /etc/resolv.conf /etc/resolv.conf.bak

cp: cannot create regular file `/etc/resolv.conf.bak': Permissiondenied

太欺负人了吧,怎么简单的命令都不让偶用。你注意到没有,Shell命令提示符是$,这意味着什么?这意味着你是普通用户,不是超级用户,你没有管理员权限。如果你是拥有管理员权限的超级用户,提示符就变成#,你就可以在系统上做增加,删除和修改文件的操作。

1.4.2 文本和图形的切换

方才我们介绍的方法是目前最常用的在桌面环境下执行命令方法,但是也有很多有“洁癖”的人喜欢使用纯粹的文本终端,这就需要进行图形和文本切换了,或者干脆就关闭图形界面。我们先搞定前者,后者会在后面的章节做十分详细的介绍。

要在文本和图形界面之间来回切换是非常简单的,只需要使用快捷键<Ctrl><Alt><F1>~<F6>来回切换就行,具体什么效果大家可以自己实验,这个地方不同的Linux发行版会有不同的设定,所以本书就不好做定论。一般<Crtl><Alt><F1>代表图形界面,而剩下的5组快捷键对应5个不同的文本终端,我们推荐的Cent OS就是这种设定。还有的设定是<Ctrl><Alt><F7>是图形界面,其它6组快捷键是6个不同的文本终端。

一般不建议使用本小节介绍的方法来操作Linux,除非你有强烈的“洁癖”或遇到有“洁癖”的系统管理员。因为这种方法你能够使用到的独立文本终端最多只有6个。而使用上一小结介绍的在图形界面中使用终端模拟器的方法,则没有文本终端数量的限制,对于一个Linux老手来讲,文本终端永远都是多多益善的。很快你们就会有这种感觉了。

1.4.3 基础命令的操作

提及Linux基本命令,先给你讲述一个浪漫的故事:

曾经有个男孩很喜欢一个女孩,可是不敢表白。他想了一个办法。在Linux终端上输入echo“这周六下午230,能在如嘉咖啡馆一起喝咖啡吗?”>love.txt,然后回车。

接着他找来那张他喜欢的鼓浪屿图片(pic.png),使用 cat pic.png love.txt >pic1.png重新做了一个图片文件。

他鼓起勇气给那个女孩写了封邮件,邮件内容只是:请查阅附件。

女孩收到邮件,用图片浏览器打开后,看到的只是一张美丽的风景图片,有点纳闷。但是聪明的她,立刻猜到了那个男孩的用意。她用tail pic1.png,很快发现了秘密。

$ tail pic1.png

PNG

IHDRmtEXtSoftwareAdobe ImageReadyq<IDATxA0

[图片编码内容,一般人无法直接读懂…….]

)'EDDDqq^cDDD/GDDDDmyw/}!"""“这周六下午2:30,能在如嘉咖啡馆一起喝咖啡吗?”

太妙了,原来学好Linux通过Linux基础命令还可以交女朋友。加大马力,我们来认识更多的命令。不过我们会遇到一个问题,Linux命令太多了,数量至少有200多个,怎么记呀。其实谁也记不住这么多命令,剥丝抽茧抓重点,把重要的和经常使用的搞定了就行。按照它们在系统中所起的作用,我做一下简单地分类说明。

1-1

命令

说明

目录和文件处理:

在讲解之前,我们先认识一下几个好玩的符号

:小点活在当下,即当前目录。例如:./jie_work执行当前目录下的jie_work文件

..:两点跑上去,既到当前的上一级目录。举个例子,命令cd..修改当前工作目录到上一级目录

:水波带我回家,即/home/我的登录名。例如我的登录名为zhangjiecd ~命令就是cd /home/zhangjie。当然你直接输入cd,也有同样功效

mkdir

建立目录

用法:mkdir [OPTION] DIRECTORY

例:mkdir fangru

ls

列出目录下的内容

用法ls [OPTION][FILE]

例:ls -al fangru

cd

更换工作目录

用法:cd [DIRECTORY]

例:cd fangru

pwd

显示当前工作目录

用法:pwd

vim

增强版文本编辑器

用法:vim [OPTION] [file]

例:vim helloworld.c

cp

拷贝文件及其目录

用法:cp [OPTION]... SOURCE DEST

例:cp jie.txt jie.bak

mv

移动(重命名)文件

用法:mv [OPTION]SOURCE DEST

例:mv jieold jienew

rm

删除文件或目录

用法:rm [OPTION]FILE

例:rm -rf jie_dir

find

在目录及其子目录查找文件

用法:find [OPTION] [path] [pattern]

例:find -name jie*.txt

history

显示最近使用过的命令

用法:history

文本处理:

在讲解之前,有必要说明一下模式的定义。

模式是一种表达式,不列出所有元素,而是给出一系列字符串的一种精确描述

例如:ab*cd匹配了以ab开始和cd结束的一系列字符串

cat

连结文件打印到标准输出

用法:cat [OPTION] [FILE]

例:cat pic.png love.txt > pic1.png

还记得那个命令行的故事吧?

echo

显示一行文本

用法:echo [OPTION] [string]

例:echo $HOME

grep

搜索特定的内容并将含有这些内容的行标准输出

用法:grep [OPTION] PATTERN [FILE]

例:grep -i Jagen magicLinux.txt

wc

统计指定文件中的字节数、字数、行数,并将统计结果显示输出

用法:wc [OPTION][FILE]

例:wc -L magicLinux.txt

sort

对文件中的各行进行排序

用法:sort [OPTION][FILE]

例:sort -r magicLinux.txt

系统管理:

在讲解这类命令之前,先谈谈文件权限的定义。Linux系统上文件有三种权限-读、写和执行。敲入ls -l命令后,我们会发现有10个字母表示文件类型和权限信息:第一个字母是文件类型,d代表目录,-代表普通文件;接下了的每三个字母为一组,分别代表拥有者(owner)群组成员(groups)其他人(others)的读、写和执行权限。

例:drwxrw-r--意味着这是一个目录,拥有者拥有读、写和执行三种权限,群组成员拥有读写权限,其他人只拥有可读权限。

权限位还可以用相应的数值来代表,读-4、写-2、执行-1,这些数字或它们的和就代表一个角色的权限。

例:rwxrw-r-- = 764

673 = rw-rwx-wx

chmod

控制用户对文件的权限

用法:chmod [OPTION] [MODE] [FILE]

例:chmod 764 count.sh

chown

改变档案的拥有者

用法:chown [OPTION]OWNER[:[GROUP]] FILE

例:chown jie magicLinux.txt

su

su是切换到其他用户,但是不切换环境变量

su - 是完整的切换到一个用户环境

要知两者的区别,用export命令一查便知。

用法:su [OPTION] [LOGIN]

例:su zhangjie

passwd

更改使用者的密码参数

/etc/passwd

存储的是操作系统用户信息,该文件为所有用户可见


/etc/shadow

被称为/etc/passwd的影子文件。它们之间的内容是互补的。shadow内容包括用户及被加密的密码以及其它/etc/passwd不能包括的信息,比如用户的有效期限等


用法:passwd [OPTION]

例:passwd zhangjie

who

显示目前登入系统的用户信息

用法:who [OPTION]

例:who -b

进程管理

ps

强悍的进程查看命令

用法:ps [OPTION]

例:ps -aef

kill

删除执行中的程序或工作

用法:kill [OPTION]

例:kill -9 3154

jobs

通过jobs命令查到后台正在执行的命令的序号(非进程号pid)

用法:jobs

bg

指定号码(非进程号)的命令进程放到后台运行

用法:输入'ctrl+z' 然后输入 'bg<job id>'

例:bg <job id>

fg

指定号码(非进程号)的命令进程放到前台运行

用法:fg <jobid>

档案

tar

压缩和解压

用法:tar [OPTION] DEST SOURCE

例:tar -cvf /home/archive.tar(压缩)

tar -xvf /home/archive.tar(解压)

zip

打包压缩

用法:zip [OPTION] DEST SOURSE

例:zip original.zip original

unzip

解压缩zip文件

用法:unzip filename

例:unzip original.zip

网络

ssh

远程登录的客户端

用法:ssh [options] [user]@hostname

例:ssh zhangjie@10.105.11.20

scp

基于ssh登陆进行安全的远程文件拷贝命令

用法:scp [options] [[user]@host1:file1] [[user]@host2:file2]

例:scp file1.txt zhangjie@10.105.11.20:~/work/

文件系统

fdisk

观察硬盘之实体使用情形与分割硬盘用

用法:fdisk [options]

例:sudo fdisk -l

mount

如果你要使用储存设备(Mo、硬盘、光驱等),就得先将它挂上(Mount),而当储存设备挂上了之后,就可以把它当成一个目录来进行访问。挂上一个设备使用mount命令

在使用mount这个指令时,至少要先知道下列三种信息:

1. Mount对象的文件系统类型?

2. Mount对象的设备名称?

3. 要将设备Mount到哪个目录去?

用法:mount -t type device dir

例:mount /dev/sda5 /media/target

umount

卸除文件系统

用法:umount [OPTIONS] dir | device

例:umount /media/target

du

查看目录或文件所占用磁盘空间的大小

用法:du [OPTION]……[FILE]……

例:du

df

检查文件系统的磁盘空间占用情况。

用法:df [OPTION]……[FILE]……

例:df

quota

显示磁盘使用情况和限制情况

用法:quota [OPTION]

例:quota -v

扩展

reboot

重启系统

用法:reboot [OPTION]

例:reboot

poweroff

关闭系统

用法:poweroff [OPTION]

例:poweroff

sed

一种在线编辑器,它一次处理一行内容

用法:sed [OPTION] [input-file]

例:sed 's/love/hate/g' loveletter.txt

awk

一种文本处理工具,LinuxUnix环境中功能最强大的数据处理引擎之一。

用法:awk [-F fs] [-v var=value] [-f progfile | 'prog'] [file ……]

例:awk '/^[ns]/{print $1}' test

1.4.4 快捷键

有位老哥在Linux系统上开发一个中文相似度匹配的项目,工作相当努力,已经达到了废寝忘食的地步,但是使用的TF-IDF算法的计算速度还是不尽人意。这时候,他决定先停一停,换换思路,玩玩俄罗斯方块放松一下。突然老板走过来,他下意识地使用<Ctrl><Alt><d>快速隐藏桌面。还好有惊无险,没有被老板发觉在玩游戏,否则又需要一大堆的解释。老板拍了拍他的肩膀走了过去,随后他用<Ctrl><Alt><d>又恢复了原有功能的显示。

举这个好玩的例子可不是让你照着做,而是为了告诉你Linux系统提供了很多快捷键提高命令行使用的工作效率,减少键盘的敲打以及拼写错误。说几个比较实用的快捷键,其他的你自己去挖掘。

1-2

常用快捷键

说明

<Tab>

在文本终端下,使用TAB自动完成命令的输入,或者显示所有的可选项。超好用!

<Shift><PgUp>

滚动文本终端输出。终端屏幕上一屏又一屏的提示信息,就可以用它向上翻滚查看这些信息

<Shift><PgDown>

回滚文本终端输出

<Ctrl><Alt><Delete>

文本终端下关机和重新启动

<Ctrl><Alt><Backspace>

关闭或重启X Window

<Ctrl>a

到正在输入的命令行的首部

<Ctrl>e

到正在输入的命令行的尾部

<Ctrl>c

终止当前进程

<Ctrl>s

停止终端传输

<Ctrl>p

上一条执行的命令

<Ctrl>n

下一条执行的命令,前提是执行过<Ctrl>p

<Ctrl>f

在当前命令输入中右移光标一个字符

<Ctrl>b

在当前命令输入中左移光标一个字符

<Alt>f

在当前命令输入中右移光标一个词

<Alt>b

在当前命令输入中左移光标一个词

<Ctrl>k

删除光标后的所有字符

<Ctrl>d

删除光标当前的字符

<Alt><Tab>

切换不同的程序窗口

<Alt><F1>

访问“开始”菜单

<Alt><鼠标左键>

拖曳并移动一个窗口

<Alt><PrintScreen>

把当前屏幕的快照存到剪贴板

<Ctrl><Alt><d>

哈哈,老板键。切换隐藏/显示桌面运行程序

<Alt><SysRq><key>

组合键主要是针对开发人员的程序调试目的或者在紧急场合下才使用。可以通过设置相对应的内核参数来激活或者取消。

例如:echo "1" > /proc/sys/kernel/sysrq 激活这个组合命令

<Alt><SysRq><s>

防止数据丢失,挂载的文件系统紧急同步把缓存写入硬盘

……

……

<Alt><SysRq><o>

关机。下班了!

使用快捷键太爽了!默认情况下,按TABbash中是可以自动补齐,但仅能自动补齐命令名和文件名。可是我们追求的目标是“更快、更高、更强”,那就安装bash-completion做个增强版的自动补齐吧。使用 TAB 键自动补齐几乎任何内容,包括参数、文件、目录甚至包名称等。安装方法很简单,下载到的包中包含一个bash-completion 文件,将其放在/etc下。在/etc/bash.bashrc文件里加入可执行命令。

# Run bash completion code

if [ -r /etc/bash_completion ]; then

# Source completioncode.

. /etc/bash_completion

fi

1.更快……

举个例子。淘宝的预发环境中的Linux机器不允许直接登陆。需要申请跳板机,通过跳板机才能登陆预发机。在跳板机上,我们经常使用ssh 10.232.15.201操作命令,好麻烦呀。在/etc/hosts中我们加入一行“10.232.15.201 prerelease”。

然后我们使用complete -F _known_hosts ssh告诉ssh需要的主机名。一旦设置好了,我就可以通过敲[TAB]键完成主机名的输入:sshp[TAB]

就完成了prerelease主机名的输入。另外你还可以定制私有命令的补齐功能,不过你需要自己编写Shell脚本实现,然后把这个脚本放在/etc/bash_completion.d/下。在随后的章节,我们会学习Shell脚本的编程。在学完之后,希望你会通过编写脚本产生自己的补齐功能。

2.更高……

有的命令太长,那就把命令缩短。命令别名(alias)就启到这个作用。例如在SuSE版本中有个命令别名的文件(/etc/profile.d/alias.bash)。它里面定义了许多命令别名,例如alias ..='cd ..', 那么在终端上输入..就相当于输入了cd..直接回到上级目录,方便不?

3.更强……

Shell终端上还可以一下子运行多个命令,用“;”就把各个命令串起来,例如:

[命令1];[命令2];[命令3]

不管执行的命令结果如何,就是勇往直前地冲呀杀呀,把这些命令最终执行掉。但是有时候,这些命令之间是有关联的,就需要改改这种傻愣愣地工作方式。如果前一个命令执行成功才执行下一个命令,我们可以用“&&”把命令连接起来。例如:

[命令1]&&[命令2]&&[命令3]

如果前一个命令执行失败才执行下一个命令,我们可以用“||”把命令连接起来。例如:

[命令1]||[命令2]||[命令3]

使用命令行的技巧还真不少,我们可以考虑出版一本专门讲述Linux命令行的参考书了。

1.4.5 错误信息

%boast

bash: fg: %boast: No such job.

尽管当命令执行成功的时候终端屏幕上不显示任何信息,但是当发生错误的时候它经常会以一定的形式汇报错误。上面我开了一个关于Linux错误信息提示的玩笑。boast是吹牛的意思。我在终端上敲入boast后,终端返回错误提示No such job,意思是没有这样的工作。不同的命令返回的错误信息格式有所不同,但是经常有如下格式:命令名:执行内容:错误信息。例如rm jie给出的错误返回是rmcannot remove jie’:No such file or directory.那究竟发生了什么情况?当rm命令要删除jie这个文件,jie这个文件不存在,产生了代号为2的错误。这个错误代号的意思就是找不到相应的文件或目录。错误代码就被自动翻译成No such file or directory。由于错误代码有限(大约有一百多种),有可能许多不同问题对应于同一个错误代码,所以理解要执行的命令和错误信息的关系很重要。当得到错误信息的时候,让我欢喜让我忧,喜的是知道发生什么样的错误,忧的是对错误信息有可能百思不得其解不知道如何去解决,这时候就得凭经验了。

errno.h包含一个完整的基本错误代码列表。除此之外,其他一些头文件(.h)也定义了自己的一些错误代码。

下面的例子列出了所有系统定义的错误代码及错误描述,源代码是:

#include<string.h>

#include <errno.h>

#include <stdio.h>

int main(intargc, char ** argv) {

int i = 0;

for(i = 0; i< 256; i++)

printf("errno.%02dis: %s\n", i, strerror(i));

return 0;

}


编译此程序用命令:

gcc -Wall strerror.c

执行程序:

./a.out

这个程序的输出有点长,所以就不去浪费纸张了,你自己在电脑上看吧。

1.4.6 联机帮助

遇到问题寻找帮助能加快解决问题的速度。在Linux系统上,有以下几个途径使用帮助:

l遇到问题,男人(man)的帮助很靠谱。需要某个命令或者配置文件的帮助,就在终端输入:
man 命令名或man +配置文件。
屏幕就会显示对应命令系统的帮助手册。输入“
q”退出帮助浏览器。

linfo 和 man功能相似,但是包含更多的最新信息。

l使用“命令名 –help”得到一个简略容易消化的命令帮助。

l程序自带README文件或者其他帮助信息文件,例如在/usr/share/doc下的一些手册。

如何在man页中查找信息呢?浏览man页默认的工具是lessless的使用方法很简单。翻页用space,翻半页用u,查找用/紧跟着正则表达式,用n查找下一个匹配项,用shift+ N查找前一个匹配项。如果这页里没有你感兴趣的,按space翻到下页。更多的操作还是man一下less文档吧。

很多命令的man帮助页中涉及到脚本命令、系统调用和编程接口等多方面。例如“man3printf”就是浏览printf的编程手册。用“man -a 【命令名】”查看关于这个【命令名】所有帮助的文档。“man -kscanf”会给你一个所有与scanf有关的man页列表。还有,SEE ALSO经常是被遗忘的角落,但是我经常会在这里发现其他有用的命令或函数,千万不要放过它。

条条大路通罗马,你是Linux系统的主人,如果喜欢用vim阅读man页的话,改一下配置和装个man.vim插件就行,另外使用most工具浏览man页也是一个好主意。

1.4.7 致命的Linux命令

我这可不是开玩笑,有些Linux命令轻则造成数据丢失,重则导致系统瘫痪。您看这位同学漫不经心,敲入了rm -rf/,强制删除 / 目录下的所有文件,这代价可是很惨痛的。

还有一个很好玩的例子,我用旺旺聊天的形式给你讲述:

小雪2012-08-25 15:28:10在你Linux系统上输入这串东西:(){ :|:& };

灰猫2012-08-25 15:28:34长得这么怪?

小雪2012-08-25 15:28:41试试看看是什么结果。谢了。

灰猫2012-08-25 15:28:44不好了。终端一直出现下面的提示:

-bash: fork: retry: Resource temporarily unavailable

-bash: fork: retry: Resource temporarily unavailable

-bash: fork: retry: Resource temporarily unavailable

-bash: fork: retry: Resource temporarily unavailable

-bash: fork: retry: Resource temporarily unavailable

-bash: fork: retry: Resource temporarily unavailable

-bash: fork: retry: Resource temporarily unavailable

-bash: fork: retry: Resource temporarily unavailable

-bash: fork: retry: Resource temporarily unavailable

很惨啊。

小雪2012-08-25 15:29:02:哈哈,真的很惨。

灰猫2012-08-25 15:29:21Ctrl+C都是不管用的。

小雪2012-08-25 15:29:21:即便退出这个终端也是没有用的。

灰猫2012-08-25 15:29:31:最后全都是这个。-bashpipe errorCannot allocate memory-bashpipe errorCannot allocate memory

root用户搞不定,因为killall的速度受到了影响,只能重启机器了。

小雪2012-08-25 15:30:15:这就是著名fork炸弹。看来危害不小。

灰猫2012-08-25 15:30:34:别幸灾乐祸了。能告诉我什么原理吗?

小雪2012-08-25 15:31:43:把:(){ :|:& };写成下面格式你就看懂了

:()

{

:|:&

};

灰猫2012-08-25 15:32:13:明白了。“:”函数里面定义操作是后台执行“:”函数重定向到“:”函数,“:”函数的递归调用。

小雪2012-08-25 15:32:15:是滴。系统执行海量的进程直到死亡。

灰猫2012-08-25 15:32:43:这样的代码不好分析,主要是因为不清楚“:”是可以做为函数名的。

小雪2012-08-25 15:33:12Quite right。另外为了防止这个问题的出现,要限制赋予root权限的用户数量以及单用户的进程数。

灰猫2012-08-25 15:34:12:哈哈。是的,拥有root权限的用户操作不慎很容易给系统造成破坏。

故事还没有结束。如何限制用户的进程数呢?我们可以在/etc/security/limits.conf文件末尾加入一行:

* hard nproc 200

限制用户的进程数为200,但root用户不会受这个限制。

这个命令行还涉及到Shell脚本编程,我们将在后面的章节来学习。

1.5 结束语

我们的第一次亲密接触到此该告一段落了。如果Linux长什么样你依然不知道,那真的实在是抱歉,你太懒了。如果你要问我学习Linux的捷径是什么,我的答案就是两个字:勤劳。一定要勤动手,才能学好Linux

LinuxWindows是完全不同的操作系统,拥有着独特的风采和特性。虽然我们对Linux远不如像Windows那样熟悉和亲切,但是通过本章的亲密接触,或许能够让你体会到一下Linux所特有的那种“笨拙”的温柔。只要那么一点点就足够了,我想那已经足够提起你的欲望了。

接下来,我们将会从多个方面、多个角度以及多个层次,与大家共同去探索,Linux到底是什么样?


  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值