| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Linux -> 正文阅读 |
|
[系统运维]Linux |
目录 ----------------------------------------------------- 1.Linux简介Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。 Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。 Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。 1.1Linux 的发行版Linux 的发行版说简单点就是将 Linux 内核与应用软件做一个打包。 目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。 1.2Linux 应用领域今天各种场合都有使用各种 Linux 发行版,从嵌入式设备到超级计算机,并且在服务器领域确定了地位,通常服务器使用 LAMP(Linux + Apache + MySQL + PHP)或 LNMP(Linux + Nginx+ MySQL + PHP)组合。 目前 Linux 不仅在家庭与企业中使用,并且在政府中也很受欢迎。
1.3Linux vs Windows目前国内 Linux 更多的是应用于服务器上,而桌面操作系统更多使用的是 Windows。主要区别如下
2.Linux内容Linux是一类Unix计算机操作系统的统称。Linux操作系统的内核的名字也是“Linux”。Linux操作系统也是自由软件和开放源代码发展中最著名的例子。严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用 GNU 工程各种工具和数据库的操作系统。Linux得名于计算机业余爱好者Linus Torvalds。 一般可以认为,Linux是一套自由使用(一般可以免费使用)和自由传播的类Unix操作系统。这个系统是由世界各地成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约、全世界都能自由使用的Unix兼容产品。实际上,linux仅仅是linux操作系统中的核心(kernel)。 3.安装VM和Centos3.1VMware安装[VM虚拟机安装]??https://www.jb51.net/softjc/745263.html? 3.2Centos安装[Centos安装]??https://www.jianshu.com/p/78445bc6bd85? 4.Linux目录结构4.1基本介绍1)Linux的文件系统是采用层级式的树状目录结构,在结构中的最上层是根目录“/”,然后再此目录下再创建其他的目录。 2)经典名言:在Linux世界中,一切皆文件(!!). 3)Linux 系统目录结构: 登录系统后,在当前命令窗口下输入命令:
4.2以下是对这些目录的解释:
在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。 /etc: 上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。 /bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在 /bin/ls 目录下的。 值得提出的是,/bin, /usr/bin 是给系统用户使用的指令(除root外的通用户),而/sbin, /usr/sbin 则是给 root 使用的指令。 /var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在 /var/log 目录下,另外 mail 的预设放置也是在这里 5.Linux远程登陆5.1为什么要远程登陆Linux
5.2.下载-安装-配置-使用:下载 free-for-home-school版本 地址:Free for Home/School - Xshell and Xftp Free Licensing 5.3远程登录Linux-Xshell65.3.1介绍
5.3.2Xshell安装配置和使用[Xshell安装] ?https://jingyan.baidu.com/article/7908e85cd7f3feaf491ad256.html? 5.4远程上传下载文件-Xftp65.4.1介绍 是一个基于Windows平台的功能强大的SFTP,FTP文件传输软件。使用了Xftp以后,Windows用户能安全地在Linux和WindowsPC之间传输文件。 5.4.2Xftp6安装配置和使用[Xftp安装]?? https://jingyan.baidu.com/article/22fe7ced9dd2ea3002617f89.html? 6.Linux中vi和vim编辑器6.1基本介绍Linux系统会内置vi文本编辑器 vim具有程序编辑的功能,可以主动的以字体颜色色辨别语法的正确性,方便程序设计。代码补全。 6.2vi和vim常用的三种模式6.2.1正常模式 以vim打开一个档案就直接进入一般模式了。在这个模式中,你可以使用【上下左右】按键来移动光标,你可以使用【删除字符】或【删除整行】来处理文档内容,也可以使用【复制,粘贴】来处理数据。 6.2.2插入模式 按下i,I,o,O,a,A,r,R等字母之后才会进入编辑模式,一般来说按i即可。 6.2.3命令行模式 输入Esc在输入:在这个模式当中,可以提供你相关的指令,完成读取,存盘,替换,离开vim,显示符号等。 6.3vi和vim键盘图Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。 连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个程序开发工具而不是文字处理软件。 6.4vi/vim 的使用基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。 这三种模式的作用分别是: 6.4.1命令模式: 用户刚刚启动 vi/vim,便进入了命令模式。 此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。 以下是常用的几个命令:
若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。 命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。 6.4.2输入模式 在命令模式下按下i就进入了输入模式。 在输入模式中,可以使用以下按键:
6.4.3底线命令模式 在命令模式下按下:(英文冒号)就进入了底线命令模式。 底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。 在底线命令模式中,基本的命令有(已经省略了冒号):
按ESC键可随时退出底线命令模式。 6.5vi/vim 使用实例6.5.1使用 vi/vim 进入一般模式 如果你想要使用 vi 来建立一个名为 runoob.txt 的文件时,你可以这样做:
直接输入 vi 文件名 就能够进入 vi 的一般模式了。请注意,记得 vi 后面一定要加文件名,不管该文件存在与否! 6.5.2按下 i 进入输入模式(也称为编辑模式),开始编辑文字 在一般模式之中,只要按下 i, o, a 等字符就可以进入输入模式了! 在编辑模式当中,你可以发现在左下角状态栏中会出现 –INSERT- 的字样,那就是可以输入任意字符的提示。 这个时候,键盘上除了 Esc 这个按键之外,其他的按键都可以视作为一般的输入按钮了,所以你可以进行任何的编辑。 按下 ESC 按钮回到一般模式 好了,假设我已经按照上面的样式给他编辑完毕了,那么应该要如何退出呢?是的!没错!就是给他按下 Esc 这个按钮即可!马上你就会发现画面左下角的 – INSERT – 不见了! 6.5.3在一般模式中按下 :wq 储存后离开 vi OK,我们要存档了,存盘并离开的指令很简单,输入 :wq 即可保存离开! 这样我们就成功创建了一个 runoob.txt 的文件。 6.6vi/vim 按键说明除了上面简易范例的 i, Esc, :wq 之外,其实 vim 还有非常多的按键可以使用。 6.6.1:一般模式可用的光标移动、复制粘贴、搜索替换等
6.6.2:一般模式切换到编辑模式的可用的按钮说明
6.6.3:一般模式切换到指令行模式的可用的按钮说明
特别注意,在 vi/vim 中,数字是很有意义的!数字通常代表重复做几次的意思! 也有可能是代表去到第几个什么什么的意思。 举例来说,要删除 50 行,则是用 『50dd』 对吧! 数字加在动作之前,如我要向下移动 20 行呢?那就是『20j』或者是『20↓』即可。 6.7补充vim中批量添加注释 方法一 :块选择模式 批量注释: Ctrl + v 进入块选择模式,然后移动光标选中你要注释的行,再按大写的 I 进入行首插入模式输入注释符号如 // 或 #,输入完毕之后,按两下 ESC,Vim 会自动将你选中的所有行首都加上注释,保存退出完成注释。 取消注释: Ctrl + v 进入块选择模式,选中你要删除的行首的注释符号,注意 // 要选中两个,选好之后按 d 即可删除注释,ESC 保存退出。 方法二: 替换命令 批量注释。 使用下面命令在指定的行首添加注释。 使用名命令格式: :起始行号,结束行号s/^/注释符/g(注意冒号)。 取消注释: 使用名命令格式: :起始行号,结束行号s/^注释符//g(注意冒号)。 例子: 1、在 10 - 20 行添加 // 注释
2、在 10 - 20 行删除 // 注释
3、在 10 - 20 行添加 # 注释
4、在 10 - 20 行删除 # 注释
7.Linux开机-重启-用户登录注销7.1关机&重启命令7.1.1基本介绍
7.1.2注意细节
7.2用户登录和注销7.2.1基本介绍
#### 8.Linux用户管理8.1基本介绍Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后用这个账号进入系统。 8.2用户账号的管理8.2.1添加用户,其语法如下:
参数说明:
实例1
此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录 /home/sam(/home为默认的用户主目录所在的父目录)。 实例2
此命令新建了一个用户gem,该用户的登录Shell是 这里可能新建组: 增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow, /etc/group等。 Linux提供了集成的系统管理工具userconf,它可以用来对用户账号进行统一管理。 8.2.2删除帐号 如果一个用户的账号不再使用,可以从系统中删除。删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。 删除一个已有的用户账号使用
常用的选项是 -r,它的作用是把用户的主目录一起删除。 例如:
此命令删除用户sam在系统文件中(主要是/etc/passwd, /etc/shadow, /etc/group等)的记录,同时删除用户的主目录。 8.2.3修改帐号 修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。 修改已有用户的信息使用
常用的选项包括 另外,有些系统可以使用选项:
这个选项指定一个新的账号,即将原来的用户名改为新的用户名。 例如:
此命令将用户sam的登录Shell修改为ksh,主目录改为/home/z,用户组改为developer。 8.3用户密码的管理用户管理的一项重要内容是用户密码的管理。用户账号刚创建时没有密码,但是被系统锁定,无法使用,必须为其指定密码后才可以使用,即使是指定空密码。 指定和修改用户密码的Shell命令是
可使用的选项:
如果默认用户名,则修改当前用户的密码。 例如,假设当前用户是sam,则下面的命令修改该用户自己的密码: $ passwd Old password:****** New password:******* Re-enter new password:******* 如果是超级用户,可以用下列形式指定任何用户的密码: # passwd sam New password:******* Re-enter new password:******* 普通用户修改自己的密码时,passwd命令会先询问原密码,验证后再要求用户输入两遍新密码,如果两次输入的密码一致,则将这个密码指定给用户;而超级用户为用户指定密码时,就不需要知道原密码。 为用户指定空密码时,执行下列形式的命令:
此命令将用户 sam 的密码删除,这样用户 sam 下一次登录时,系统就不再允许该用户登录了。 passwd 命令还可以用 -l(lock) 选项锁定某一用户,使其不能登录,例如:
8.4Linux系统用户组的管理每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。 用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。 8.4.1、增加一个新的用户组使用groupadd命令。其格式如下:
可以使用的选项有:
实例1:
此命令向系统中增加了一个新组group1,新组的组标识号是在当前已有的最大组标识号的基础上加1。 实例2:
此命令向系统中增加了一个新组group2,同时指定新组的组标识号是101。 8.4.2、如果要删除一个已有的用户组,使用groupdel命令,其格式如下:
例如:
此命令从系统中删除组group1。 8.4.3、修改用户组的属性使用groupmod命令。其语法如下:
常用的选项有:
实例1:
此命令将组group2的组标识号修改为102。 实例2:
此命令将组group2的标识号改为10000,组名修改为group3。 8.4.4、如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。 用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。例如:
这条命令将当前用户切换到root用户组,前提条件是root用户组确实是该用户的主组或附加组。类似于用户账号的管理,用户组的管理也可以通过集成的系统管理工具来完成。 8.5、与用户账号有关的系统文件完成用户管理的工作有许多种方法,但是每一种方法实际上都是对有关的系统文件进行修改。 与用户和用户组相关的信息都存放在一些系统文件中,这些文件包括/etc/passwd, /etc/shadow, /etc/group等。 下面分别介绍这些文件的内容。 8.5.1、/etc/passwd文件是用户管理工作涉及的最重要的一个文件。 Linux系统中的每个用户都在/etc/passwd文件中有一个对应的记录行,它记录了这个用户的一些基本属性。 这个文件对所有用户都是可读的。它的内容类似下面的例子:
从上面的例子我们可以看到,/etc/passwd中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:
1)"用户名"是代表用户账号的字符串。 通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号(:),因为冒号在这里是分隔符。 为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头。 2)“密码”一些系统中,存放着加密后的用户密码字节。 虽然这个字段存放的只是用户密码的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux 系统(如SVR4)都使用了shadow技术,把真正的加密后的用户密码字节存放到/etc/shadow文件中,而在/etc/passwd文件的密码字段中只存放一个特殊的字符,例如“x”或者“*”。 3)“用户标识号”是一个整数,系统内部用它来标识用户。 一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等。 通常用户标识号的取值范围是0~65 535。0是超级用户root的标识号,1~99由系统保留,作为管理账号,普通用户的标识号从100开始。在Linux系统中,这个界限是500。 4)“组标识号”字段记录的是用户所属的用户组。 它对应着/etc/group文件中的一条记录。 5)“注释性描述”字段记录着用户的一些个人情况。 例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux 系统中,这个字段的格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。 6)“主目录”,也就是用户的起始工作目录。 它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。 7)用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。 Shell是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)等。 系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。 用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。 利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。 8)系统中有一类用户称为伪用户(pseudo users)。 这些用户在/etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。 常见的伪用户如下所示: 伪 用 户 含 义 bin 拥有可执行的用户命令文件 sys 拥有系统文件 adm 拥有帐户文件 uucp UUCP使用 lp lp或lpd子系统使用 nobody NFS使用 8.6、添加批量用户添加和删除用户对每位Linux系统管理员都是轻而易举的事,比较棘手的是如果要添加几十个、上百个甚至上千个用户时,我们不太可能还使用useradd一个一个地添加,必然要找一种简便的创建大量用户的方法。Linux系统提供了创建大量用户的工具,可以让您立即创建大量用户,方法如下: 8.6.1先编辑一个文本用户文件。 每一列按照
8.6.2以root身份执行命令
然后可以执行命令 8.6.3执行命令/usr/sbin/pwunconv。 将
8.6.4编辑每个用户的密码对照文件。 格式为: 用户名:密码 实例文件 user001:123456 user002:123456 user003:123456 user004:123456 user005:123456 user006:123456 8.6.5以 root 身份执行命令 创建用户密码,
8.6.6确定密码经编码写入/etc/passwd的密码栏后。 执行命令
这样就完成了大量用户的创建了,之后您可以到/home下检查这些用户宿主目录的权限设置是否都正确,并登录验证用户密码是否正确。 9,Linux实用指令9.1,指令运行级别运行级别说明: 0:关机 1:单用户【找回丢失密码】 2:多用户状态没有网络服务 3:多用户状态有网络服务 4:系统未使用保留给用户 5:图形界面 6:系统重启 常用的运行级别是3和5,通过init来切换不同的运行级别,然后关机。 9.2找回root密码9.3处理目录的常用指令9.3.1在开始本教程前我们需要先知道什么是绝对路径与相对路径。
9.3.2几个常见的处理目录的命令:
你可以使用 man [命令] 来查看各个命令的使用文档,如 :man cp。 ls (列出目录) 在Linux系统当中, ls 命令可能是最常被运行的。 语法:
选项与参数:
将家目录下的所有文件列出来(含属性与隐藏档)
cd (切换目录) cd是Change Directory的缩写,这是用来变换工作目录的命令。 语法:
接下来大家多操作几次应该就可以很好的理解 cd 命令的。 pwd (显示目前所在的目录) pwd 是 Print Working Directory 的缩写,也就是显示目前所在目录的命令。
选项与参数:
实例:单纯显示出目前的工作目录:
实例显示出实际的工作目录,而非连结档本身的目录名而已。
# 看到这里应该知道为啥了吧?因为 /var/mail 是连结档,连结到 /var/spool/mail # 所以,加上 pwd -P 的选项后,会不以连结档的数据显示,而是显示正确的完整路径啊! mkdir (创建新目录) 如果想要创建新的目录的话,那么就使用mkdir (make directory)吧。 语法:
选项与参数:
实例:请到/tmp底下尝试创建数个新目录看看:
加了这个 -p 的选项,可以自行帮你创建多层目录! 实例:创建权限为 rwx--x--x 的目录。
上面的权限部分,如果没有加上 -m 来强制配置属性,系统会使用默认属性。 如果我们使用 -m ,如上例我们给予 -m 711 来给予新的目录 drwx--x--x 的权限。 rmdir (删除空的目录) 语法:
选项与参数:
删除 runoob 目录
将 mkdir 实例中创建的目录(/tmp 底下)删除掉!
利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除。 不过要注意的是,这个 rmdir 仅能删除空的目录,你可以使用 rm 命令来删除非空目录。 cp (复制文件或目录) cp 即拷贝文件和目录。 语法:
选项与参数:
用 root 身份,将 root 目录下的 .bashrc 复制到 /tmp 下,并命名为 bashrc
rm (移除文件或目录) 语法:
选项与参数:
将刚刚在 cp 的实例中创建的 bashrc 删除掉!
如果加上 -i 的选项就会主动询问喔,避免你删除到错误的档名! mv (移动文件与目录,或修改名称) 语法:
选项与参数:
复制一文件,创建一目录,将文件移动到目录中
将某个文件移动到某个目录去,就是这样做! 将刚刚的目录名称更名为 mvtest2
9.4Linux 查看指令Linux系统中使用以下命令来查看文件的内容:
你可以使用 man [命令]来查看各个命令的使用文档,如 :man cp。 cat 命令 由第一行开始显示文件内容 语法:
选项与参数:
检看 /etc/issue 这个文件的内容:
tac 命令 tac与cat命令刚好相反,文件内容从最后一行开始显示,可以看出 tac 是 cat 的倒着写!如:
nl 命令 显示行号 语法:
选项与参数:
实例一:用 nl 列出 /etc/issue 的内容
more 命令 一页一页翻动
在 more 这个程序的运行过程中,你有几个按键可以按的:
less 命令 一页一页翻动,以下实例输出/etc/man.config文件的内容:
less运行时可以输入的命令有:
head 命令 取出文件前面几行 语法:
选项与参数:
默认的情况中,显示前面 10 行!若要显示前 20 行,就得要这样:
tail 命令 取出文件后面几行 语法:
选项与参数:
echo 命令 echo 输出内容到控制台 语法:
语法:
9.5Linux帮助指令9.5.1man 获得帮助指令 基本语法:
案例 查看ls命令的帮助信息 man ls 在Linux下,隐藏文件是以 .开头,选项可以组合使用,比如:
9.5.2help命令
9.5.3、info命令
9.6时间日期类9.6.1date指令-显示当前日期 基本语法:
9.6.2date指令-设置日期 基本语法:
9.6.3cal指令 查看日期指令 cal 基本语法:
9.7Linux搜索查找指令9.7.1find指令 find指令是将从指定目录向下递归遍历其各个子目录,将满足条件的文件或目录显示在终端。 基本语法:
选项说明:
应用实例: 案例1:按文件名:根据名称查找/home目录下hello.txt文件
案例2:按拥有着:查找/opt目录下,用户名称为nobody的文件
案例3:查找整个Linux系统下大于200M的文件(+n大于 -n小于 n等于,)
9.7.2locate指令 locate指令可以快速定位文件路径。locate指令利用事先建立的系统中所有文件名及路径的locate数据库实现快速定位文件。 基本语法:
特别说明: 由于locate指令基于数据库进行查询,所以第一次运行前,必须使用updaedb指令创建locate数据库。 9.7.3grep指令和管道指令 | grep指令过滤查找,管道符“|”,表示将前一个命令处理后的结果输出传送给后面的指令。 基本语法:
常用选项:
案例:请在hello.txt文件中,查找“yes”所在行,并显示行号 写法一:cat /home/hello.txt |grep "yes" 写法二:grep -n "yes" /home/hello.txt 9.8压缩和解压类9.8.1gzip/gunzip指令 gzip指令用于压缩文件,gunzip指令用于解压 基本语法:
案例1:gzip压缩,将/home下的hello.txt文件进行压缩
案例2:gunzip压缩,将/home下的hello.txt.gz文件进行解压缩
9.8.2zip/unzip指令 zip指令用于压缩文件,unzip指令用于解压 基本语法:
zip常用选项: -r 递归压缩,及压缩目录 unzip常用选项: -d<目录> 指定解压后文件的存放目录 案例1:zip压缩,将/home下的所有文件进行压缩成myhone.zip
案例2:unzip压缩,将myhome.zip解压到/opt/tmp目录下
9.8.3tar指令 tar指令是打包指令,最后打包后的文件是.tar.gz的文件 基本语法:
选项说明:
案例1:压缩多个文件,将/home/pig.txt和/home/cat.txt压缩成pc.tar.gz
案例2:将/home的文件夹压缩成myhome.tar.gz
案例3:将pc.tar.gz解压到当前目录
10Linux权限10.1权限的基本介绍 Linux权限是操作系统用来限制对资源访问的机制,权限一般分为读、写、执行。系统中每个文件都拥有特定的权限、所属用户及所属组,通过这样的机制来限制哪些用户或用户组可以对特定文件进行相应的操作。 Linux每个进程都是以某个用户身份运行,进程的权限与该用户的权限一样,用户的权限越大,则进程拥有的权限就越大。 Lnux中有的文件及文件夹都有至少权限三种权限,常见的权限如表所示:
Linux权限授权,默认是授权给三种角色,分别是user、group、other,Linux权限与用户之间的关联如下:
每个文件的权限基于UGO进行设置; 权限三位一组(rwx),同时需授权给三种角色,UGO; 每个文件拥有一个所属用户和所属组,对应UGO,不属于该文件所属用户或所属组使用O来表示; 在Linux系统中,可以通过ls –l 查看peter.net目录的详细属性,如下所示:
peter.net目录属性参数详解如下:
10.2Chmod用户及组权限 修改某个用户、组对文件夹的权限,用命令chmod实现,其中以代指ugo,、-、=代表加入、删除和等于对应权限,具体案例如下: (1) 授予用户对peter.net目录拥有rwx权限
(2) 授予组对peter.net目录拥有rwx权限
(3) 授予用户、组、其他人对jpeter.net目录拥有rwx权限
(4) 撤销用户对peter.net目录拥有w权限
(5) 撤销用户、组、其他人对peter.net目录拥有x权限
(6) 授予用户、组、其他人对jpeter.net目录只有rx权限
10.3Chmod二进制权限 Linux权限默认使用rwx来表示,为了更简化在系统中对权限进行配置和修改,Linux权限引入二进制表示方法,如下代码: Linux权限可以将rwx用二进制来表示,其中有权限用1表示,没有权限用0表示;Linux权限用二进制显示如下: rwx=111r-x=101rw-=110r--=100依次类推,转化为十进制,对应十进制结果显示如下:rwx=111=4+2+1=7r-x=101=4+0+1=5rw-=110=4+4+0=6r--=100=4+0+0=4得出结论,用r=4,w=2,x=1来表示权限。 使用二进制方式来修改权限案例演示如下,其中默认peter.nett目录权限为755: (1) 授予用户对peter.net目录拥有rwx权限
(2) 授予组对peter.net目录拥有rwx权限
(3) 授予用户、组、其他人对peter.net目录拥有rwx权限
11Linux定时任务调度11.1crond任务调度 crontab 进行定时任务的设置 11.1.1概述 任务调度: 是指系统在某个时刻执行的特定的命令或程序 任务调度分类:
11.1.2基本语法
11.1.3常用选项
11.1.4快速入门
###参数细节说明
###特殊符号的说明
11.1.5crond相关指令
11.2at定时任务 11.2.1基本介绍
11.2.2at命令格式
Ctrl + D结束at命令的输入(要输两次) 11.2.3at命令选项
11.2.4at时间定义 ###at指定时间的方法 1.接受在当天的hh:mm (小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。例如:04:00 2.使用midnight (深夜),noon (中午),teatime (饮茶时间,-般是下午4点)等比较模糊的词语来指定时间。 3.采用12小时计时制,即在时间后面加上AM (上午)或PM (下午)来说明是上午还是下午。例如: 12pm。 4.指定命令执行的具体日期,指定格式为month day(月日)或mm/dd/yy (月/日/年)或dd.mm.yy( 日.月年) ,指定的日期必须跟在指定时间的后面。例如: 04:00 2021-08-1 5.使用相对计时法。指定格式为: now + count time-units, now就是当前时间, time-units是时间单位,这里能够是minutes (分钟)、hours (小时)、days (天)、weeks (星期)●count是时间的数量,几天,几小时。例如: now + 5 minutes 6.直接使用today (今天)、tomorrow (明天)来指定完成命令的时间。 12Linux磁盘分区12.1Linux分区 12.1.1原理介绍 Linux 磁盘管理好坏直接关系到整个系统的性能问题。 Linux 磁盘管理常用三个命令为 df、du 和 fdisk。
12.2查询系统整体磁盘使用情况 12.2.1df命令 df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。 语法:
选项与参数:
实例 1:将系统内所有的文件系统列出来! [root@www ~]# df Filesystem ? ? 1K-blocks ? ? Used Available Use% Mounted on /dev/hdc2 ? ? ? ? 9920624 ? 3823112 ? 5585444 41% / /dev/hdc3 ? ? ? ? 4956316 ? 141376 ? 4559108 ? 4% /home /dev/hdc1 ? ? ? ? 101086 ? ? 11126 ? ? 84741 12% /boot tmpfs ? ? ? ? ? ? 371332 ? ? ? ? 0 ? 371332 ? 0% /dev/shm 在 Linux 底下如果 df 没有加任何选项,那么默认会将系统内所有的 (不含特殊内存内的文件系统与 swap) 都以 1 Kbytes 的容量来列出来! 实例 2:将容量结果以易读的容量格式显示出来 [root@www ~]# df -h Filesystem ? ? ? ? ? Size Used Avail Use% Mounted on /dev/hdc2 ? ? ? ? ? ? 9.5G 3.7G 5.4G 41% / /dev/hdc3 ? ? ? ? ? ? 4.8G 139M 4.4G ? 4% /home /dev/hdc1 ? ? ? ? ? ? 99M ? 11M ? 83M 12% /boot tmpfs ? ? ? ? ? ? ? ? 363M ? ? 0 363M ? 0% /dev/shm 实例 3:将系统内的所有特殊文件格式及名称都列出来 [root@www ~]# df -aT Filesystem ? Type 1K-blocks ? Used Available Use% Mounted on /dev/hdc2 ? ? ext3 ? 9920624 3823112 ? 5585444 41% / proc ? ? ? ? proc ? ? ? ? 0 ? ? ? 0 ? ? ? ? 0 ? - /proc sysfs ? ? ? sysfs ? ? ? ? 0 ? ? ? 0 ? ? ? ? 0 ? - /sys devpts ? ? devpts ? ? ? ? 0 ? ? ? 0 ? ? ? ? 0 ? - /dev/pts /dev/hdc3 ? ? ext3 ? 4956316 141376 ? 4559108 ? 4% /home /dev/hdc1 ? ? ext3 ? 101086 ? 11126 ? ? 84741 12% /boot tmpfs ? ? ? tmpfs ? 371332 ? ? ? 0 ? 371332 ? 0% /dev/shm none ? binfmt_misc ? ? ? ? 0 ? ? ? 0 ? ? ? ? 0 ? - /proc/sys/fs/binfmt_misc sunrpc rpc_pipefs ? ? ? ? 0 ? ? ? 0 ? ? ? ? 0 ? - /var/lib/nfs/rpc_pipefs 实例 4:将 /etc 底下的可用的磁盘容量以易读的容量格式显示 [root@www ~]# df -h /etc Filesystem ? ? ? ? ? Size Used Avail Use% Mounted on /dev/hdc2 ? ? ? ? ? ? 9.5G 3.7G 5.4G 41% / 12.3查询指定目录的磁盘占用情况 12.3.1du命令 Linux du 命令也是查看使用空间的,但是与 df 命令不同的是 Linux du 命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的,这里介绍 Linux du 命令。 语法:
选项与参数:
实例 1:只列出当前目录下的所有文件夹容量(包括隐藏文件夹): [root@www ~]# du 8 ? ? ? ./test4 ? ? <==每个目录都会列出来 8 ? ? ? ./test2 ....中间省略.... 12 ? ? ./.gconfd ? <==包括隐藏文件的目录 220 ? ? . ? ? ? ? ? <==这个目录(.)所占用的总量 直接输入 du 没有加任何选项时,则 du 会分析当前所在目录里的子目录所占用的硬盘空间。 实例 2:将文件的容量也列出来 [root@www ~]# du -a 12 ? ? ./install.log.syslog ? <==有文件的列表了 8 ? ? ? ./.bash_logout 8 ? ? ? ./test4 8 ? ? ? ./test2 ....中间省略.... 12 ? ? ./.gconfd 220 ? ? . 实例 3:检查根目录底下每个目录所占用的容量 [root@www ~]# du -sm /* 7 ? ? ? /bin 6 ? ? ? /boot .....中间省略.... 0 ? ? ? /proc .....中间省略.... 1 ? ? ? /tmp 3859 ? /usr ? ? <==系统初期最大就是他了啦! 77 ? ? /var 通配符 * 来代表每个目录。 与 df 不一样的是,du 这个命令其实会直接到文件系统内去搜寻所有的文件数据。 12.4Linux增加磁盘 12.4.1fdisk命令 fdisk 是 Linux 的磁盘分区表操作工具。 语法:
选项与参数:
实例 1:列出所有分区信息 [root@AY120919111755c246621 tmp]# fdisk -l ? Disk /dev/xvda: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 ? ? Device Boot ? ? Start ? ? ? ? End ? ? Blocks ? Id System /dev/xvda1 ? * ? ? ? ? ? 1 ? ? ? 2550 ? 20480000 ? 83 Linux /dev/xvda2 ? ? ? ? ? 2550 ? ? ? 2611 ? ? 490496 ? 82 Linux swap / Solaris ? Disk /dev/xvdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x56f40944 ? ? Device Boot ? ? Start ? ? ? ? End ? ? Blocks ? Id System /dev/xvdb2 ? ? ? ? ? ? ? 1 ? ? ? 2610 ? 20964793+ 83 Linux 实例 2:找出你系统中的根目录所在磁盘,并查阅该硬盘内的相关信息 [root@www ~]# df / ? ? ? ? ? <==注意:重点在找出磁盘文件名而已 Filesystem ? ? ? ? ? 1K-blocks ? ? Used Available Use% Mounted on /dev/hdc2 ? ? ? ? ? ? 9920624 ? 3823168 ? 5585388 41% / ? [root@www ~]# fdisk /dev/hdc <==仔细看,不要加上数字喔! The number of cylinders for this disk is set to 5005. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs ? (e.g., DOS FDISK, OS/2 FDISK) ? Command (m for help): ? ? <==等待你的输入! 离开 fdisk 时按下 Command (m for help): p <== 这里可以输出目前磁盘的状态 ? Disk /dev/hdc: 41.1 GB, 41174138880 bytes ? ? ? <==这个磁盘的文件名与容量 255 heads, 63 sectors/track, 5005 cylinders ? ? <==磁头、扇区与磁柱大小 Units = cylinders of 16065 * 512 = 8225280 bytes <==每个磁柱的大小 ? ? Device Boot ? ? Start ? ? ? ? End ? ? Blocks ? Id System /dev/hdc1 ? * ? ? ? ? ? 1 ? ? ? ? 13 ? ? 104391 ? 83 Linux /dev/hdc2 ? ? ? ? ? ? 14 ? ? ? 1288 ? 10241437+ 83 Linux /dev/hdc3 ? ? ? ? ? 1289 ? ? ? 1925 ? ? 5116702+ 83 Linux /dev/hdc4 ? ? ? ? ? 1926 ? ? ? 5005 ? 24740100 ? 5 Extended /dev/hdc5 ? ? ? ? ? 1926 ? ? ? 2052 ? ? 1020096 ? 82 Linux swap / Solaris # 装置文件名 启动区否 开始磁柱 ? 结束磁柱 1K大小容量 磁盘分区槽内的系统 ? Command (m for help): q 想要不储存离开吗?按下 q 就对了!不要随便按 w 啊! 使用 12.5磁盘格式化 磁盘分割完毕后自然就是要进行文件系统的格式化,格式化的命令非常的简单,使用 语法:
选项与参数:
实例 1:查看 mkfs 支持的文件格式 [root@www ~]# mkfs[tab][tab] mkfs ? ? ? ? mkfs.cramfs mkfs.ext2 ? mkfs.ext3 ? mkfs.msdos ? mkfs.vfat 按下两个[tab],会发现 mkfs 支持的文件格式如上所示。 实例 2:将分区 /dev/hdc6(可指定你自己的分区) 格式化为 ext3 文件系统: [root@www ~]# mkfs -t ext3 /dev/hdc6 mke2fs 1.39 (29-May-2006) Filesystem label= ? ? ? ? ? ? ? <==这里指的是分割槽的名称(label) OS type: Linux Block size=4096 (log=2) ? ? ? ? <==block 的大小配置为 4K Fragment size=4096 (log=2) 251392 inodes, 502023 blocks ? ? <==由此配置决定的inode/block数量 25101 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=515899392 16 block groups 32768 blocks per group, 32768 fragments per group 15712 inodes per group Superblock backups stored on blocks: ? ? ? 32768, 98304, 163840, 229376, 294912 ? Writing inode tables: done Creating journal (8192 blocks): done <==有日志记录 Writing superblocks and filesystem accounting information: done ? This filesystem will be automatically checked every 34 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. # 这样就创建起来我们所需要的 Ext3 文件系统了!简单明了! 12.6磁盘检验 fsck(file system check)用来检查和维护不一致的文件系统。 若系统掉电或磁盘发生问题,可利用fsck命令对文件系统进行检查。 语法:
选项与参数:
实例 1:查看系统有多少文件系统支持的 fsck 命令: [root@www ~]# fsck[tab][tab] fsck ? ? ? ? fsck.cramfs fsck.ext2 ? fsck.ext3 ? fsck.msdos ? fsck.vfat 实例 2:强制检测 /dev/hdc6 分区: [root@www ~]# fsck -C -f -t ext3 /dev/hdc6 fsck 1.39 (29-May-2006) e2fsck 1.39 (29-May-2006) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information vbird_logical: 11/251968 files (9.1% non-contiguous), 36926/1004046 blocks 如果没有加上 -f 的选项,则由于这个文件系统不曾出现问题,检查的经过非常快速!若加上 -f 强制检查,才会一项一项的显示过程。 12.7磁盘挂载与卸除 Linux 的磁盘挂载使用 磁盘挂载语法:
实例 :用默认的方式,将刚刚创建的 /dev/hdc6 挂载到 /mnt/hdc6 上面! [root@www ~]# mkdir /mnt/hdc6 [root@www ~]# mount /dev/hdc6 /mnt/hdc6 [root@www ~]# df Filesystem ? ? ? ? ? 1K-blocks ? ? Used Available Use% Mounted on .....中间省略..... /dev/hdc6 ? ? ? ? ? ? 1976312 ? ? 42072 ? 1833836 ? 3% /mnt/hdc6 磁盘卸载命令
选项与参数:
卸载/dev/hdc6 [root@www ~]# umount /dev/hdc6 ? 13Linux网络环境配置13.1自动获取IP 说明:登陆后,通过界面的设置自动获取IP, 优点:Linux启动后会自动获取IP地址, 缺点:每次自动获取的IP地址可能不一样。 13.2指定IP 说明:直接修改配置文件来指定IP,并可以连接到外网。 13.2.1编辑:
13.2.2要求:将IP地址配置为静态,比如:IP地址位192.168.200.130 ifcfg-ens33文件说明: DEVICE=eth0 ? ? ? #接口名(设备,网卡) HWADDR=00:0C:2x:6x:0x:xx ? #MAC地址 TYPE=Ethemet ? ? ? #网络类型 UUID=926a57ba-92c6-4231-bacb-f27e5e6a9f44 #随机id #系统启动时网络接口是否有效 ONBOOT=yes #IP的配置方式[none][static][bootp|dhcp] BOOTRROTO=static #IP地址 IPADDR=192.168.200.130 #网关 GATEWAY=192.168.200.2 #域名解析器 DNSI=192.168.200.2 13.2.3重启网络服务或重启系统生效 service network restart 或者: reboot 14Linux进程管理14.1基本介绍
14.2显示系统执行的进程 14.2.1基本介绍 ps命令是用来查看当前系统中,有那些正在执行,以及他们的执行状况。可以不加任何参数。 14.2.2ps详解 指令: ps-aux|grep xxx,比如我看看有没有sshd服务 指令说明:
14.3终止进程kill和killall 14.3.1介绍 若是某个进程执行一半需要停止时,或是已占用很大的系统资源时,可以考虑停止该进程 14.3.2基本语法
14.4查看进程树 14.4.1基本语法
14.4.2常用选项
14.5服务管理 14.5.1介绍 服务本质就是进程,但是运行在后台的,通常会监听某个端口,等待其他程序的请求,因此我们称为守护进程, 14.5.2service管理指令
14.5.3查看服务名 方法一:使用setup->系统服务就可以看到全部 方法二:/etc/init.d查看
14.5.4chkconfig指令 14.5.4.1介绍: 通过chkconfig命令可以给服务器的各个运行级别设置自启动/关闭 14.5.4.2基本语法
14.5.5打开或关闭指定端口 在真实的环境中,往往需要将防火墙打开,如果打开那麽外部请求数据包就不能跟服务器监听端口通讯。这时需要打开指定端口。 14.5.5.1firewall指令 firewalld是防火墙的另一种程序,与iptables相同,但是使用起来更加简单。一些firewall常用命令:
例如: 一、先使用如下指令打开防火墙端口
二、重启防火墙,让新增的端口生效
三、查看防火墙打开的端口
四、启动服务,让服务监听这个10306端口 14.6动态监控进程 14.6.1介绍 top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。top与ps相似,他们都是用来显示正在执行的进程,top再执行一段时间可以更新正在运行的进程
14.6.2参数解释:
在top命令显示的页面还可以输入以下按键执行相应的功能(注意大小写区分的):
14.7监控网络状态 14.7.1查看系统网络情况netstat 14.7.1.1基本语法
14.7.1.2选项说明
14.7.2检测主机连接命令ping 是一种网络检测工具,它主要是用来检测远程主机是否正常,或是两部主机间的网络或网卡故障。如ping对方的IP地址 15Linux中RPM与YUM15.1RPM包文件默认安装位置:
15.2相关命令 命令用途:RPM包的管理工具。
15.3常用选项:
标识 意义 S 文件大小是否改变 M 文件的类型(参照文件类型对照表)或文件的权限是否改变 5 文件MD5校验值是否改变 D 设备中的从代码是否改变 L 文件路径是否改变 U 文件的所有者是否改变 G 文件的所属组是否改变 T 文件的修改时间是否改变 校验的文件类型对照表如下。 标识 类型 c 配置文件(config file) d 普通文档(documentation) g “鬼”文件(ghost file),指不该出现在这个RPM包中的文件 l 授权文件(license file) r 描述文件(read me) //查询所有已安装的httpd软件包 rpm -qa | grep httpd //查询已安装的httpd软件包的详细信息 rpm -qi httpd //查询未安装的httpd-2.2.15-29.el6.centos.x86_64.rpm软件包的详细信息 rpm -qip httpd-2.2.15-29.el6.centos.x86_64.rpm //查询已安装的httpd软件包中文件的安装位置 rpm -ql httpd //查询未安装的httpd-2.2.15-29.el6.centos.x86_64.rpm软件包中文件的安装位置 rpm -qlp httpd-2.2.15-29.el6.centos.x86_64.rpm //查询系统文件/usr/sbin/httpd所属的软件包 rpm -qf /usr/sbin/httpd //查询已安装的httpd软件包的依赖性 rpm -qR httpd //查询未安装的httpd-2.2.15-29.el6.centos.x86_64.rpm软件包的依赖性 rpm -qRp httpd-2.2.15-29.el6.centos.x86_64.rpm //校验已安装的httpd软件包 rpm -V httpd //校验未安装的httpd-2.2.15-29.el6.centos.x86_64.rpm软件包 rpm -Vp httpd-2.2.15-29.el6.centos.x86_64.rpm 注:在使用rpm命令时,若操作的包是未安装的软件包时,需使用包全名,而且要注意路径;若操作的是已经安装的软件包时,使用包名,系统会去/var/lib/rpm/中的数据库中搜索。 15.4Linux yum 命令 yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。 基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。 yum 提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。 15.4.1yum 语法
15.4.2yum常用命令
实例 1安装 pam-devel [root@www ~]# yum install pam-devel Setting up Install Process Parsing package install arguments Resolving Dependencies <==先检查软件的属性相依问题 --> Running transaction check ---> Package pam-devel.i386 0:0.99.6.2-4.el5 set to be updated --> Processing Dependency: pam = 0.99.6.2-4.el5 for package: pam-devel --> Running transaction check ---> Package pam.i386 0:0.99.6.2-4.el5 set to be updated filelists.xml.gz ? ? ? ? 100% |=========================| 1.6 MB ? 00:05 filelists.xml.gz ? ? ? ? 100% |=========================| 138 kB ? 00:00 -> Finished Dependency Resolution ……(省略) 实例 2移除 pam-devel [root@www ~]# yum remove pam-devel Setting up Remove Process Resolving Dependencies <==同样的,先解决属性相依的问题 --> Running transaction check ---> Package pam-devel.i386 0:0.99.6.2-4.el5 set to be erased --> Finished Dependency Resolution Dependencies Resolved ============================================================================= Package ? ? ? ? ? ? ? ? Arch ? ? ? Version ? ? ? ? Repository ? ? ? Size ============================================================================= Removing: pam-devel ? ? ? ? ? ? ? i386 ? ? ? 0.99.6.2-4.el5 ? installed ? ? ? ? 495 k ? Transaction Summary ============================================================================= Install ? ? 0 Package(s) Update ? ? ? 0 Package(s) Remove ? ? ? 1 Package(s) <==还好,并没有属性相依的问题,单纯移除一个软件 ? Is this ok [y/N]: y Downloading Packages: Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Erasing ? : pam-devel ? ? ? ? ? ? ? ? ? ######################### [1/1] ? Removed: pam-devel.i386 0:0.99.6.2-4.el5 Complete! 实例 3利用 yum 的功能,找出以 pam 为开头的软件名称有哪些? [root@www ~]# yum list pam* Installed Packages pam.i386 ? ? ? ? ? ? ? ? 0.99.6.2-3.27.el5 ? ? installed pam_ccreds.i386 ? ? ? ? ? 3-5 ? ? ? ? ? ? ? ? ? installed pam_krb5.i386 ? ? ? ? ? ? 2.2.14-1 ? ? ? ? ? ? ? installed pam_passwdqc.i386 ? ? ? ? 1.0.2-1.2.2 ? ? ? ? ? installed pam_pkcs11.i386 ? ? ? ? ? 0.5.3-23 ? ? ? ? ? ? ? installed pam_smb.i386 ? ? ? ? ? ? 1.1.7-7.2.1 ? ? ? ? ? installed Available Packages <==底下则是『可升级』的或『未安装』的 pam.i386 ? ? ? ? ? ? ? ? 0.99.6.2-4.el5 ? ? ? ? base pam-devel.i386 ? ? ? ? ? 0.99.6.2-4.el5 ? ? ? ? base pam_krb5.i386 ? ? ? ? ? ? 2.2.14-10 ? ? ? ? ? ? base 15.5国内 yum 源 网易(163)yum源是国内最好的yum源之一 ,无论是速度还是软件版本,都非常的不错。 将yum源设置为163 yum,可以提升软件包安装和更新的速度,同时避免一些常见软件版本无法找到。 15.5.1安装步骤 首先备份/etc/yum.repos.d/CentOS-Base.repo
下载对应版本 repo 文件, 放入 /etc/yum.repos.d/ (操作前请做好相应备份) wget http://mirrors.163.com/.help/CentOS6-Base-163.repo mv CentOS6-Base-163.repo CentOS-Base.repo 运行以下命令生成缓存
-----------------------------------------------------16大数据定制篇-shell编程16.1Shell 介绍Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。 Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。 16.2Shell 脚本Shell 脚本(shell script),是一种为 shell 编写的脚本程序。 业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。 由于习惯的原因,简洁起见,本文出现的 "shell编程" 都是指 shell 脚本编程,不是指开发 shell 自身。 16.3Shell 环境Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。 Linux 的 Shell 种类众多,常见的有:
本教程关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。 在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。 #! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。 echo 命令用于向窗口输出文本。 16.4Shell 脚本有两种方法:16.4.1、作为可执行程序 将上面的代码保存为 test.sh,并 cd 到相应目录: chmod +x ./test.sh #使脚本具有执行权限 ./test.sh #执行脚本 注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。 16.4.2、作为解释器参数 这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如: /bin/sh test.sh /bin/php test.php 这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。 16.5Shell 变量定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: your_name="runoob.com" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
有效的 Shell 变量名示例如下: RUNOOB LD_LIBRARY_PATH _var var2 无效的变量命名: ?var=123 user*name=runoob 除了显式地直接赋值,还可以用语句给变量赋值,如: for file in `ls /etc` 或 for file in $(ls /etc) 以上语句将 /etc 下目录的文件名循环出来。 16.5.1使用变量 使用一个定义过的变量,只要在变量名前面加美元符号即可,如: your_name="qinjx" echo $your_name echo ${your_name} 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况: for skill in Ada Coffe Action Java; do ? echo "I am good at ${skill}Script" done 如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。 推荐给所有变量加上花括号,这是个好的编程习惯。 已定义的变量,可以被重新定义,如: your_name="tom" echo $your_name your_name="alibaba" echo $your_name 这样写是合法的,但注意,第二次赋值的时候不能写$your_name="alibaba",使用变量的时候才加美元符($)。 16.5.2只读变量 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。 下面的例子尝试更改只读变量,结果报错: #!/bin/bash myUrl="https://www.google.com" readonly myUrl myUrl="https://www.runoob.com" 运行脚本,结果如下:
16.5.3删除变量 使用 unset 命令可以删除变量。语法:
变量被删除后不能再次使用。unset 命令不能删除只读变量。 实例 #!/bin/sh myUrl="https://www.runoob.com" unset myUrl echo $myUrl 以上实例执行将没有任何输出。 16.6变量类型运行shell时,会同时存在三种变量:
16.7Shell 字符串字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。 16.7.1单引号 str='this is a string' 单引号字符串的限制:
16.7.2双引号 your_name='runoob' str="Hello, I know you are \"$your_name\"! \n" echo -e $str 输出结果为: Hello, I know you are "runoob"! 双引号的优点:
16.7.3拼接字符串 your_name="runoob" # 使用双引号拼接 greeting="hello, "$your_name" !" greeting_1="hello, ${your_name} !" echo $greeting $greeting_1 # 使用单引号拼接 greeting_2='hello, '$your_name' !' greeting_3='hello, ${your_name} !' echo $greeting_2 $greeting_3 输出结果为: hello, runoob ! hello, runoob ! hello, runoob ! hello, ${your_name} ! 16.7.3.1获取字符串长度 string="abcd" echo ${#string} #输出 4 16.7.3.2提取子字符串 以下实例从字符串第 2 个字符开始截取 4 个字符: string="runoob is a great site" echo ${string:1:4} # 输出 unoo 注意:第一个字符的索引值为 0。 16.7.3.3查找子字符串 查找字符 i 或 o 的位置(哪个字母先出现就计算哪个): string="runoob is a great site" echo `expr index "$string" io` # 输出 4 注意: 以上脚本中 ` 是反引号,而不是单引号 ',不要看错了哦。 16.8Shell 数组bash支持一维数组(不支持多维数组),并且没有限定数组的大小。 类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。 16.8.1定义数组 在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为: 数组名=(值1 值2 ... 值n) 例如: array_name=(value0 value1 value2 value3) 或者 array_name=( value0 value1 value2 value3 ) 还可以单独定义数组的各个分量: array_name[0]=value0 array_name[1]=value1 array_name[n]=valuen 可以不使用连续的下标,而且下标的范围没有限制。 16.8.2读取数组 读取数组元素值的一般格式是:
例如: valuen=${array_name[n]} 使用 @ 符号可以获取数组中的所有元素,例如:
16.8.3获取数组的长度 获取数组长度的方法与获取字符串长度的方法相同,例如:
16.9Shell 注释以 # 开头的行就是注释,会被解释器忽略。 通过每一行加一个 # 号设置多行注释,像这样: ##### 用户配置区 开始 ##### # # # 这里可以添加脚本描述信息 # # ##### 用户配置区 结束 ##### 如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢? 每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。 16.9.1多行注释 多行注释还可以使用以下格式: :<<EOF 注释内容... 注释内容... 注释内容... EOF EOF 也可以使用其他符号: :<<' 注释内容... 注释内容... 注释内容... ' ? :<<! 注释内容... 注释内容... 注释内容... ! 16.10Shell 传递参数我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 实例 以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径): echo "Shell 传递参数实例!"; echo "执行的文件名:$0"; echo "第一个参数为:$1"; echo "第二个参数为:$2"; echo "第三个参数为:$3"; 为脚本设置可执行权限,并执行脚本,输出结果如下所示: $ chmod +x test.sh $ ./test.sh 1 2 3 Shell 传递参数实例! 执行的文件名:./test.sh 第一个参数为:1 第二个参数为:2 第三个参数为:3 另外,还有几个特殊字符用来处理参数:
echo "Shell 传递参数实例!"; echo "第一个参数为:$1"; ? echo "参数个数为:$#"; echo "传递的参数作为一个字符串显示:$*"; 执行脚本,输出结果如下所示: $ chmod +x test.sh $ ./test.sh 1 2 3 Shell 传递参数实例! 第一个参数为:1 参数个数为:3 传递的参数作为一个字符串显示:1 2 3 $* 与 $@ 区别:
echo "-- \$* 演示 ---" for i in "$*"; do ? echo $i done ? echo "-- \$@ 演示 ---" for i in "$@"; do ? echo $i done 执行脚本,输出结果如下所示: $ chmod +x test.sh $ ./test.sh 1 2 3 -- $* 演示 --- 1 2 3 -- $@ 演示 --- 1 2 3 16.11Shell 数组数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。 与大部分编程语言类似,数组元素的下标由 0 开始。 16.11.1定义数组 Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下: array_name=(value1 value2 ... valuen) 实例 my_array=(A B "C" D) 我们也可以使用下标来定义数组: array_name[0]=value0 array_name[1]=value1 array_name[2]=value2 16.11.2读取数组 读取数组元素值的一般格式是: ${array_name[index]} 实例 my_array=(A B "C" D) ? echo "第一个元素为: ${my_array[0]}" echo "第二个元素为: ${my_array[1]}" echo "第三个元素为: ${my_array[2]}" echo "第四个元素为: ${my_array[3]}" 执行脚本,输出结果如下所示: $ chmod +x test.sh $ ./test.sh 第一个元素为: A 第二个元素为: B 第三个元素为: C 第四个元素为: D 16.11.3获取数组中的所有元素 使用@ 或 * 可以获取数组中的所有元素,例如: my_array[0]=A my_array[1]=B my_array[2]=C my_array[3]=D ? echo "数组的元素为: ${my_array[*]}" echo "数组的元素为: ${my_array[@]}" 执行脚本,输出结果如下所示: $ chmod +x test.sh $ ./test.sh 数组的元素为: A B C D 数组的元素为: A B C D 16.11.4获取数组的长度 获取数组长度的方法与获取字符串长度的方法相同,例如: my_array[0]=A my_array[1]=B my_array[2]=C my_array[3]=D ? echo "数组元素个数为: ${#my_array[*]}" echo "数组元素个数为: ${#my_array[@]}" 执行脚本,输出结果如下所示: $ chmod +x test.sh $ ./test.sh 数组元素个数为: 4 数组元素个数为: 4 16.12Shell 基本运算符Shell 和其他编程语言一样,支持多种运算符,包括:
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。 expr 是一款表达式计算工具,使用它能完成表达式的求值操作。 例如,两个数相加(注意使用的是反引号 *`* 而不是单引号 *'*): 16.12.1算术运算符 下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。 实例.算术运算符实例如下: a=10 b=20 #加 val=`expr $a + $b` echo "a + b : $val" #减 val=`expr $a - $b` echo "a - b : $val" #乘 val=`expr $a \* $b` echo "a * b : $val" #除 val=`expr $b / $a` echo "b / a : $val" #取模 val=`expr $b % $a` echo "b % a : $val" ? if [ $a == $b ] then echo "a 等于 b" fi if [ $a != $b ] then echo "a 不等于 b" fi 执行脚本,输出结果如下所示: a + b : 30 a - b : -10 a * b : 200 b / a : 2 b % a : 0 a 不等于 b
16.12.2关系运算符 关系运算符只支持数字,不支持字符串,除非字符串的值是数字。 下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
实例.关系运算符实例如下: a=10 b=20 if [ $a -eq $b ] then echo "$a -eq $b : a 等于 b" else echo "$a -eq $b: a 不等于 b" fi if [ $a -ne $b ] then echo "$a -ne $b: a 不等于 b" else echo "$a -ne $b : a 等于 b" fi if [ $a -gt $b ] then echo "$a -gt $b: a 大于 b" else echo "$a -gt $b: a 不大于 b" fi if [ $a -lt $b ] then echo "$a -lt $b: a 小于 b" else echo "$a -lt $b: a 不小于 b" fi if [ $a -ge $b ] then echo "$a -ge $b: a 大于或等于 b" else echo "$a -ge $b: a 小于 b" fi if [ $a -le $b ] then echo "$a -le $b: a 小于或等于 b" else echo "$a -le $b: a 大于 b" fi 执行脚本,输出结果如下所示: 10 -eq 20: a 不等于 b 10 -ne 20: a 不等于 b 10 -gt 20: a 不大于 b 10 -lt 20: a 小于 b 10 -ge 20: a 小于 b 10 -le 20: a 小于或等于 b 16.12.3布尔运算符 下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
实例.布尔运算符实例如下: a=10 b=20 ? if [ $a != $b ] then echo "$a != $b : a 不等于 b" else echo "$a == $b: a 等于 b" fi if [ $a -lt 100 -a $b -gt 15 ] then echo "$a 小于 100 且 $b 大于 15 : 返回 true" else echo "$a 小于 100 且 $b 大于 15 : 返回 false" fi if [ $a -lt 100 -o $b -gt 100 ] then echo "$a 小于 100 或 $b 大于 100 : 返回 true" else echo "$a 小于 100 或 $b 大于 100 : 返回 false" fi if [ $a -lt 5 -o $b -gt 100 ] then echo "$a 小于 5 或 $b 大于 100 : 返回 true" else echo "$a 小于 5 或 $b 大于 100 : 返回 false" fi 执行脚本,输出结果如下所示: 10 != 20 : a 不等于 b 10 小于 100 且 20 大于 15 : 返回 true 10 小于 100 或 20 大于 100 : 返回 true 10 小于 5 或 20 大于 100 : 返回 false 16.12.4逻辑运算符 以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
实例.逻辑运算符实例如下: a=10 b=20 ? if [[ $a -lt 100 && $b -gt 100 ]] then echo "返回 true" else echo "返回 false" fi ? if [[ $a -lt 100 || $b -gt 100 ]] then echo "返回 true" else echo "返回 false" fi 执行脚本,输出结果如下所示: 返回 false 返回 true 16.12.5字符串运算符 下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":
实例.字符串运算符实例如下: a="abc" b="efg" ? if [ $a = $b ] then echo "$a = $b : a 等于 b" else echo "$a = $b: a 不等于 b" fi if [ $a != $b ] then echo "$a != $b : a 不等于 b" else echo "$a != $b: a 等于 b" fi if [ -z $a ] then echo "-z $a : 字符串长度为 0" else echo "-z $a : 字符串长度不为 0" fi if [ -n "$a" ] then echo "-n $a : 字符串长度不为 0" else echo "-n $a : 字符串长度为 0" fi if [ $a ] then echo "$a : 字符串不为空" else echo "$a : 字符串为空" fi 执行脚本,输出结果如下所示: abc = efg: a 不等于 b abc != efg : a 不等于 b -z abc : 字符串长度不为 0 -n abc : 字符串长度不为 0 abc : 字符串不为空 16.13Shell echo命令Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式:
您可以使用echo实现更复杂的输出格式控制。 16.13.1.显示普通字符串:
这里的双引号完全可以省略,以下命令与上面实例效果一致:
16.13.2.显示转义字符
结果将是:
同样,双引号也可以省略 16.13.3.显示变量? read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量 #!/bin/sh read name echo "$name It is a test" 以上代码保存为 test.sh,name 接收标准输入的变量,结果将是: [root@www ~]# sh test.sh OK ? ? ? ? ? ? ? ? ? ? #标准输入 OK It is a test ? ? ? #输出 16.13.4.显示换行 echo -e "OK! \n" # -e 开启转义 echo "It is a test" 输出结果: OK! ? It is a test 16.13.5.显示不换行 #!/bin/sh echo -e "OK! \c" # -e 开启转义 \c 不换行 echo "It is a test" 输出结果: OK! It is a test 16.13.6.显示结果定向至文件 echo "It is a test" > myfile 16.13.7.原样输出字符串,不进行转义或取变量(用单引号)
输出结果: $name\" 16.13.8.显示命令执行结果
注意: 这里使用的是反引号 `, 而不是单引号 '。 结果将显示当前日期 Thu Jul 4 10:08:46 CST 2021 16.14Shell printf 命令printf 命令模仿 C 程序库(library)里的 printf() 程序。 printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。 printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认的 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。 printf 命令的语法: printf format-string [arguments...] 参数说明:
接下来,我来用一个脚本来体现 printf 的强大功能: 实例 printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg ? printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 执行脚本,输出结果如下所示: 姓名 ? ? 性别 ? 体重kg 郭靖 ? ? 男 ? ? 66.12 杨过 ? ? 男 ? ? 48.65 郭芙 ? ? 女 ? ? 47.99 %s %c %d %f 都是格式替代符,
16.15Shell test 命令Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。 16.15.1数值测试
16.15.2字符串测试
16.16Shell 流程控制和 Java、PHP 等语言不一样,sh 的流程控制不可为空,如(以下为 PHP 流程控制写法): 16.16.1 if else 16.16.1.1 fi if 语句语法格式: if condition then ? command1 ? command2 ? ... ? commandN fi 写成一行(适用于终端命令提示符):
末尾的 fi 就是 if 倒过来拼写,后面还会遇到类似的。 16.16.1.2 if else if else 语法格式:
16.16.1.3 if else-if else if else-if else 语法格式:
以下实例判断两个变量是否相等: 16.16.2 for 循环 与其他编程语言类似,Shell支持for循环。 for循环一般格式为:
写成一行:
当变量值在列表里,for 循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的 shell 命令和语句。in 列表可以包含替换、字符串和文件名。 in列表是可选的,如果不用它,for循环使用命令行的位置参数。 16.16.3 while 语句 while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。其语法格式为:
while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。 16.16.4 无限循环 无限循环语法格式:
或者
或者
16.16.5 until 循环 until 循环执行一系列命令直至条件为 true 时停止。 until 循环与 while 循环在处理方式上刚好相反。 一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。 until 语法格式:
condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。 16.16.6 case ... esac case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。 可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。 case ... esac 语法格式如下:
case 工作方式如上所示,取值后面必须为单词 in,每一模式必须以右括号结束。取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。 取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。 16.16.7 跳出循环 在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。 16.16.7.1 break命令 break命令允许跳出所有循环(终止执行后面的所有循环)。 16.16.7.2 continue continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。 16.17 Shell 函数linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。 shell中函数的定义格式如下:
说明:
函数返回值在调用该函数后通过 $? 来获得。 注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。 16.17.1 函数参数 在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...
16.18 Shell 输入/输出重定向大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。 重定向命令列表如下:
16.18.1 输出重定向 重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示: command1 > file1 上面这个命令执行command1然后将输出的内容存入file1。 注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。 16.18.2 输入重定向 和输出重定向一样,Unix 命令也可以从文件获取输入,语法为: command1 < file1 这样,本来需要从键盘获取输入的命令会转移到文件读取内容。 注意:输出重定向是大于号(>),输入重定向是小于号(<)。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 19:42:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |