热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux操作系统(二):初步了解Linux操作系统与基本操作

Linux操作系统简介Linux的命令模式与命令的执行 一、Linux操作系统简介1.1Linux是什么?操作系统应用程序?操作系统是实现计算机硬件资源有效控制及硬件资源分配的程序


  • Linux操作系统简介

  • Linux的命令模式与命令的执行


 一、Linux操作系统简介

1.1Linux是什么?操作系统/应用程序

操作系统是实现计算机硬件资源有效控制及硬件资源分配的程序,提供计算机运行所需要的基本功能(如网络功能)。除此之外还提供开发软件的环境,所以操作系统也会提供一整组系统调用接口供开发应用程序使用。而Linux就是一个操作系统,它包含系统内核与系统调用接口两层,Linux属于计算机程序但不是应用程序。

1.2操作系统与硬件及应用程序的关系

1.3操作系统与硬件之间的关系简析

由1.2中的示图可以看到操作系统的内核与硬件是紧密相连的,硬件由操作系统的内核控制,每种操作系统都自己的内核,操作系统的内核基本上都是为特定的硬件而设计的。比如Linux最开始的时候就是针对386的计算机开发的,也就是说最初的Linux仅能驱动368的硬件。

由于不同的硬件它的功能函数不相同,所以所以操作系统不能在不同的硬件平台上运行,例如IBM的Power CPU与Intel的x86架构就不一样。

所以在2006年之前的苹果电脑使用的是IBM的PowerPC CPU硬件架构,所以当时的苹果电脑的操作系统Mac OS不能运行在windows系统所运行的X86硬件平台上,windows系统也不能安装到苹果电脑上。不过2006年之后苹果电脑使用的硬件是Intel的X86架构平台,所以这类苹果电脑能安装windows系统。

由于Linux是开源的操作系统,所以它的代码可以被修改成适合在各种硬件架构上运行,也可以说Linux具有可移植性。

1.4Linux的发展历史

1961年由Fernando J. Corbató(费尔南多·何塞·科尔巴托)教授领导的团队,在麻省理工学院计算机中心研发的CTSS(兼容分时系统)于11月首次演示,后来成熟的CTSS经过修改在IBM7094上运行。可以到这个网站Multics了解CTSS相关的更多内容。

1969年Ken Thompson(肯·汤普森)针对一台DEC公司推出的PDP-7主机,使用汇编语言写了一组内核程序,同时还包括一些内核工具程序,以及一个小小的文件系统,这个系统就是Unix原型——Unics。这个系统有两个重要概念,分别是:

所有的程序或系统设备都是文件;
不管程序本身还是附属文件,所写的程序只有一个目标,且要有效的完成目标。

1973年DennisRitchie(丹尼斯·里奇)开发出C语言,并用C语言写出了一个正式的Unix内核。

1974年Ken Thompson(肯·汤普森)与DennisRitchie(丹尼斯·里奇)合作使用C语言重新改写并编译了Unics的内核,最后命名发布了Unix的正式版。

1977年重要的Unix分支——BSD诞生:由于Unix是以高级的C语言写成的,相对于汇编语言需要与硬件有密切的配合,C语言与硬件相关性没有那么大,这使得Unix很容易被移植。1973年隶属于美国电信巨头AT&T的贝尔实验室取得Unix源码后,针对大型主机的特性开始加以定制源代码,这使得Unix移植到另一台不同的主机成为可能。1973年以后便与学术界合作开发,最重要的就是加州伯克利大学的合作。伯克利大学的Bill Joy(比尔·乔伊)取得Unix的内核代码后,修改成适合自己的机器版本,并且增加了很多工具软件与编译器,最终命名为Berkeley Software Distribution(BSD)。

Bill Joy(比尔·乔伊)也是Unix行业Sum microsystem(太阳微系统)的创始人,Sum microsystem(太阳微系统)公司就是以BSD开发内核进行自己的商业Unix版本开发,后来可以安装到x86硬件架构上的FreeBSD就是BSD改版的。

1979年AT&T推出System V第七版Unix后,System V这个版本可以运行在X86个人计算机上,改变了Unix之前只能在服务器和大型工作站上运行的情况。因为商业考虑AT&T发行第七版Unix时特别提到“不可针对学生提供源代码”的限制,从此开始引起Unix行业的版权顾虑,引发很多版权纠纷。

1979年Andrew S.Tanenbaum(安德鲁·斯图尔特·塔能鲍姆)教授因为版权限制,为没有内核源代码提供给学生教学,教授为了避免版权纠纷,在完全不参考Unix内核代码的情况下,手写了Minix的Unix-like的内核程序,并且对Unix兼容。1984年开始编写代码,到1986年完成,并于次年出版Minix相关书籍,同时与新闻组(BBS及News)相结合。Minix版本并不是完全免费,无法在网络上提供下载,必须要通过磁盘/磁带购买。虽然很便宜,但由于没有网络上的流传,所以传播速度并不快,但购买磁盘时会附上Minix的源代码,这意味着用户可以学习Minix的内核程序。

1984年Richard Mathew Stallman(理查特·马修·斯托曼)发起GNU计划,GNU计划与FSF基金会成立。1983年斯托曼因为自己使用lisp操作系统是麻省理工学院的专利软件,无法共享。后来他接触到Unix,发现Unix可以在不同的机器间移植,虽然Unix依旧是专利然间,但基于的硬件架构还是比较开放,于是他开始将他基于Lisp编写的软件移植到Unix并将源代码公布出来。1984年开始发起GNU计划,这个计划的目的是:建立一个自由、开放的Unix操作系统。但建立一个操作系统太复杂,GNU计划仅仅他一个斯托曼,于是反其道而行之,他将Unix上运行的应用软件,在不参考源代码的情况下(避免吃官司)开发出同样功能的应用软件,并开放出来供别人免费试用。由于免费且功能差不多,很多人多直到并开始使用GNU软件,GNU官方网站。

GPL版权声明:斯托曼为了避免自己开源的软件被别人拿去做成专利软件,将GNU与FSF开发出来的软件,都是用GPL的版权声明,GPL强调的重点并不是“免费”,而是指“自由度”的软件,斯托曼进一步强调了自由的意义:用户可以自由的执行、复制、在发行、学习、修改与强化自由软件。一个软件使用GPL版权声明之后,他自然成了自由软件,这个软件具有的特色:

1.取得软件与源代码:你可以根据自己的需求来使用这个自右软件;
2.复制:你可以自由地复制该软件;
3.修改:你可以将修改过的程序,再度自由发行,而不会与原先的编写者冲突;
4.回馈:你应该将你修改过的程序回馈于社区;
5.修改授权:你不能将一个GPL授权的自由软件,在你修改后而将它取消GPL授权;
6.单纯销售:你不能单纯的销售自由软件;

GPL里的单纯销售并不是不能销售,而是除了销售软件本身应同时搭配售后服务与相关手册,这些就要工本费了。自由软件赖以生存的是“服务”,如果你购买了自由软件它会同时提供手册说明、一定时长的咨询和售后服务、软件升级与其他辅助工作等附加服务。

1988年Linus Torvalds(林纳斯·托瓦兹)在赫尔辛基大学基于Andrew S.Tanenbaum(安德鲁·斯图尔特·塔能鲍姆)教授的Minix操作系统公布的源码学习内核设计概念,但并基于Minix在Intel的368机器上开发应用,虽然他也认为Minix很棒,但由于他希望能实现多任务环境(即CPU具备执行多任务的特性),而Tanenbaum教授始终不愿意进行功能加强。于是他开始自己编写内核程序,并将源代码放到了GNU上供大家下载和修改,由于托瓦兹在FTP网站上的管理员放置的目录起名为Linux,从此大家就称这个内核为Linux。

由于Unix上的软件无法在Linux上运行,这时候托瓦兹有两种方法,一种是修改软件,让软件可以在Linux上运行;另一种则是修改Linux,让Linux符合软件能够运行的规范。由于Linux希望能兼容Unix,与是托瓦兹选择了第二种做法“修改Linux”。为了让所有软件都可以在Linux上运行,于是托瓦兹开始参考POSIX规范。POSIX是针对Unix与一些软件运行时的标准规范,只要依据这些规范来设计内核与软件,理论上就可以搭配在一起执行。因为兼容Unix,所以Linux也可以被称为Unix-like。

早期的Linux跟386硬件相关性很强,不具备移植性,后来因为开源社区的其他成员参与,在1994年Linux便被移植到很多硬件上。IBM、HP等公司的硬件都被Linux系统所支持,2019年的5.3版本开始支持X86的硬件。

1.5Linux的版本

3.10.0-123.e17.x86-64
主版本.次版本.发布版本-修改版本

在3.0版本之前采用奇偶数版本分类,每个版本好的第二位即(次版本)为奇数时表示开发测试版,这个版本主要时内核开发工程师使用,用来新增内核代码,当这个版本被众多工程师测试没有问题之后加入下一个稳定版本内核中;每个版本号的次版本为偶数则表示为稳定版。例如2.5.xxx表示开发测试版,2.6.xxx表示稳定版。

在3.0版本之后则采用主线版和长期维护版,内核主要依据主线版本开发,例如3.10在3.9的架构下继续开发的新主线版本。旧的版本在新的主线版本出现之后,有两种处理机制,一种是结束开发,即程序代码已结束,不会有继续维护的状态;另一种机制为保持该版本的持续维护,亦长期维护版本。例如3.10即为长期维护版本,这个版本的程序代码会被持续维护更长时间,若程序代码有Bug或其他问题,内核维护者会持续进行程序代码的更新维护。

可以通过下面这个命令来查看当前系统的内核版本,然后再在Linux内核档案查看对应的值。

 uname -r

1.6Linux发行版

由于GNU的GPL授权并非不能从事商业行为,于是就有很多商业公司专门来销售Linux发行版,由于Linux的GPL版本声明,因此,商业公司所销售的Linux发行版通常都可以从互联网上面下载。由于发展Liniux发行版的社区与公司是在太多,例如有名的Red Hat、SUSE、Ubuntu、Fedora、Debian等,为了解决各个发行版之间可能存在的差异性问题,Linux发行版使用的内核都由Linux内核档案发布,这些发行版很多基础应用软件都是相同得,比如网页服务器Apache、电子邮件服务器Postfix/sendmail、文件服务器Samba等。

为了使Linux的发行版差异不至于太大,且让开发商开发时有所依据,还有Linux Standard Base(LSB)等标准来规范开发者,以及目录结构的File system Hierarchy Standard(FHS)标准规范。唯一的差别,可能就是该厂商开发出来的管理工具,以及套件管理的模式。基本上每个Linux发行版除了架构的严谨度与选择的套件内容外,其实差异并不太大。

文件系统层次标准(FHS)

Linux标准规范(LSB)

如果要说发行版的区别的话,Linux发行版可以根据软件管理系统分为两大类:RPM、DPKG,软件管理工具通常也被称为包管理工具。

RPM由Red Hat公司制定实施,后被GNU开源操作系统接受并成为很多Linux系统RHEL的既定软件标准。

DPKG由Debian操作系统(UBUNTU)的DEB软件包管理工具。

关于Linux的包管理工具可以参考这篇博客:Linux包管理工具(rpm/dpkg,yum/apt,alien)

Linux应用汉化文档项目:B2D

Linux发行版下载与使用信息:https://distrowatch.com


 二、Linux的命令模式与命令的执行

2.1命令语法(模式)

 [ root@localhost ~ ] # command [ -options ] parameter1 parameter2 ...

命令语法解析:

[ root@localhost ~]:

root(当前用户名:超级管理员);@(表示连接服务的符号);localhost(主机名:本地主机);~(所在路径:~表示在当前的用户私有路径下),这里需要重点解释一下所在路径,当使用【Alt + Ctrl + F2】切换终端使用用户“aaa”登入时,这一段内容就是 [ aaa@localhost ~] ,但这时候的“~”所表示的路径与 [ root@localhost ~] 所表示的路径并不是一样的,可以使用【pwd】命令来查看当前所在的路径地址:

 [root@localhost ~] # pwd

 /root

--Alt + Ctrl + F2:aaa用户登入--

 [aaa@localhost ~] $ pwd

 /home/aaa

用户在自己的私有路径下有完全权限,关于权限问题的详细内容在下一节介绍。

$与#的区别:$表示当前用户是普通用户,#表示当前用户是管理员。

command:当前命名的名称,必须字段。

-options:表示命名的选项(我喜欢用面向对象的编程思维把“选项”理解为属性或方法),前面模板中用[]来包裹“选项”表示它是可选的,[]并不实际存在命令中。用来表示命令中这个字段为“选项”的是选项前面的"-","-"只是其简写方式,它的完全模式是"--"。

parameter1/parameter2:表示命令的参数,参数也是可选的,并不是命令的必须字段。

命令、选项、参数等这些字段之间使用空格来实现间隔和区分,不论多少个空格都会被视为一个空格。

回车键:表示立即执行当前的命令,如果命令太长需要换行可以使用(\)来转义回车键,使得命令连续到下一行,注意(\)后面要立即使用回车键,而不能有空格。

注意:命令中的字段是需要区分大小的,它们是有区别的。

2.2控制台编码问题及如何解决乱码

当输出的文本字符不支持当前系统默认的字符编码时,就会出现乱码问题,要想解决这类问题首先需要了解输入的内容支持哪些编码,然后再将你的系统设置为对应的编码集即可。

查看当前系统支持的字符编码:

 locale            //执行这个命令打印出下面的内容,查看具体的字符集设置

 LANG=en_US.utf8      //输出文本内容的字符集

 LC_CTYPE="en_US.utf8" 

 .....              //具体输出文本内容的字符集

 LC_ALL=           //用于设置数据同步更新的文本内容的字符集

如果出现编码问题,可以通过LANG设置全部输出文本内容的字符集,也可以通过设置具体的输出文本内容字符集来解决。

 LANG=zh_CN.utf8      //设置完以后可以通过locale命令来查看输出字符集的变化,还可以通过date命令打印日期和时间来看看输出文本的差别

关于locale命令相关的内容可以查看这个文档:https://www.linuxcool.com/locale

2.3基础命令操作

日期与时间命令

date
//Mon May 9 18:45:22 PDT 2022
date +%Y/%m/%d
//2022/05/09
date +%H:%M
//18:48
cal
//打印当前系统时间当月的日历
cal 2022
//打印2022年全年的日历
cal [month] [year]
cal 5 2022
//打印指定日期2022年5月的日历

在控制台做数学计算操作的命令bc

[root@localhost ~]# bc
//启动命令后会打印这一段信息,这是bc这个程序的一些版权信息
//bc 1.06.95
//Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software //Foundation, Inc.
//This is free software with ABSOLUTELY NO WARRANTY.
//For details type `warranty'.
//然后光标就会停留在这里等待输出
//计算器的符号:+加法、-减法、*乘法、/除法、^指数、%余数
//输入一个式子回车就可以得到计算结果,可以做多次计算任务
...
//退出计算器的命令quit
quit
[root@localhost ~]#

2.4与命令行相关的快捷键

【Tab】:可以对命令、文件名、选项进行补齐,比如可以在 ca [ tab ][ tab ]后紧接着连续按两次【tab】,Linux控制台中会将所有ca开头的命令打印出来;在 ls -al ~/.Bash [ tab ][ tab ]后紧接着连续按两次【tab】,Linux控制台中会将当前用户目录下所有.Bash开头的文件名称全部打印出来;在 data -- [ tab ][ tab ]后紧接着连续按两次【tab】,Linux控制台中会将date命令的所有选项都打印出来。

【Ctrl】+ C:可以在输入错误时或者想停止某个命令执行时(比如死循环不停的输出,或者因为错误不停的打印错误提示),这时候可以直接使用【Ctrl】+ C停止执行并切换到新的一行。

【Ctrl】- D:表示直接退出当前登入,如果是文本客户端则会直接退出当前用户连接,文本客户端回退到用户登入状态,相当于exit命令;如果是在命令行窗口上,则会直接关闭当前命令行窗口。

【Shift】+ {[ Page UP ]|[ Page Down ]}:当输入内容非常多超出当前文本窗口时,可以使用这两个快捷键来实现翻页查看当前输入的内容。这两个键不常用,是在方向键上方的六个键中最右边的两个键,可能因为键盘大小限制Page会被简写为PG,例如:PGUP。

其他快捷键:

Ctrl + P / ↑:上一个执行的命令(可以向上翻多个);
Ctrl + N / ↓:当使用Ctrl + P向上翻多个时,可以使用这个命令往下翻;
Ctrl + B / ←:光标向左移动;
Ctrl + F / →:光标向右移动;
Alt + B:向左移一个单词;
Alt + F:向右移一个单词;
Ctrl + A:光标会移动到最前面;
Ctrl + E:光标会移动到最末尾;
Ctrl + U:从光标开始到头,剪切;
Ctrl + K:从光标开始到尾,剪切;
Ctrl + W:向前剪切一个单词;
Ctrl + Y:粘贴;
Ctrl + L:清屏;(这与windows系统中的cls命令功能一致)
Ctrl + T:交换光标处和前一个字符
Ctrl + R:搜索之前输入的命令,先按下组合键,然后输入用于搜索的字符,如果自动搜索出来的第一个命令不是你想要的,可以重复按下组合键来查询切换,切换到对应要查找的命令后就可以直接使用回车执行。也可以通过Ctrl + A 或者 Ctrl + E退出查询并切换到刚刚选定的命令头部或尾部,并且可以继续编辑命令
Ctrl + C:终止命令,可以终止当前正在执行的前面命令启动的程序,也可以在输入编辑命令时直接终止当前的编辑切换到新的空行上;

2.5Linux帮助系统

command --help:

一般情况下无法拼写处整个命令时,使用【Tab】快捷键就可以解决,除了【Tab】这种补全的帮助方式,还有命令的[ --help]选项提供当前命令的帮助文档。

 [ root@localhost ~] # date --help   //--help可以简写为--h

man page:

如果帮助文档的内容不够详实,还可以使用man命令来查看命令的在线说明文档,内容会相对--help更丰富,比如下面查看date命令的在线文档:

 [ root@localhost ~] #man date

如果文档内容超出窗口的话,可以使用回车键逐行往下查看,也可使用空格间主页查看。

从man命令的文档查看中退出:按下【Q】键就会自动退出。

man文本查看快捷键:









































 按键 进行工作
 [Page Down] / 空格键 向上翻一页
 [Page Up] 向下翻一页
 [Home] 回到第一页
 [End] 去到最后一页
 /string 向【下】查找string这个字符串
 ?string 向【上】查找string这个字符串
 n,N 当使用/string或?string来查找时,可以使用n来查找下一个,使用N来查找上一个
 q 结束当前man page

 man文档查看方式:

当使用man查看一个命令的在线文档时会在文档的第二行打印出 COMMAND(1~9) ,1~9分别表示命令的代号,可以根据这些代号来理解当前man查询的命令的基本含义,比如 man null 第二行会打印出NULL(4)。下面分别来介绍1~9所代表的含义:













































 代号 代表内容
 1 用户在shell环境中可以操作的命令或可执行文件
 2 系统内核可调用的函数与工具等
 3 一些常用的函数(function)与函数库(library),大部分为C的函数库(libc)
 4 设备文件的说明,通常在在/dev下的文件
 5 配置文件或是某些文件的格式
 6 游戏(games)
 7 惯例与协议等,例如Linux文件系统、网络协议、ASCLL代码等的说明
 8 系统管理员可用的管理命令
 9 跟内核有关的文件

man文档有特殊的文档结构,每一部分的内容都有明确的分类:









































 标题 内容说明
 NAME 简短的命令、数据名称说明
 SYNOPSIS 简短的命令语法(syntax)简介
 DESCRIPTION 较完整的说明
 OPTIONS 针对SYNOPSIS部分中,有列举的所有可用的选项说明
 COMMANDS 当这个程序(软件)在执行时,可以在此程序(软件)中执行的命令
 FILES 这个程序或数据所使用或参考的或链接到的某些文件
 SEE ALSO 可以参考与这个命令或数据有关的其他说明
 EXAMPLE 一些可以参考的范例

 info page:

所有Unix-like系统都可以用man来查询命令和相关文档,在Linux中还提供了另一种查看在线文档的方式,就是info page。

info与man的使用基本一致,只是在文档解构上有一些差异,如果不知道info怎么使用可以在info启动时按下【h】键来了解它提供的功能,关于info page更多内容可以参考这篇博客:Linux的info page。

