zoukankan      html  css  js  c++  java
  • 2小时学会Linux基础

    2小时学会Linux基础

    Linux简介

    1.   Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIXUNIX的多用户、多任务、支持多线程和多CPU的操作系统。Linux能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统

    2. Linux的发行版说简单点就是将Linux内核与应用软件做一个打包

    知名的发行版有:Ubuntu、RedHat、CentOS、Debain、Fedora、SuSE、OpenSUSE、TurboLinux、BluePoint、RedFlag、Xterm、SlackWare等。

    3.   地位:服务器领域,通常服务器使用LAMP(Linux + Apache + MySQL+ PHP)或LNMP(Linux + Nginx+ MySQL + PHP)组合。

    Linux 系统启动过程

    4.   Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段:

    内核的引导

    首先读入 /boot 目录下的内核文件。

    运行init

    Linux系统有7个运行级别(runlevel):

    运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动

    运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆

    运行级别2:多用户状态(没有NFS)

    运行级别3:完全的多用户状态(NFS),登陆后进入控制台命令行模式

    运行级别4:系统未使用,保留

    运行级别5:X11控制台,登陆后进入图形GUI模式

    运行级别6:系统正常关闭重启,默认运行级别不能设为6,否则不能正常启动

    系统初始化。

    在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行了/etc/rc.d/rc.sysinit,rc.sysinit是每一个运行级别都要首先运行的重要bash shel脚本。

    ,/etc/rc.d/rc5.d/目录中的这些启动脚本实际上都是一些连接文件,而不是真正的rc启动脚本,真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下

    建立终端

    rc执行完毕后,返回init。init接下来会打开6个终端,以便用户登录系统。都将以respawn方式运行mingetty程序,mingetty程序能打开终端、设置模式。

    用户登录系统

    用户的登录方式有三种:

    1)命令行登录

    2ssh登录

    3)图形界面登录

    文本方式登录的情况:当看到mingetty的登录界面时,输入用户名和密码来登录系统。login会接收mingetty传来的用户名作为用户名参数对用户名进行分析:如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。这通常用来系统维护时防止非root用户登录。

    只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。

    /etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。

    如果没有指定主目录,将默认为根目录;如果没有指定shell,将默认为/bin/bash。

    5.   关机流程为:sysnc > shutdown > reboot > halt

    关机指令为:shutdown ,你可以manshutdown 来看一下帮助文档

    不管是重启系统还是关闭系统,首先要运行sync命令,sync 将数据由内存同步到硬盘中。

    reboot 就是重启,等同于 shutdown –r now

    halt 关闭系统,等同于shutdown –h now 和 poweroff

    关机的命令有 shutdown h now halt poweroff init 0 ,

    重启系统的命令有 shutdown r now reboot init 6.

    Linux 系统目录结构

    /bin:存放着最经常使用的命令

    /boot:存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。

    /dev :存放的是Linux的外部设备,在Linux中访问设备和访问文件的方式是相同的。

    /etc存放所有的系统管理所需要的配置文件和子目录。

    /lib:存放着系统最基本的动态连接共享库几乎所有的应用程序都需要用到这些共享库。

    /lost+found:空的,当系统非法关机后,这里就存放了一些文件。

    /media linux:把识别的设备挂载到这个目录下。

    /mnt:让用户临时挂载别的文件系统的.

    /opt:额外安装软件所摆放的目录。

    /proc:虚拟的目录,它是系统内存的映射,通过直接访问这个目录来获取系统信息。

    目录的内容不在硬盘上而是在内存里,直接修改里面的某些文件,比如屏蔽主机的ping命令,使别人无法ping你的机器:

    echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all

    /root:系统管理员,也称作超级权限者的用户主目录。

    /sbin:存放的是系统管理员使用的系统管理程序。

    /selinux:Redhat/CentOS特有的目录,Selinux是一安全机制,类似windows的防火墙,

    /srv:存放一些服务启动之后需要提取的数据。

    /sys:该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。

    sysfs文件系统集成了下面3种文件系统的信息:

    (1)针对进程信息的proc文件系统、

    (2)针对设备的devfs文件系统

    (3)针对伪终端的devpts文件系统。

    当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统种被创建。

    /tmp:存放一些临时文件的。

    /usr:很多应用程序和文件都放在这个目录下,类似与windows下的program files目录。

    /usr/bin:系统用户使用的应用程序。

    /usr/sbin:超级用户使用的比较高级的管理程序和系统守护程序。

    /usr/src:内核源代码默认的放置目录。

    /var存放着在不断扩充着的东西,经常被修改的目录放在这个目录下。包括各种日志文件。具体在/var/log 目录下,

    /bin, /sbin,/usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在/bin/ls 目录下的。

    Linux 忘记密码解决方法

    6.   单用户模式更改一下root密码:

    重启linux系统--回车--移动到第二行,按"e"进入编辑模式输入 single--按"b"启动--更密码的命令为 passwd.

    7.   使用系统安装光盘的救援模式:

    光盘启动,按F5 进入rescue模式--输入linux rescue 回车--选择英语--选择us 键盘--no启动网络--选择Continue--系统已经挂载到了/mnt/sysimage中。回车,输入chroot /mnt/sysimage进入管理员环境。

    Linux 远程登录

    8.   通过ssh(Secure Shell)服务实现的远程登录功能,默认ssh服务端口号为 22

    SSH 为建立在应用层和传输层基础上的安全协议。

    Linux 远程登录客户端有SecureCRT, Putty, SSH Secure Shell等

    本文以Putty为例来登录远程服务器。

    Host Name( or IPaddress) 下面的框中输入你要登录的远程服务器IP(可以通过ifconfig命令查看服务器ip)----输入要登录的用户名----输入root 然后回车,再输入密码,就能登录到远程的linux系统了。

    9.   使用密钥认证机制远程登录linux

    使用工具 PUTTYGEN.EXE 生成密钥对---默认的格式即SSH-2(RSA),2048.---单击Generate 开始生成密钥对,鼠标要来回的动--接下来就该到远程linux主机上设置了。

    1)创建目录/root/.ssh 并设置权限

    [root@localhost~]# mkdir /root/.ssh mkdir命令用来创建目录,以后会详细介绍,暂时只了解即可。

    [root@localhost~]# chmod 700 /root/.sshchmod 命令是用来修改文件属性权限的,以后会详细介绍。

    2)创建文件 /root/.ssh/authorized_keys

    [root@localhost~]# vim/root/.ssh/authorized_keys vim 命令是编辑一个文本文件的命令,同样在后续章节详细介绍。

    3)写字板打开刚才生成的publickey 文件,复制从AAAA开头至 "---- END SSH2 PUBLIC KEY ----" 该行上的所有内容,粘贴到/root/.ssh/authorized_keys文件中,要保证所有字符在一行。(可以先把复制的内容拷贝至记事本,然后编辑成一行载粘贴到该文件中)。

    如何粘贴,用vim打开那个文件后,该文件不存在,所以vim会自动创建。按一下字母"i"然后同时按shift + Insert 进行粘贴(或者单击鼠标邮件即可),前提是已经复制到剪切板中了。粘贴好后,然后把光标移动到该行最前面输入ssh-ras ,然后按空格。再按ESC,然后输入冒号wq :wq 就保存了

    Linux 文件基本属性

    Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定

    10.ls l命令来显示一个文件的属性以及文件所属的用户和组

    bin文件的第一个属性用"d"表示。"d"在Linux中代表该文件是一个目录文件。

    [ d ]目录

    [ - ]文件;

    [ l ]链接文档(linkfile);

    [ b ]装置文件里面的可供储存的接口设备(可随机存取装置);

    [ c ]则装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。

    接下来字符中,三个一组,『rwx』组合。[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。


    11.更改文件属性

    chgrp:更改文件属组:

    语法:chgrp [-R] 属组名文件名, -R:递归更改文件属组

    chown:更改文件属主,也可以同时更改文件属组

    语法:chown [–R] 属主名 文件名

    chown [-R] 属主名:属组名 文件名

    例子:进入 /root 目录(~)将install.log的拥有者(和群组)改为bin这个账号:

    [root@www ~] cd ~

    [root@www ~]# chown bin (bin)install.log

    chmod:更改文件9个属性: 两种设置方法,一种是数字,一种是符号。

    (1)数字:

    r:4

    w:2

    x:1

    例如当权限为: [-rwxrwx---] 分数则是:[4+2+1][ 4+2+1][ 0+0+0]=770

    指令chmod的语法:

    chmod [-R] xyz 文件或目录

    (xyz :数字类型的权限属性,为 rwx 属性数值的相加。)

    (2)符号:

    将文件权限设置为 -rwxr-xr-- :

    chmod u=rwx,g=rx,o=r 文件名

    Linux 文件与目录管理

    Linux的目录结构为树状结构,最顶级的目录为根目录 /。其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们。

    绝对路径:

    由根目录 / 写起,例如:/usr/share/doc 这个目录。

    相对路径:

    不是由 / 写起,例如由/usr/share/doc 要到 /usr/share/man 底下时,可以写成:cd ../man

    12.处理目录的常用命令

    ls: 列出目录                -a全部的文件,连同隐藏档(开头为.的文件)

    -d仅列出目录本身

    -l长数据串列出,包含文件的属性与权限等

    cd:切换目录               cd ~到家目录,亦即是 /root 这个目录

                               cd..到目前的上一级目录

    pwd:显示目前的目录       -P显示确实路径,而非使用连结(link)路径

    mkdir:创建一个新的目录    语法:mkdir [-mp] 目录名称

    -m :直接配置文件的权限,不需默认权限 (umask)

    -p :直接将所需目录(含上一级目录)递回创建起来

    创建多层目录

    rmdir:删除一个空的目录    语法:rmdir [-p] 目录名称

    -p :连同上一级『空的』目录也一起删除

    rmdir 仅能删除空的目录, rm删除非空目录。

    cp: 复制文件或目录        

    [root@www ~]# cp[-adfilprsu] 来源档(source) 目标档(destination)

    [root@www ~]# cp[options] source1 source2 source3 .... directory

    -i :若目标档(destination)已存在,覆盖时询问动作的进行(常用)

    -p :连同文件的属性复制过去,而非使用默认属性(备份常用);

    -r :递回持续复制,用於目录的复制行为;(常用)

    例子:用root身份,将家目录下的 .bashrc 复制到 /tmp 下,并更名为 bashr

    [root@www ~]# cp~/.bashrc /tmp/bashrc

    [root@www ~]# cp-i ~/.bashrc /tmp/bashrc  //检查存在询问覆盖

    cp: overwrite`/tmp/bashrc'? n  <==n不覆盖,y为覆盖

    rm: 移除文件或目录         rm [-fir] 文件或目录

    -f :force忽略不存在文件,不出现警告

    -i interact互动模式,删除前询问

    -r :recursive递回删除,最常用在目录删除!非常危险的选项mv 移动文件与目录,或修改名称

    [root@www ~]#mv [-fiu] source destination

    [root@www ~]#mv [options] source1 source2 source3 .... directory

    例子:1.复制一文件,创建一目录,将文件移动到目录中

    [root@www ~]#cd /tmp

    [root@www tmp]#cp ~/.bashrc bashrc

    [root@www tmp]#mkdir mvtest

    [root@www tmp]#mv bashrc mvtest

    2.将目录名称更名为 mvtest2

    [root@www tmp]#mv mvtest mvtest2

    总结:ls: 列出目录

    cd:切换目录

    pwd:显示目前的目录

    mkdir:创建一个新的目录

    rmdir:删除一个空的目录

    cp: 复制文件或目录

    rm: 移除文件或目录

    man [命令] 来查看各个命令的使用文档,如:man cp。

    13.Linux 文件内容查看

    cat  由第一行开始显示文件内容

    tac  从最后一行开始显示,可以看出tac cat 的倒著写!

    nl   显示的时候,顺道输出行号!

    tail 只看尾巴几行        tail [-n number] 文件

    head 只看头几行         head [-n number] 文件

    -n :后面接数字,代表显示几行的意思

    more一页一页的显示文件内容

    在 more 这个程序的运行过程中,你有几个按键可以按的:

    空白键 (space):代表向下翻一页;

    Enter         :代表向下翻『一行』;

    /字串         :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;

    :f            :立刻显示出档名以及目前显示的行数;

    q             :代表立刻离开 more ,不再显示该文件内容。

    b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。

    less

    less more 类似,但是比 more 更好的是,他可以往前翻页

    less运行时可以输入的命令有:

    空白键    :向下翻动一页;

    [pagedown]:向下翻动一页;

    [pageup]  :向上翻动一页;

    /字串     :向下搜寻『字串』的功能;

    ?字串     :向上搜寻『字串』的功能;

    n         :重复前一个搜寻 (与 / 或 ? 有关!)

    N         :反向的重复前一个搜寻 (与 / 或 ? 有关!)

    q         :离开 less 这个程序;

    Linux 用户和用户组管理

    14.添加新的用户账号使用useradd命令,语法:useradd 选项用户名 

    选项:

    -c comment 指定一段注释性描述。

    -d 目录 指定用户主目录,如此目录不存在,则同时使用-m选项,可创建主目录。

    -g 用户组 指定用户所属的用户组。

    -G 用户组,用户组 指定用户所属的附加组。

    -s Shell文件 指定用户的登录Shell。

    -u 用户号 指定用户的用户号,如同时有-o选项,可以重复使用其他用户标识号。

    增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow, /etc/group等。

    15.删除一个已有的用户账号使用userdel命令,格式:userdel 选项用户名

    -r,它的作用是把用户的主目录一起删除。

    16.修改已有用户的信息使用usermod命令,格式:usermod 选项用户名

    :用户sam的登录Shell修改为ksh,主目录改为/home/z,用户组改为developer

    # usermod -s /bin/ksh -d /home/z –gdeveloper sam

    17.指定和修改用户口令的Shell命令是passwd 格式:passwd 选项用户名

    超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。命令的格式为:

    选项:

    -l 锁定口令,即禁用账号。

    -u 口令解锁。

    -d 使账号无口令。

    -f 强迫用户下次登录时修改口令。

    18.Linux系统用户组的管理:用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是/etc/group文件的更新

    19.增加一个新的用户组使用groupadd命令。格式:groupadd 选项 用户组

    选项:

    -g GID 指定新用户组的组标识号(getdid)。

    -o 一般与-g同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。

    20.删除一个已有的用户组使用groupdel命令。格式:groupdel 用户组

    21.    修改用户组的属性使用groupmod命令。语法:groupmod 选项 用户组

    -n新用户组 将用户组的名字改为新名字

    如:将组group2的标识号改为10000,组名修改为group3

    # groupmod –g 10000 -n group3group2

    22.newgrp切换到其他用户组,这个命令的参数就是目的用户组。例如:$ newgrp root

    23.完成用户管理的工作有许多种方法,但是每一种方法实际上都是对有关的系统文件进行修改。用户和用户组相关的信息都存放在一些系统文件中,这些文件包括/etc/passwd, /etc/shadow, /etc/group等。

    24./etc/passwd记录用户的一些基本属性

    sam:x:200:50:Sam san:/usr/sam:/bin/sh

    /etc/passwd中一行记录对应着一个用户,每行被冒号(:)分隔为7个字段,其格式和具体含义如下:

    用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

    用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。Shell是用户与Linux系统之间的接口。如不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh

    系统中有一类用户称为伪用户(psuedo users)。

    这些用户在/etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,

    伪用户含义:

    bin 拥有可执行的用户命令文件

    sys 拥有系统文件

    adm 拥有帐户文件

    uucp UUCP使用

    lp lp或lpd子系统使用

    nobody NFS使用

    25.对安全性要求较高的Linux系统都把加密后的口令字分离出来,单独存放在一个文件中,这个文件是/etc/shadow文件。有超级用户才拥有该文件读权限,这就保证了用户密码的安全性。

    /etc/shadow中的记录行与/etc/passwd中的一一对应,它由pwconv命令根据/etc/passwd中的数据自动产生

    26.用户组的所有信息都存放在/etc/group文件中,

    当一个用户同时是多个组中的成员时,在/etc/passwd文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组。

    用户要访问属于附加组的文件时,必须首先使用newgrp命令使自己成为所要访问的组中的成员。

    27.添加量用户批:

    (1)先编辑一个文本用户文件。每一列按照/etc/passwd密码文件的格式书写,

    (2)以root身份执行命令 /usr/sbin/newusers,从刚创建的用户文件user.txt中导入数据,创建用户:# newusers <user.txt

    然后可以执行命令 vipw vi /etc/passwd 检查/etc/passwd文件是否已经出现这些用户的数据,并且用户的宿主目录是否已经创建。

    (3)执行命令/usr/sbin/pwunconv。

    将 /etc/shadow产生的 shadow 密码解码,然后回写到 /etc/passwd 中,并将/etc/shadow的shadow密码栏删掉。这是为了方便下一步的密码转换工作,即先取消 shadow password 功能。

    #pwunconv

    (4)编辑每个用户的密码对照文件。

    范例文件 passwd.txt 内容如下:

    user001:密码

    user002:密码

    (5)以root身份执行命令/usr/sbin/chpasswd。

    创建用户密码,chpasswd 会将经过/usr/bin/passwd 命令编码过的密码写入 /etc/passwd 的密码栏。

    #chpasswd < passwd.txt

    (6)确定密码经编码写入/etc/passwd的密码栏后。

    执行命令 /usr/sbin/pwconv将密码编码为 shadow password,并将结果写入 /etc/shadow。

    # pwconv

    这样就完成了大量用户的创建了,到/home下检查这些用户宿主目录的权限设置是否都正确,并登录验证用户密码是否正确。

    Linux 磁盘管理

    28.Linux磁盘管理常用三个命令为dfdufdisk

    df:列出文件系统的整体磁盘使用量

    du:检查磁盘空间使用量

    fdisk:用于磁盘分区

    仅有 fdisk -l 时,则系统将会把整个系统内能够搜寻到的装置的分区均列出来。

    -a :列出所有的文件系统,包括系统特有的/proc 等文件系统;

    -k :以 KBytes 的容量显示各文件系统;

    -m :以 MBytes 的容量显示各文件系统;

    -h :以人们较易阅读的 GBytes,MBytes, KBytes 等格式自行显示;

    -H :以 M=1000K 取代 M=1024K 的进位方式;

    -T :显示文件系统类型, 连同该 partition的 filesystem 名称 (例如 ext3) 也列出;

    -i :不用硬盘容量,而以 inode 的数量来显示

    通配符 * 来代表每个目录。

    磁盘格式化:mkfsmake filesystem磁盘分割完毕后进行文件系统的格式化,

    格式:mkfs [-t 文件系统格式] 装置文件名

    -t :可以接文件系统格式,例如 ext3, ext2, vfat 等(系统有支持才会生效)

    如:将分区 /dev/hdc6格式化为 ext3 文件系统:

    [root@www ~]# mkfs -t ext3 /dev/hdc6

    磁盘检验fsckfile system check用来检查和维护不一致的文件系统。若系统掉电或磁盘发生问题,可利用fsck命令对文件系统进行检查。

    语法:fsck [-t 文件系统] [-ACay]装置名称

    磁盘挂载与卸除Linux 的磁盘挂载使用 mount 命令,卸载使用 umount 命令。

    如:用默认的方式,将刚创建的 /dev/hdc6 挂载到 /mnt/hdc6 上面

    [root@www ~]# mkdir /mnt/hdc6

    [root@www ~]# mount /dev/hdc6 /mnt/hdc6

    卸载/dev/hdc6

    [root@www ~]# umount /dev/hdc6

    Linux vi/vim

    29.vi/vim 共分为三种模式,分别是一般模式、编辑模式与指令列命令模式。

    (1)以vi 打开一个档案就直接进入一般模式了。可以进行删除、复制、贴上等等的动作,但无法编辑文件内容的!

    (2)按下『i, I, o, O, a, A, r, R』等任一个字母,左下方会出现『INSERT 或 REPLACE 』的字样,进入编辑模式。『Esc』这个按键即可退出编辑模式。

    (3)在一般模式当中,输入『 : / ? 』三个中的任何一个按钮,就可以将光标移动到最底下那一行。在这个模式当中,可以提供你『搜寻资料』的动作,而读取、存盘、大量取代字符、离开 vi 、显示行号等等的动作则是在此模式中达成的!


    vim 键盘图:


    如: vi 来建立一个名为 test.txt 的文件时

    [root@www ~]# vi test.txt

    在一般模式之中,只要按下 i, o, a 等字符就可以进入编辑模式了!

    按下 [ESC] 按钮回到一般模式

    在一般模式中按下 :wq 储存后离开 vi

     

    linux yum 命令

    30.基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。

    yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记

    yum常用命令

    1.列出所有可更新的软件清单命令:yum check-update

    2.更新所有软件命令:yumupdate

    3.仅安装指定的软件命令:yuminstall <package_name>

    4.仅更新指定的软件命令:yumupdate <package_name>

    5.列出所有可安裝的软件清单命令:yum list

    6.删除软件包命令:yumremove <package_name>

    7.查找软件包 命令:yum search<keyword>

    8.清除缓存命令:

    yum cleanpackages: 清除缓存目录下的软件包

    yum cleanheaders: 清除缓存目录下的 headers

    yum cleanoldheaders: 清除缓存目录下旧的 headers

    yum clean, yumclean all (= yum clean packages; yum clean oldheaders) :清除缓存目录下的软件包及旧的headers

  • 相关阅读:
    MVC之Control和View之间传递数据
    与 BUG 跟踪系统/问题跟踪集成
    与 BUG 跟踪系统/问题跟踪集成
    版本库浏览器
    c#创建快捷方式代码
    项目中用到的数字证书的创建,签名实现
    vs2005 "automation服务器不能创建对象"解决方法.
    项目中用到的数字证书的创建,签名实现
    创建一个输入标识符 也就是一个输入的光标
    利用设备描述符画图
  • 原文地址:https://www.cnblogs.com/owenzh/p/13784497.html
Copyright © 2011-2022 走看看