一个.NET Core开发者的Linux入门学习笔记

  1. 云栖社区>
  2. 博客>
  3. 正文

一个.NET Core开发者的Linux入门学习笔记

依乐祝 2019-02-19 11:48:27 浏览6155 评论0

摘要: 用.NET Core开发也有一段时间了,但是由于工作原因一直都是在Windows系统上进行的开发,一直想学习Linux然后把.NET Core开发的程序跑在Linux上,然后把心得体会记录一下发布再博客园,奈何拖延症泛滥,所以只写过一篇《CentOS开发ASP.NET Core入门教程》之后就继续征战Windows了!作为新年Flag之一就是学习Docker,K8S,虽然windows系统也能进行开发,但是毕竟Linux才是正途,因此这两天特地学习了一下Linux系统,并整理成这篇学习笔记,希望对.NET Core开发者学习Linux有所帮助。

linux终端

终端的概念

终端本质上是对应着 Linux 上的 /dev/tty 设备,Linux 的多用户登陆就是通过不同的 /dev/tty 设备完成的,Linux 默认提供了 6 个纯命令行界面的 “terminal”(准确的说这里应该是 6 个 virtual consoles)来让用户登录。在物理机系统上你可以通过使用[Ctrl]+[Alt]+[F1]~[F6]进行切换。

Shell

通常在图形界面中对实际体验带来差异的不是不同发行版的各种终端模拟器,而是这个 Shell(壳)。有壳就有核,这里的核就是指 UNIX/Linux 内核,Shell 是指“提供给使用者使用界面”的软件(命令解析器),类似于 DOS 下的 command(命令行)和后来的 cmd.exe 。普通意义上的 Shell 就是可以接受用户输入命令的程序。它之所以被称作 Shell 是因为它隐藏了操作系统底层的细节。同样的 UNIX/Linux 下的图形用户界面 GNOME 和 KDE,有时也被叫做“虚拟 shell”或“图形 shell”。

重要且常用的快捷键及技巧

1) 重要快捷键:
[Tab]
使用Tab键来进行命令补全,Tab键一般是在字母Q旁边,这个技巧给你带来的最大的好处就是当你忘记某个命令的全称时可以只输入它的开头的一部分,然后按下Tab键就可以得到提示或者帮助完成:
[Ctrl+c]
想想你有没有遇到过这种情况,当你在 Linux 命令行中无意输入了一个不知道的命令,或者错误地使用了一个命令,导致在终端里出现了你无法预料的情况,比如,屏幕上只有光标在闪烁却无法继续输入命令,或者不停地输出一大堆你不想要的结果。你想要立即停止并恢复到你可控的状态,那该怎么办呢?这时候你就可以使用Ctrl+c键来强行终止当前程序(你可以放心它并不会使终端退出)。
其他一些常用快捷键
按键 作用
Ctrl+d 键盘输入结束或退出终端
Ctrl+s 暂停当前程序,暂停后按下任意键恢复运行
Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg
Ctrl+a 将光标移至输入行头,相当于Home键
Ctrl+e 将光标移至输入行末,相当于End键
Ctrl+k 删除从光标所在位置到行末
Alt+Backspace 向前删除一个单词
Shift+PgUp 将终端显示向上滚动
Shift+PgDn 将终端显示向下滚动

2) 学会利用历史输入命令
很简单,你可以使用键盘上的方向上键↑,恢复你之前输入过的命令,你一试便知。

3) 学会使用通配符
通配符是一种特殊语句,主要有星号(*)和问号(?),用来对字符串进行模糊匹配(比如文件名、参数名)。当查找文件夹时,可以使用它来代替一个或多个真正字符;当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正字符。
先使用 touch 命令创建 2 个文件,后缀都为 txt:

$ touch adsfasd.txt wergjlkas.txt
$ ls *.txt
在创建文件的时候,如果需要一次性创建多个文件,比如:“love_1_linux.txt,love_2_linux.txt,... love_10_linux.txt”。在 Linux 中十分方便:
$ touch love_{1..10}_linux.txt
Shell 常用通配符:
字符 含义

  • 匹配 0 或多个字符

        匹配任意一个字符
    list]    匹配 list 中的任意单一字符
    !list]    匹配 除list 中的任意单一字符以外的字符
    c1-c2]    匹配 c1-c2 中的任意单一字符 如:[0-9][a-z]
    string1,string2,...}    匹配 string1 或 string2 (或更多)其一字符串
    c1..c2}    匹配 c1-c2 中全部字符 如{1..10}

    4) 学会在命令行中获取帮助

在 Linux 环境中,如果你遇到困难,可以使用man命令,它是Manual pages的缩写。
$ man
$ man 1 ls
会显示第一区段中的ls命令 man 页面。
man 手册的内容很多,涉及了 Linux 使用过程中的方方面面。为了便于查找,man 手册被进行了分册(分区段)处理,在 Research UNIX、BSD、OS X 和 Linux 中,手册通常被分为8个区段

Linux 用户管理

用户管理

请打开终端,输入命令:
$ who am i
或者
$ who mom likes
who 命令其它常用参数
参数 说明
-a 打印能打印的全部
-d 打印死掉的进程
-m 同am i,mom likes
-q 打印当前登录用户数及用户名
-u 打印当前登录用户登录信息
-r 打印运行等级

创建用户

在 Linux 系统里, root 账户拥有整个系统至高无上的权利,比如 新建/添加 用户。
su,su- 与 sudo
su 可以切换到用户 user,执行时需要输入目标用户的密码,sudo 可以以特权级别运行 cmd 命令,需要当前用户属于 sudo 组,且需要输入当前用户的密码。su - 命令也是切换用户,同时环境变量也会跟着改变成目标用户的环境变量。
现在我们新建一个叫 yilezhu 的用户:
$ sudo adduser yilezhu
这个命令不但可以添加用户到系统,同时也会默认为新用户创建 home 目录:
$ ls /home
现在你已经创建好一个用户,并且你可以使用你创建的用户登录了,使用如下命令切换登录用户:
$ su -l yilezhu
退出当前用户跟退出终端一样可以使用 exit 命令或者使用快捷键 Ctrl+d。

用户组

在 Linux 里面每个用户都有一个归属(用户组),用户组简单地理解就是一组用户的集合,它们共享一些资源和权限,同时拥有私有资源,就跟家的形式差不多,你的兄弟姐妹(不同的用户)属于同一个家(用户组),你们可以共同拥有这个家(共享资源),爸妈对待你们都一样(共享权限),你偶尔写写日记,其他人未经允许不能查看(私有资源和权限)。当然一个用户是可以属于多个用户组的,正如你既属于家庭,又属于学校或公司。
方法一:使用 groups 命令
$ groups yilezhu
可以查看下 /etc/sudoers.d/yilezhu 文件,我们在 /etc/sudoers.d 目录下创建了这个文件,从而给 yilezhu 用户赋予了 sudo 权限:
$sudo cat /etc/sudoers.d/yilezhu
方法二:查看 /etc/group 文件
$ cat /etc/group | sort
这里 cat 命令用于读取指定文件的内容并打印到终端输出,后面会详细讲它的使用。 | sort 表示将读取的文本进行一个字典排序再输出
没找到,没关系,你可以使用命令过滤掉一些你不想看到的结果:
$ cat /etc/group | grep -E "yilezhu"
/etc/group 的内容包括用户组(Group)、用户组口令、GID 及该用户组所包含的用户(User),每个用户组一条记录。格式如下:
group_name:password:GID:user_list
你看到上面的 password 字段为一个 x 并不是说密码就是它,只是表示密码不可见而已。
将其它用户加入 sudo 用户组
默认情况下新创建的用户是不具有 root 权限的,也不在 sudo 用户组,可以让其加入 sudo 用户组从而获取 root 权限:
$ su -l yilezhu
$ sudo ls
会提示 lilei 不在 sudoers 文件中,意思就是 lilei 不在 sudo 用户组中,至于 sudoers 文件(/etc/sudoers)你现在最好不要动它,操作不慎会导致比较麻烦的后果。
使用 usermod 命令可以为用户添加用户组,同样使用该命令你必需有 root 权限,你可以直接使用 root 用户为其它用户添加用户组,或者用其它已经在 sudo 用户组的用户使用 sudo 命令获取权限来执行该命令。
这里我用 root 用户执行 sudo 命令将 yilezhu 添加到 sudo 用户组,让它也可以使用 sudo 命令获得 root 权限:
$ su root # 此处需要输入root用户密码
$ groups yilezhu
$ sudo usermod -G sudo yilezhu
$ groups yilezhu
然后你再切换回 yilezhu 用户,现在就可以使用 sudo 获取 root 权限了。

删除用户

删除用户是很简单的事:
$ sudo userdel -rf yilezhu

拓展

adduser 和 useradd 的区别是什么?
答:useradd 只创建用户,创建完了用 passwd yilezhu 去设置新用户的密码。adduser 会创建用户,创建目录,创建密码(提示你设置),做这一系列的操作。其实 useradd、userdel 这类操作更像是一种命令,执行完了就返回。而 adduser 更像是一种程序,需要你输入、确定等一系列操作

Linux 文件权限

查看文件权限

使用较长格式列出文件:

$ ls -l

img

显示除了 .(当前目录)和 ..(上一级目录)之外的所有文件,包括隐藏文件(Linux 下以 . 开头的文件为隐藏文件)。

$ ls -A

查看某一个目录的完整属性,而不是显示目录里面的文件属性:

$ ls -dl <目录名>

显示所有文件大小,并以普通人类能看懂的方式呈现:

$ ls -AsSh

其中小 s 为显示文件大小,大 S 为按文件大小排序,若需要知道如何按其它方式排序,请使用“man”命令查询。

变更文件所有者

假设目前是 yilezhu 用户登录,新建一个文件,命名为 “ huawei ”:

$ touch huawei

现在,换回到 root 用户身份,使用以下命令变更文件所有者为 root :

$ cd /home/yilezhu

$ ls huawei

$ sudo chown root huawei

3.3 修改文件权限

如果你有一个自己的文件不想被其他用户读、写、执行,那么就需要对文件的权限做修改,这里有两种方式:

方式一:二进制数字表示

img

每个文件的三组权限(拥有者,所属用户组,其他用户,记住这个顺序是一定的)对应一个 " rwx ",也就是一个 “ 7 ” ,所以如果我要将文件“ huawei ”的权限改为只有我自己可以用那么就这样:

为了演示,我先在文件里加点内容:

$ echo "echo "hello root"" > huawei

然后修改权限:

$ chmod 700 huawei

方式二:加减赋值操作

完成上述相同的效果,你可以:

$ chmod go-rw huawei

g、o 还有 u 分别表示 group、others 和 user,+ 和 - 分别表示增加和去掉相应的权限。

Linux 目录结构

FHS 标准

FHS 定义了两层规范,第一层是, / 下面的各个目录应该要放什么文件数据,例如 /etc 应该放置设置文件,/bin 与 /sbin 则应该放置可执行文件等等。

第二层则是针对 /usr 及 /var 这两个目录的子目录来定义。例如 /var/log 放置系统登录文件,/usr/share 放置共享数据等等。

sudo apt-get update

sudo apt-get install tree

列出所有文件

$ tree /

1548566340156

目录路径

路径

使用 cd 命令可以切换目录,在 Linux 里面使用 . 表示当前目录,.. 表示上一级目录(注意,我们上一节介绍过的,以 . 开头的文件都是隐藏文件,所以这两个目录必然也是隐藏的,你可以使用 ls -a 命令查看隐藏文件), - 表示上一次所在目录,~ 通常表示当前用户的 home 目录。使用 pwd 命令可以获取当前所在路径(绝对路径)。

进入上一级目录:

$ cd ..

进入你的 home 目录:

$ cd ~

或者 cd /home/<你的用户名>

使用 pwd 获取当前路径:

$ pwd

绝对路径

关于绝对路径,简单地说就是以根" / "目录为起点的完整路径,以你所要到的目录为终点,表现形式如:

/usr/local/bin,表示根目录下的 usr 目录中的 local 目录中的 bin 目录。

相对路径

相对路径,也就是相对于你当前的目录的路径,相对路径是以当前目录 . 为起点,以你所要到的目录为终点,表现形式如:

usr/local/bin (这里假设你当前目录为根目录)。你可能注意到,我们表示相对路径实际并没有加上表示当前目录的那个 . ,而是直接以目录名开头,因为这个 usr 目录为 / 目录下的子目录,是可以省略这个 . 的(以后会讲到一个类似不能省略的情况);如果是当前目录的上一级目录,则需要使用 .. ,比如你当前目录为 home 目录,根目录就应该表示为 ../../ ,表示上一级目录( home 目录)的上一级目录( / 目录)。