最后不是所有命令和软件都会有在线帮助文档,更多的可能是一些离线版主文档,这些帮助文档会被统一放到 /usr/share/doc/ 目录下,可以直接使用文本编辑器或者直接将文档内容读取到控制台查看。

2.6文本编辑器nano

 nano text.txt  //如果当前路径下没有text.txt文件就会创建新文件,如果有就直接打开该文件

当打开文件后,命令行窗口的最下方就会多出(^)组合的字母,后面会跟一些短语,这些就是nano编辑器的功能快捷键提示,(^)代表【Ctrl】键,也就是说【Ctrl】+ 字母就能使用对应的功能,下面对这些功能做一些简单的介绍:

【Ctrl】+ G:取得联机帮助(help);
【Ctrl】+ X:离开nano软件,若有修改过文件会提示是否需要保存;
【Ctrl】+ O:保存文件,若你有权限的话就能够保存文件;
【Ctrl】+ R:从其他文件中读取数据,可以将某个文件的内容复制到当前编辑的位置;
【Ctrl】+ W:查找字符串;
【Ctrl】+ C:说明目前光标所在的行数与列数的信息;
【Ctrl】+ _:可以直接输入行号,让光标移动到改行;
【Ctrl】+ Y:语法校验开启与关闭
【Ctrl】+ M:可以支持鼠标来移动光标的功能。

当使用【Ctrl】+X时如果此前有编辑文档,会提示是否保存保存文档(按键选择:Y/N),选择N则直接关闭nano程序,如果选择Y则会继续弹窗一行输入框,在这里可以进行重命名保存文件,如果不需要重命名保存文档就可以直接回车即可。

关于nano命令启动时还有比较丰富的选项,详细可以参考这篇博客:Linux 之 nano编辑器的使用。

2.7如何正确的关闭Linux

1.观察系统的使用状态
2.通知在线用户关机的时刻
//whow 查看当前在线的用户;netstat -a 查看网络连接状态;ps -aux 查看后台执行的程序
3.将内存中的数据写入磁盘
4.提前设置关机时间

通过 su 命令切换至root身份,输入密码登入后使用使用 sync 将内存中的数据写入磁盘(sync一般用户只能更新自己的数据,root可以更新整个系统的数据);

使用shutdown命令关机

 [ root@localhost ~ ] # /sbin/shutdown [ -options ] [时间] [警告信息]

在物理机上使用tty1~tty6任意用户身份都能够关机,如果使用远程工具就必须切换到root身份才能启动关机命令。

//shutdown的选项
-k :不要真的关机,只是发送警告信息出去(可以用来提示还没退出的用户准备关机,而不是真的关机)
-r :在将系统的服务停掉之后就重新启动
-h :将系统服务停掉后,立即关机
-c :取消已经在进行的shutdown命令内容(当前面启动一次真实的shutdown关机命令后,可以用这个选项在执行一次shutdown命令用来取消关机)

通过以下示例来了解shutdown命令的时间设置:

shutdown -h now //立即关机,其中now相当于时间为0的状态(当前时间)
shutdown -h 20:25 //系统在今天的20点25分关机,若当天的时间已经超过设置的时间20:25则是第二天的20:25分关机,比如这个指令是在当天的21点启动执行的,则要到第二天的20:25分关机。
shutdown -h +10 //系统将在十分钟之后关机
shutdown -r now //系统立即重新启动
shutdown -r +30 "The system will reboot" //再过30分钟会重新启动,并会立即将后面的警告信息发送出去。
shutdown -k now 'This system will reboot' //发出关机警告,但不会实质关机

使用reboot、halt、poweroff命令关机或重新启动

这三个命令底层都是调用systemctl这个管理命令,功能差异不大,可以使用man查看它们的文档。

 sync; sync; sync; reboot  //将数据写入磁盘然后重新启动;

 halt           //系统停止,屏幕可能会保留系统已经停止的信息;

 poweroff          //系统关机,所以没有提供额外的电力,屏幕空白;

 关于systemctl在后面有关于系统管理员的博客,会有详细的解析,这里只需要知道这些命令的使用方式即可。

 



推荐阅读
author-avatar
tommy来了
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有