Linux基础操作命令

一、linux主题

1、 安装zsh(我这里是ubuntu系统):apt install zsh(centos下:sudo yum install zsh

2、百度搜索:oh my zsh,首页找到Install oh-my-zsh now,复制命令至命令行

$ sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
主题.png

3、若提示Error: git is not installed,那么需要安装git:apt install git,centos下:install git

4、安装完成后再次输入$ sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"命令就OK了。

二、文件和目录管理

1、创建一个新的单个test目录:mkdir test

2、创建一个多级目录:mkdir -p test/test1/test2

3、创建一个test文件:touch test

4、删除一个空目录test(假设test目录下不存在任何子目录以及文件):rmdir test

5、删除一个存在子目录或者存在文件的目录(不提示任何信息):rm -r test

6、删除一个存在子目录或者存在文件的目录(提示是否确认删除):rm -ri test

7、删除一个存在子目录或者存在文件的目录(有些情况下目录会默认提示你是否删除,此时我们不想要它提示,ps:有些危险,使用需谨慎,可能需要坐牢):rm -rf test

8、复制命令:

创建一个文件:touch xing.txt

编辑此文件:vim xing.txt

将xing.txt复制一份新的并命名为jia.txt:cp xing.txt jia.txt

创建一个demo目录:mkdir demo

将demo复制一份并命名demo_1:cp -r demo demo_1

9、查看文件内容:

cat test.txt

查看文件内容,并且可以使用上下按键进行 翻页:less test.txt

查看文件内容前五行:head -5 test.txt

查看文件内容后五行:tail -5 test.txt

10、新增用户、用户组、赋予权限

新增用户租:groupadd xingVIP

新增用户:useradd fujiaxing

将tests目录所属组更改为xingVIP组下:chgrp xingVIP tests

查看tests所属组:ls -al

[root@instance-3uldysh5 opt]# ls -al
total 32
drwxr-xr-x.  8 root root    4096 Apr 20 11:08 .
dr-xr-xr-x. 18 root root    4096 Mar 31 16:13 ..
drwxr-xr-x   3 root root    4096 Dec 18 15:18 avalokita
drwxr-xr-x   8 root root    4096 Dec 18 15:18 bcm-agent
drwxr-xr-x   3 root root    4096 Apr  1 14:07 HellpWorld
drwxr-xr-x  12 root root    4096 Apr  1 00:25 hosteye
drwxr-xr-x   3 root root    4096 Mar 31 16:23 python_code
-rw-r--r--   1 root root       0 Apr  2 17:17 test
drwxr-xr-x   2 root xingVIP 4096 Apr 20 11:08 tests

将test所属用户由root更改为fujiaixng:chown fujiaixng tests

查看tests所属用户:ls -al

[root@instance-3uldysh5 opt]# chown fujiaxing tests
[root@instance-3uldysh5 opt]# ls -al
total 32
drwxr-xr-x.  8 root      root    4096 Apr 20 11:08 .
dr-xr-xr-x. 18 root      root    4096 Mar 31 16:13 ..
drwxr-xr-x   3 root      root    4096 Dec 18 15:18 avalokita
drwxr-xr-x   8 root      root    4096 Dec 18 15:18 bcm-agent
drwxr-xr-x   3 root      root    4096 Apr  1 14:07 HellpWorld
drwxr-xr-x  12 root      root    4096 Apr  1 00:25 hosteye
drwxr-xr-x   3 root      root    4096 Mar 31 16:23 python_code
-rw-r--r--   1 root      root       0 Apr  2 17:17 test
drwxr-xr-x   2 fujiaxing xingVIP 4096 Apr 20 11:08 tests 

将tests赋予权限(所有可读可写可执行):chmod 777 tests

drwxrwxrwx   2 fujiaxing xingVIP 4096 Apr 20 11:08 

11、查找文件

使用which查找文件(只能查找PATH环境变量中出现的路径下的可执行文件,有时候我们不知道某个命令的绝对路径,使用which就可以了):which ls

[root@instance-3uldysh5 bin] #which ls
alias ls='ls --color=auto'
        /usr/bin/ls

使用whereis命令查找文件,预先生成一个文件列表库查找与给出的文件名相关的文件,格式为whereis [-bms] [文件名称](-b:只查找二进制文件、-m:只查找帮助文件(在man目录下的文件)、-s:只查找源代码文件)

[root@instance-3uldysh5 bin]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1p/ls.1p.gz /usr/share/man/man1/ls.1.gz
[root@instance-3uldysh5 bin]# whereis -b ls
ls: /usr/bin/ls
[root@instance-3uldysh5 bin]# whereis -bm ls
ls: /usr/bin/ls /usr/share/man/man1p/ls.1p.gz /usr/share/man/man1/ls.1.gz
[root@instance-3uldysh5 bin]# whereis -bms ls
ls: /usr/bin/ls /usr/share/man/man1p/ls.1p.gz /usr/share/man/man1/ls.1.gz

使用find命名进行查找,可以根据名称进行查找,格式为find -name [文件名字] (注意:这个文件名字得是文件名称或后缀名都匹配才可以被查找到)

使用find命令进行查找,也可以根据类型进行查找,格式为 find -type d (文件类型有:f、b、c、d、l、s等类型)

[root@instance-3uldysh5 bin]# find -name test
./test
[root@instance-3uldysh5 bin]# find -type d
.

三、磁盘管理

1、查看磁盘使用情况:df -h(以合适的方式展示,可以使用-k,-m,-b,-hc(总用量的汇总,不常用))

[root@instance-3uldysh5 bin]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        974M     0  974M   0% /dev
tmpfs           989M     0  989M   0% /dev/shm
tmpfs           989M  596K  988M   1% /run
tmpfs           989M     0  989M   0% /sys/fs/cgroup
/dev/vda1        40G  4.5G   33G  12% /
tmpfs           198M     0  198M   0% /run/user/0

2、查看总用量:du -sh

[root@instance-3uldysh5 bin]# du -sh
95M     .

3、查看当前分区磁盘的基本信息:fdisk -l

4、新建分区:首先要在当前系统中创建一个磁盘(大小自己定),然后进行一系列分区(以下操作在ubuntu系统下完成);

pyvip@Vip:~$ sudo fdisk -l   #查看当前磁盘信息
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x046d2b38

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1  *        2048 39845887 39843840   19G 83 Linux
/dev/sda2       39847934 41940991  2093058 1022M  5 Extended
/dev/sda5       39847936 41940991  2093056 1022M 82 Linux swap / Solaris


Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors  #这个磁盘就是我们新建的磁盘
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/cryptswap1: 1021.5 MiB, 1071120384 bytes, 2092032 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
pyvip@Vip:~$ sudo fdisk /dev/sdb    #选择该磁盘的路径,并进入

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x4c80da65.

Command (m for help): m        #获取帮助信息

Help:

  DOS (MBR)
   a   toggle a bootable flag
   b   edit nested BSD disklabel
   c   toggle the dos compatibility flag

  Generic
   d   delete a partition
   F   list free unpartitioned space
   l   list known partition types
   n   add a new partition
   p   print the partition table
   t   change a partition type
   v   verify the partition table
   i   print information about a partition

  Misc
   m   print this menu
   u   change display/entry units
   x   extra functionality (experts only)

  Script
   I   load disk layout from sfdisk script file
   O   dump disk layout to sfdisk script file

  Save & Exit
   w   write table to disk and exit
   q   quit without saving changes

  Create a new label
   g   create a new empty GPT partition table
   G   create a new empty SGI (IRIX) partition table
   o   create a new empty DOS partition table
   s   create a new empty Sun partition table


Command (m for help): n       #选择新建分区
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p    #选择主分区
Partition number (1-4, default 1): 3    #1-4随便选择就好
First sector (2048-20971519, default 2048): 2048   #可以手动输入,也可以默认
Last sector, +sectors or +size{K,M,G,T,P} (2048-20971519, default 20971519):

Created a new partition 3 of type 'Linux' and of size 10 GiB.     #成功创建一个分区

Command (m for help):

成功分区后,并未显示出来,还需要进行格式化操作;

pyvip@Vip:~$ sudo mke2fs -t ext4 /dev/sdb    #格式化,设置为一个ext4格式的磁盘
mke2fs 1.42.13 (17-May-2015)
Creating filesystem with 2621440 4k blocks and 655360 inodes
Filesystem UUID: d1177e9b-863b-4300-8e0f-3c375d048da3
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

此时我们已经完全创建好了一个新的磁盘,但是这个新的磁盘所在路径很复杂,所以我们需要将它进行挂载,我这里将这个磁盘挂载至/home下的/GuaZai目录中;

pyvip@Vip:/home$ sudo mount /dev/sdb /home/GuaZai/    #mount命令为挂载命令
pyvip@Vip:/home$ ls
GuaZai  pyvip
pyvip@Vip:/home$ sudo df -h
Filesystem            Size  Used Avail Use% Mounted on
udev                  482M     0  482M   0% /dev
tmpfs                 100M  3.2M   97M   4% /run
/dev/sda1              19G  3.9G   14G  23% /
tmpfs                 500M  4.0K  500M   1% /dev/shm
tmpfs                 5.0M     0  5.0M   0% /run/lock
tmpfs                 500M     0  500M   0% /sys/fs/cgroup
tmpfs                 100M     0  100M   0% /run/user/1000
/home/pyvip/.Private   19G  3.9G   14G  23% /home/pyvip
/dev/sdb              9.8G   23M  9.2G   1% /home/GuaZai

不需要时可以卸载:unmount /dev/sdb

补充:当我们创建好新的磁盘并挂载成功后,重启系统后这个磁盘会消失,因此我们需要进行配置:

进入/etc目录下:cd /etc

编辑fstab文件:vim fstab

#
# /etc/fstab
# Created by anaconda on Mon Jun 22 02:56:36 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
UUID=decd9e73-2b1d-4286-98be-8b15dfc92ccb /                       ext4    defaults        1 1i
#加入下面的命令
/dev/sdb                            /home/GuaZai                  ext4    defaults        0   0 

四、linux系统文件的压缩与打包

linux下最常见的压缩文件通常是tar.gz、此外还有.tar、.gz、.zip、.bz2;linux下的文件后缀名可加可不加,但是压缩文件最好加上,因为需要判断使用哪种压缩工具进行压缩,才能正确的压缩该类型的文件;

常见压缩文件的种类与压缩工具:

1、.gz:表示由gzip压缩工具压缩的文件;
2、.bz2:表示由bzip2压缩工具压缩的文件;
3、.tar:表示由tar打包程序打包的文件(tar并没有压缩功能,只是把一个目录合并成一个文件)
4、.tar.gz:可以理解为先由tar打包,在由gzip压缩
5、.tar.bz2:可以理解为先由tar打包,在由bzip2压缩
6、.tar.xz:可以理解为先由tar打包,然后由xz压缩

1、压缩文件(gzip):gzip -[1-9] [压缩文件](gzip只能压缩文件,不能压缩目录,1-9为压缩等级,9为最高,1为最低,正常我们使用6就可以)

解压:gzip -d [压缩后的文件]

[root@instance-3uldysh5 opt]# gzip -6 index.js
[root@instance-3uldysh5 opt]# ls
avalokita  bcm-agent  HellpWorld  hosteye  index.js.gz  python_code  
[root@instance-3uldysh5 opt]# gzip -d index.js.gz
[root@instance-3uldysh5 opt]# ls
avalokita  bcm-agent  HellpWorld  hosteye  index.js  python_code  test  tests

2、压缩文件(bzip2):bzip2 -z [文件名称] (bzip2不能压缩目录)

解压:bzip2 -d [压缩后的文件]

[root@instance-3uldysh5 opt]# bzip2 -z index.js
[root@instance-3uldysh5 opt]# ls
avalokita  bcm-agent  HellpWorld  hosteye  index.js.bz2  python_code  test  tests
[root@instance-3uldysh5 opt]# bzip2 -d index.js.bz2
[root@instance-3uldysh5 opt]# ls
avalokita  bcm-agent  HellpWorld  hosteye  index.js  python_code  test  tests

3、压缩文件(xz):xz -z [文件名称](xz只能压缩文件)

解压:xz -d [压缩后的文件名称]

[root@instance-3uldysh5 opt]# xz -z index.js
[root@instance-3uldysh5 opt]# ls
avalokita  bcm-agent  HellpWorld  hosteye  index.js.xz  python_code  test  tests
[root@instance-3uldysh5 opt]# xz -d index.js.xz
[root@instance-3uldysh5 opt]# ls
avalokita  bcm-agent  HellpWorld  hosteye  index.js  python_code  test  tests

4、压缩目录(zip):zip -r [手动输入压缩后的名称(自己定)] [压缩的目录](前后不覆盖之前的目录,压缩只是压缩目录,目录里面的子目录或文件不压缩,全部压缩需要加-r)

解压:unzip [压缩后的名称]

[root@instance-3uldysh5 opt]# zip -r fujiaxing.zip fujiaxing/
  adding: fujiaxing/ (stored 0%)
[root@instance-3uldysh5 opt]# ls
avalokita  bcm-agent  fujiaxing  fujiaxing.zip  HellpWorld  hosteye  index.js  python_code  test  tests
[root@instance-3uldysh5 opt]# unzip fujiaxing.zip
Archive:  fujiaxing.zip
[root@instance-3uldysh5 opt]# ls
avalokita  bcm-agent  fujiaxing  fujiaxing.zip  HellpWorld  hosteye  index.js  python_code  test  tests

5、先将目录打包合并为一个文件:tar -czvf [打包后的名称(自己定)] [需要打包的目录]

之后进行压缩:gzip -6 [打包后的名称]

最后进行解压:tar -xzvf [压缩后的名称](先进行解压,然后进行解包)

[root@instance-3uldysh5 opt]# tar -czvf sss.tar fujiaxing/
fujiaxing/
fujiaxing/jiaxing/
fujiaxing/jiaxing/fu.txt
[root@instance-3uldysh5 opt]# ls
avalokita  bcm-agent  fujiaxing  HellpWorld  hosteye  index.js  python_code  sss.tar  test  tests
[root@instance-3uldysh5 opt]# gzip -6 sss.tar
[root@instance-3uldysh5 opt]# ls
avalokita  bcm-agent  fujiaxing  HellpWorld  hosteye  index.js  python_code  sss.tar.gz  test  tests
[root@instance-3uldysh5 opt]# gzip -d sss.tar.gz
[root@instance-3uldysh5 opt]# ls
avalokita  bcm-agent  fujiaxing  HellpWorld  hosteye  index.js  python_code  sss.tar  test  tests
[root@instance-3uldysh5 opt]# tar -xzvf sss.tar
fujiaxing/
fujiaxing/jiaxing/
fujiaxing/jiaxing/fu.txt
[root@instance-3uldysh5 opt]# ls
avalokita  bcm-agent  fujiaxing  HellpWorld  hosteye  index.js  python_code  sss.tar  test  tests

五、安装RPM包或源码包

1、wget:从互联网链接中下载RPM包;

下载vscode:wget -O vscode.rpm https://az764295.vo.msecnd.net/stable/3c4e3df9e89829dce27b7b5c24508306b151f30d/code-1.55.2-1618307357.el8.x86_64.rpm(该链接需要在浏览器中下载内容中复制链接地址;-O vscode.rpm 意思为将新下载的rpm包更名为vscode.rpm)

image.png

2、安装RPM包:rpm -ivh vdcode.rpm

注意:当出现下方错误时候,需要安装依赖环境;

warning: vscode.rpm: Header V4 RSA/SHA256 Signature, key ID be1229cf: NOKEY
error: Failed dependencies:
        libXcomposite.so.1()(64bit) is needed by code-1.55.2-1618307357.el8.x86_64
        libXcursor.so.1()(64bit) is needed by code-1.55.2-1618307357.el8.x86_64
        libXdamage.so.1()(64bit) is needed by code-1.55.2-1618307357.el8.x86_64
        libXfixes.so.3()(64bit) is needed by code-1.55.2-1618307357.el8.x86_64
        libXi.so.6()(64bit) is needed by code-1.55.2-1618307357.el8.x86_64
        libXrandr.so.2()(64bit) is needed by code-1.55.2-1618307357.el8.x86_64
        libXss.so.1()(64bit) is needed by code-1.55.2-1618307357.el8.x86_64
        libXtst.so.6()(64bit) is needed by code-1.55.2-1618307357.el8.x86_64
        libasound.so.2()(64bit) is needed by code-1.55.2-1618307357.el8.x86_64
        libatk-1.0.so.0()(64bit) is needed by code-1.55.2-1618307357.el8.x86_64
        libgbm.so.1()(64bit) is needed by code-1.55.2-1618307357.el8.x86_64
        libgdk-x11-2.0.so.0()(64bit) is needed by code-1.55.2-1618307357.el8.x86_64
        libgtk-3.so.0()(64bit) is needed by code-1.55.2-1618307357.el8.x86_64
        libpango-1.0.so.0()(64bit) is needed by code-1.55.2-1618307357.el8.x86_64
        libpangocairo-1.0.so.0()(64bit) is needed by code-1.55.2-1618307357.el8.x86_64
        libxkbfile.so.1()(64bit) is needed by code-1.55.2-1618307357.el8.x86_64
解决方法:1、安装依赖环境yum install libXScrnSaver*
解决方法:2、加入参数,安装时不再分析依赖环境而直接安装rpm -ivh vscode.rpm --nodeps --force

检查vscode是否被安装:rpm -qa | grep nodejs

卸载vscode:rpm -e nodejs

3、安装系统下所有包:yum list

查看系统下是否存在node包:yum search node

安装node包:yum install nodejs

卸载node包:yum remove nodejs

4、举例列出常用的rpm命令:

# 安装
 rpm -ivh your-package      # 直接安装
 rpm --force -ivh your-package.rpm  # 忽略报错,强制安装
 rpm -ivh --noscripts your-package  # 在安装过程不执行脚本
 rpm -ivh --replacepkgs your-package.rpm # 覆盖、替换安装
 
 >在安装过程可能出现依赖错误,如A包依赖于B包,那么在A包安装之前,需要先安装好B包
 
 # 查询
 rpm -q tree        # 查询指定的包是否安装
 rpm -qa            # 列出所有安装过的包
 rpm -qf  /bin/ls   # 查询指定文件来自于那个安装包
 rpm -qif /bin/ls   # 返回软件包的有关信息
 rpm -qlf /bin/ls   # 返回软件包的文件列表
 rpm -qi tree       # 查询包元数据
 rpm -ql tree       # 获取rpm包中的文件安装的位置
 rpm -qd tree       # 查询包相关文档
 rpm -qc bash       # 查询包配置文件
 rpm -q --scripts bash   # 查询安装、卸载前后执行的脚本
 rpm -q --changelog tree # 查询包更新信息
 rpm -qpR file.rpm     # 查看包依赖关系
 
 # 卸载
 rpm -e tree                # 卸载
 rpm -e --noscripts tree    # 不执行脚本卸载
 
 # 升级
 rpm -Uvh your-package  # 升级
 rpm -Fvh your-package  # 升级
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容