下面我们以你的 home目录为起点,分别以绝对路径和相对路径的方式进入 /usr/local/bin 目录:

绝对路径

$ cd /usr/local/bin

相对路径

$ cd ../../usr/local/bin

提示:在进行目录切换的过程中请多使用 Tab 键自动补全,可避免输入错误,连续按两次 Tab 可以显示全部候选结果。

Linux 文件的基本操作

新建

新建空白文件

使用 touch 命令创建空白文件,关于 touch 命令,其主要作用是来更改已有文件的时间戳的(比如,最近访问时间,最近修改时间),但其在不加任何参数的情况下,只指定一个文件名,则可以创建一个指定文件名的空白文件(不会覆盖已有同名文件),当然你也可以同时指定该文件的时间戳

新建目录

使用 mkdir(make directories)命令可以创建一个空目录,也可同时指定创建目录的权限属性。

创建名为“ mydir ”的空目录:

$ mkdir mydir

使用 -p 参数,同时创建父目录(如果不存在该父目录),如下我们同时创建一个多级目录(这在安装软件、配置安装路径时非常有用):

$ mkdir -p father/son/grandson

复制

复制文件

使用 cp(copy)命令复制一个文件到指定目录。

将之前创建的“ test ”文件复制到“ /home/root/father/son/grandson ”目录中:

$ cp test father/son/grandson

复制目录

如果直接使用 cp 命令复制一个目录的话,会出现如下错误:

要成功复制目录需要加上 -r 或者 -R 参数,表示递归复制,就是说有点“株连九族”的意思:

$ cp -r father family

删除

删除文件

使用 rm(remove files or directories)命令删除一个文件:

$ rm test

有时候你会遇到想要删除一些为只读权限的文件,直接使用 rm 删除会显示一个提示,如下:

你如果想忽略这提示,直接删除文件,可以使用 -f 参数强制删除:

$ rm -f test

删除目录

跟复制目录一样,要删除一个目录,也需要加上 -r 或 -R 参数:

$ rm -r family

移动文件与文件重命名

移动文件

使用 mv(move or rename files)命令移动文件(剪切)。将文件“ file1 ”移动到 Documents 目录:

mv 源目录文件 目的目录:

$ mkdir Documents

$ mv file1 Documents

重命名文件

将文件“ file1 ”重命名为“ myfile ”:

mv 旧的文件名 新的文件名:

$ mv file1 myfile

查看文件

使用 cat,tac 和 nl 命令查看文件

前两个命令都是用来打印文件内容到标准输出(终端),其中 cat 为正序显示,tac 为倒序显示。

比如我们要查看之前从 /etc 目录下拷贝来的 passwd 文件:

$ cat passwd

可以加上 -n 参数显示行号:

$ cat -n passwd

nl 命令,添加行号并打印,这是个比 cat -n 更专业的行号打印命令。

这里简单列举它的常用的几个参数:

-b : 指定添加行号的方式,主要有两种:

​ -b a:表示无论是否为空行,同样列出行号("cat -n"就是这种方式)

​ -b t:只列出非空行的编号并列出(默认为这种方式)

-n : 设置行号的样式,主要有三种:

​ -n ln:在行号字段最左端显示

​ -n rn:在行号字段最右边显示,且不加 0

​ -n rz:在行号字段最右边显示,且加 0

-w : 行号字段占用的位数(默认为 6 位)

使用 more 和 less 命令分页查看文件

如果说上面的 cat 是用来快速查看一个文件的内容的,那么这个 more 和 less 就是天生用来"阅读"一个文件的内容的,比如说 man 手册内部就是使用的 less 来显示内容。其中 more 命令比较简单,只能向一个方向滚动,而 less 为基于 more 和 vi (一个强大的编辑器,我们有单独的课程来让你学习)开发,功能更强大

使用 head 和 tail 命令查看文件

$ tail /etc/passwd

甚至更直接的只看一行, 加上 -n 参数,后面紧跟行数:

$ tail -n 1 /etc/passwd

查看文件类型

前面我提到过,在 Linux 中文件的类型不是根据文件后缀来判断的,我们通常使用 file 命令查看文件的类型:

$ file /bin/ls

搜索文件

与搜索相关的命令常用的有 whereis,which,find 和 locate 。
whereis 简单快速
$whereis who
locate 快而全
它可以用来查找指定目录下的不同文件类型,如查找 /etc 下所有以 sh 开头的文件:
$ locate /etc/sh
注意,它不只是在 /etc 目录下查找,还会自动递归子目录进行查找。
查找 /usr/share/ 下所有 jpg 文件:
$ locate /usr/share/*.jpg
注意要添加 * 号前面的反斜杠转义,否则会无法找到。
如果想只统计数目可以加上 -c 参数,-i 参数可以忽略大小写进行查找,whereis 的 -b、-m、-s 同样可以使用。
which 小而精
which 本身是 Shell 内建的一个命令,我们通常使用 which 来确定是否安装了某个指定的软件,因为它只从 PATH 环境变量指定的路径中去搜索命令:
$ which man
find 精而细
find 应该是这几个命令中最强大的了
这条命令表示去 /etc/ 目录下面 ,搜索名字叫做 interfaces 的文件或者目录。这是 find 命令最常见的格式,千万记住 find 的第一个参数是要搜索的地方:
$ sudo find /etc/ -name interfaces
意 find 命令的路径是作为第一个参数的, 基本命令格式为 find [path] [option] [action] 。
与时间相关的命令参数:
参数 说明
-atime 最后访问时间
-ctime 最后修改文件内容的时间
-mtime 最后修改文件属性的时间
下面以 -mtime 参数举例:
-mtime n:n 为数字,表示为在 n 天之前的“一天之内”修改过的文件
-mtime +n:列出在 n 天之前(不包含 n 天本身)被修改过的文件
-mtime -n:列出在 n 天之内(包含 n 天本身)被修改过的文件
-newer file:file 为一个已存在的文件,列出比 file 还要新的文件名
列出 home 目录中,当天(24 小时之内)有改动的文件:
$ find ~ -mtime 0
列出用户家目录下比 Code 文件夹新的文件:
$ find ~ -newer /home/root/Code

文件打包与压缩

文件后缀名 说明
*.zip zip 程序打包压缩的文件
*.rar rar 程序压缩的文件
*.7z 7zip 程序压缩的文件
*.tar tar 程序打包,未压缩的文件
*.gz gzip 程序(GNU zip)压缩的文件
*.xz xz 程序压缩的文件
*.bz2 bzip2 程序压缩的文件
*.tar.gz tar 打包,gzip 程序压缩的文件
*.tar.xz tar 打包,xz 程序压缩的文件
*tar.bz2 tar 打包,bzip2 程序压缩的文件
*.tar.7z tar 打包,7z 程序压缩的文件

zip 压缩打包程序

使用 zip 打包文件夹:
$ zip -r -q -o yilezhu.zip /home/root
$ du -h yilezhu.zip
$ file yilezhu.zip
上面命令将目录 /home/root 打包成一个文件,并查看了打包后文件的大小和类型。第一行命令中,-r 参数表示递归打包包含子目录的全部内容,-q 参数表示为安静模式,即不向屏幕输出信息,-o,表示输出文件,需在其后紧跟打包输出文件名。后面使用 du 命令查看打包后文件的大小(后面会具体说明该命令)。
设置压缩级别为 9 和 1(9 最大,1 最小),重新打包:
$ zip -r -9 -q -o yilezhu_9.zip /home/root -x ~/*.zip
$ zip -r -1 -q -o yilezhu_1.zip /home/root -x ~/*.zip
这里添加了一个参数用于设置压缩级别 -[1-9],1 表示最快压缩但体积大,9 表示体积最小但耗时最久。最后那个 -x 是为了排除我们上一次创建的 zip 文件,否则又会被打包进这一次的压缩文件中,注意:这里只能使用绝对路径,否则不起作用。
我们再用 du 命令分别查看默认压缩级别、最低、最高压缩级别及未压缩的文件的大小:
$ du -h -d 0 *.zip ~ | sort
通过 man 手册可知:
h, --human-readable(顾名思义,你可以试试不加的情况)
d, --max-depth(所查看文件的深度)

使用 unzip 命令解压缩 zip 文件

将 yilezhu.zip 解压到当前目录:
$ unzip yilezhu.zip
使用安静模式,将文件解压到指定目录:
$ unzip -q yilezhu.zip -d ziptest
上述指定目录不存在,将会自动创建。如果你不想解压只想查看压缩包的内容你可以使用 -l 参数:
$ unzip -l yilezhu.zip
使用 -O(英文字母,大写 o)参数指定编码类型:
unzip -O GBK 中文压缩文件.zip(解决中文编码问题)

rar 打包压缩命令

rar 也是 Windows 上常用的一种压缩文件格式,在 Linux 上可以使用 rar 和 unrar 工具分别创建和解压 rar 压缩包。

安装 rar 和 unrar 工具:
$ sudo apt-get update
$ sudo apt-get install rar unrar
从指定文件或目录创建压缩包或添加文件到压缩包:
$ rm *.zip
$ rar a yilezhu.rar .
上面的命令使用 a 参数添加一个目录 ~ 到一个归档文件中,如果该文件不存在就会自动创建。
注意:rar 的命令参数没有 -,如果加上会报错。
从指定压缩包文件中删除某个文件:
$ rar d yilezhu.rar .zshrc
查看不解压文件:
$ rar l yilezhu.rar
使用 unrar 解压 rar 文件
全路径解压:
$ unrar x yilezhu.rar
去掉路径解压:
$ mkdir tmp
$ unrar e yilezhu.rar tmp/

tar 打包工具

在 Linux 上面更常用的是 tar 工具,tar 原本只是一个打包工具,只是同时还是实现了对 7z、gzip、xz、bzip2 等工具的支持,这些压缩工具本身只能实现对文件或目录(单独压缩目录中的文件)的压缩,没有实现对文件的打包压缩,所以我们也无需再单独去学习其他几个工具,tar 的解压和压缩都是同一个命令,只需参数不同,使用比较方便。

下面先掌握 tar 命令一些基本的使用方式,即不进行压缩只是进行打包(创建归档文件)和解包的操作。

创建一个 tar 包:
$ tar -cf yilezhu.tar ~

上面命令中,-c 表示创建一个 tar 包文件,-f 用于指定创建的文件名,注意文件名必须紧跟在 -f 参数之后,比如不能写成 tar -fc yilezhu.tar,可以写成 tar -f yilezhu.tar -c ~。你还可以加上 -v 参数以可视的的方式输出打包的文件。上面会自动去掉表示绝对路径的 /,你也可以使用 -P 保留绝对路径符。

解包一个文件(-x 参数)到指定路径的已存在目录(-C 参数):
$ mkdir tardir
$ tar -xf yilezhu.tar -C tardir
只查看不解包文件 -t 参数:
$ tar -tf yilezhu.tar
保留文件属性和跟随链接(符号链接或软链接),有时候我们使用 tar 备份文件当你在其他主机还原时希望保留文件的属性(-p 参数)和备份链接指向的源文件而不是链接本身(-h 参数):
$ tar -cphf etc.tar /etc
对于创建不同的压缩格式的文件,对于 tar 来说是相当简单的,需要的只是换一个参数,这里我们就以使用 gzip 工具创建 *.tar.gz 文件为例来说明。

我们只需要在创建 tar 文件的基础上添加 -z 参数,使用 gzip 来压缩文件:
$ tar -czf yilezhu.tar.gz ~
解压 *.tar.gz 文件:
$ tar -xzf yilezhu.tar.gz
现在我们要使用其它的压缩工具创建或解压相应文件只需要更改一个参数即可:
压缩文件格式 参数
*.tar.gz -z
*.tar.xz -J
*tar.bz2 -j

总结

其实今天总结的内容挺多的,主要是因为对于我这个.NET Core开发者来说Linux是一个全新的领域,所以感觉需要记忆的内容太多太多了!而作为开发者,虽然不需要掌握Linux的核心优化等等内容,但是基本的操作还是需要掌握的,毕竟公司里面基本是开发运维的工作一肩挑的,所以,Linux我来了!
后续在.net core程序进行在Linux系统上部署的话可能还需要涉及一些命令,这个后期用到了在进行记录吧!今天就先到这里了!感谢大家的阅读!

【云栖快讯】阿里巴巴小程序繁星计划,20亿补贴第一弹云应用立即开通购买,限量从速!  详情请点击

网友评论