LINUX

文章目录

一、 初识Linux

1、 操作系统

(1)操作系统:(Operating System,简称OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。

(2)操作系统需要处理:

  • 管理与配置内存。

  • 决定系统资源供需的优先次序。

  • 控制输入设备与输出设备。

  • 操作网络与管理文件系统等基本事务。

  • 操作系统也提供一个让用户与系统交互的操作界面。

(3)主流操作系统按照应用领域的划分

① 桌面操作系统

  • Window 系列:用户群体大
  • macOS:细节处理的更好, 没有windows软件丰富, 价格高
  • Linux:应用软件少

② 服务器操作系统

  • Linux:安全、稳定、免费。占有率高

  • Windows Server:付费,占有率低

在这里插入图片描述

③ 嵌入式操作系统: Linux

④ 移动设备操作系统

  • IOS
  • Android (基于Linux)
  • 华为鸿蒙(基于linux)

在这里插入图片描述

2、 Linux发展历程

1984年,Andrew S.Tanenbaum 开发了用于教学的Unix系统,命名为Minix,但是仅仅用于教学
1989年,Andrew S.Tanenbaum将Minix系统运行于x86的pc平台
1990年,芬兰赫尔辛基大学学生Linus Torvalds首次接触Minix系统
1991年,Linus Torvalds开始在Minix上编写各种驱动程序等操作系统内核组件
1991年年底,Linus Torvalds公开了Linux内核源码0.02版,仅仅是内核
1994年,Linux 1.0版本发行,Linux转向GPL版权协议
至此,Linux开始盛行开来…

3、 Linux简介

例如:新浪、百度、淘宝等互联网公司,他们使用的服务器全都是Linux系统;全球500强企业95%的服务器使用的都是Linux系统。

(1) 什么是 Linux

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

(2) Linux的特点

基本思想

Linux的基本思想有两点:

第一:一切都是文件

第二:每个软件都有确定的用途

其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令硬件软件设备、操作系统进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。至于说Linux是基于Unix的,很大程度上也是因为这两者的基本思想十分相近

完全免费

Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变,这让Linux吸收了无数程序员的精华,不断壮大。

完全兼容POSIX1.0标准

这使得可以在Linux下通过相应的模拟器运行常见的DOSWindows的程序。这为用户从Windows转到Linux奠定了基础。许多用户在考虑使用Linux时,就想到以前在Windows下常见的程序是否能正常运行,这一点就消除了他们的疑虑。

多用户、多任务

Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。多任务则是现在电脑最主要的一个特点,Linux可以使多个程序同时并独立地运行。

良好的界面

Linux同时具有字符界面和图形界面。在字符界面用户可以通过键盘输入相应的指令来进行操作。它同时也提供了类似Windows图形界面的X-Window系统,用户可以使用鼠标对其进行操作。在X-Window环境中就和在Windows中相似,可以说是一个Linux版的Windows。

支持多种平台

Linux可以运行在多种硬件平台上,如具有x86、680x0、SPARC、Alpha等处理器的平台。此外Linux还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上。2001年1月份发布的Linux 2.4版内核已经能够完全支持Intel64位芯片架构。同时Linux也支持多处理器技术。多个处理器同时工作,使系统性能大大提高。

优点

1)Linux由众多微内核组成,其源代码完全开源;

2)Linux继承了Unix的特性,具有非常强大的网络功能,其支持所有的因特网协议,包括TCP/IPv4TCP/IPv6和链路层拓扑程序等,且可以利用Unix的网络特性开发出新的协议栈;

3)Linux系统工具链完整,简单操作就可以配置出合适的开发环境,可以简化开发过程,减少开发中仿真工具的障碍,使系统具有较强的移植性;

4、 Linux和Unix区别

1、开源情况

Unix 是商业化的,而 Linux 是开源的,是免费、公开源代码的。

2、硬件适用

Unix 系统大多是与硬件配套的,也就是说,大多数Unix系统如AIX、HP-UX等是无法安装在 x86 服务器和个人计算机上的,而 Linux则可以运行在多种硬件平台上。

可以先学习Linux后再学习Unix,因为Linux可以方便的在虚拟机上运行,防止新手的误操作。

3、本质不同

Linux是开放源代码的自由软件,用户对前者有很高的自主权,在实际的的开发是处在一个完全开放的环境之中;

而Unix是对源代码实行知识产权保护的传统商业软件,用户的开发完全是处在一个黑箱之中,只有相关的开发人员才能够接触的产品的原型;

Unix 诞生于 20 世纪 60 年代末,Windows 诞生于 20 世纪 80 年代中期,Linux 诞生于 20 世纪 90 年代初,可以说 Unix是操作系统中的"老大哥",后来的 Windows 和 Linux 都参考了 Unix

5、 Linux和Windows区别

目前国内 Linux 更多的是应用于服务器上,而桌面操作系统更多使用的是 Windows。主要区别如下

比较WindowsLinux
界面界面统一,外壳程序固定所有 Windows 程序菜单几乎一致,快捷键也几乎相同图形界面风格依发布版不同而不同,可能互不兼容。GNU/Linux 的终端机是从 Unix传承下来,基本命令和操作方法也几乎一致。
驱动程序驱动程序丰富,版本更新频繁。默认安装程序里面一般包含有该版本发布时流行的硬件驱动程序,之后所出的新硬件驱动依赖于硬件厂商提供。对于一些老硬件,如果没有了原配的驱动有时很难支持。另外,有时硬件厂商未提供所需版本的 Windows 下的驱动,也会比较头痛。由志愿者开发,由 Linux 核心开发小组发布,很多硬件厂商基于版权考虑并未提供驱动程序,尽管多数无需手动安装,但是涉及安装则相对复杂,使得新用户面对驱动程序问题(是否存在和安装方法)会一筹莫展。但是在开源开发模式下,许多老硬件尽管在Windows下很难支持的也容易找到驱动。HP、Intel、AMD 等硬件厂商逐步不同程度支持开源驱动,问题正在得到缓解。
使用使用比较简单,容易入门。图形化界面对没有计算机背景知识的用户使用十分有利。图形界面使用简单,容易入门。文字界面,需要学习才能掌握。
学习系统构造复杂、变化频繁,且知识、技能淘汰快,深入学习困难。系统构造简单、稳定,且知识、技能传承性好,深入学习相对容易。
软件每一种特定功能可能都需要商业软件的支持,需要购买相应的授权。大部分软件都可以自由获取,同样功能的软件选择较少。

Windows与Linux在其他方面的不同

开放性

所谓的开放性就是Linux 操作系统是开放源码系统,可以对其程序进行编辑修改。而微软的Windows 系统是受微软版权保护,就是只能微软内部进行开发及修改。

文件格式不同

Windows 操作系统内核是NT,而Linux 是 shell;

另外,windows 硬盘文件格式是fat32或NTFS,而Linux 需要的文件格式是ext2或ext3,该操作系统还多一个SWAP格式的交换分区

免费与收费

在中国,对个人用户Windows 和Linux 都是免费的,对公用户Windows 需要收费,Linux 是免费的。

技术支持

Windows 较普及。Linux 需要深度的Linux 版块支持。

安全性

Linux 相对Windows 来说安全性更高。

开源

开源就是指对外部开放软件源代码。Linux 开源,而Windows并不开源。

使用习惯

Windows 放弃了dos的字符模式,主攻图形界面,让桌面系统更易用。Linux 字符模式运行的更好,图形界面还只是附带品,可有可无。

软件与支持

Windows 下可以运行绝大部分软件、玩99.999%的游戏、硬件厂商近乎100%的支持。Linux 下可直接运行的软件数量和win下比起来就是1和99的区别,而且目前选择Linux 的人基本不会考虑玩游戏,同时Linux 正期待更多硬件厂商的支持

6、 Linux发行商和常见发行版

Linux发行版是由个人,自由组织,以及商业机构和志愿者组织编写。它们通常包括了其他的系统软件和应用软件,以及一个用来简化系统初始安装的安装工具,和让软件安装升级的集成管理器。大多数系统还包括了像提供GUI界面的XFree86之类的曾经运行于BSD的程序。
一个典型的Linux发行版包括:Linux内核,一些GNU程序库和工具,命令行shell,图形界面的桌面环境,如KDE或GNOME,并包含数千种从办公套件,编译器,文本编辑器到科学工具的应用软件

Linux发行版的某些版本是不需要安装,只需通过CD或者可启动的USB存储设备就能使用的版本,他们称为LiveCD。

在这里插入图片描述

Linux的版本号分为两部分:内核版本和发行版本

1.Linux的内核版本
内核版本指的是在Linus Torvalds领导下的开发小组开发出的系统内核的版本号,通常,内核版本号的第二位是偶数表示是稳定的版本,如2.6.25;是奇数表示有一些新的东西加入,是不稳定的测试版本,如2.5.6。Linux操作系统的核心就是它的内核,Linus Torvalds和他的小组在不断地开发和推出新内核。

任务:进程调度、内存管理、配置管理虚拟文件系统、提供网络接口以及支持进程间通信。像所有软件一样,Linux的内核也在不断升级。

2.Linux的发行版本
一个完整的操作系统不仅仅只有内核,还包括一系列为用户提供各种服务的外围程序。外围程序包括GNU程序库和工具,命令行shell,图形界面的X Window系统和相应的桌面环境,如KDE或GNOME,并包含数千种从办公套件,编译器,文本编辑器到科学工具的应用软件。所以,许多个人、组织和企业,开发了基于GNU/Linux的Linux发行版,他们将Linux系统的内核与外围应用软件和文档包装起来,并提供一些系统安装界面和系统设置与管理工具, 这样就构成了一个发行版本。
实际上,Linux的发行版本就是Linux内核再加上外围的实用程序组成的一个大软件包而已。相对于操作系统内核版本,发行版本的版本号是随发布者的不同而不同,与Linux系统内核的版本号是相对独立的,例如:RedHat EnterpriseLinux 5.2的操作系统内核是Linux-2.6.18。
Linux的发行版本大体可以分为两类:

一类是商业公司维护的发行版本

一类是社区组织维护的发行版本,前者以著名的RedHatLinux为代表,后者以Debian为代表

以下为Linux的主流版本:

目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等

assets

以下是主要的发行版本

需要注意的:
下面的内容主要是介绍了下Linux发行家族以及发行版本的一些详细信息,虽然我们当前的课程讲解的是CentOS,但是其他的一些发行商、主流的发行版本比如Ubuntu、Redhat也需要让学生多多了解下,毕竟这是Linux体系内产品线
注意
下面的文字虽然很多,但是只要让学生知道有这么回事即可
在下面会简单的总结..

1、Debian 介绍

Debian名字的由来----DebianGNU/Linux是由一个叫做伊恩·默多克(IanMurdock)在1993年发起的,他的名字以Ian开头,他太太的名字Debra开头三个字母是Deb。

Debian是社区类Linux的典范,是迄今为止最遵循GNU规范的Linux系统。Debian最早由 Ian Murdock于1993年创建,分为三个版本分支: stable(服务器版), testing(稳定版) 和unstable(测试版)。

2、Ubuntu介绍

Ubuntu严格来说不能算一个独立的发行版本,Ubuntu是基于Debian的unstable版本加强而来,可以这么说,Ubuntu就是一个拥有Debian所有的优点,以及自己所加强的优点的近乎完美的 Linux桌面系统。

共分三个版本:

  • 基于Gnome的Ubuntu,
  • 基于KDE的Kubuntu以。
  • 基于Xfc的 Xubuntu。

特点是界面非常友好,容易上手,对硬件的支持非常全面,是最适合做桌面系统的Linux发行版本。稳定性,其实都差不多,难易度嘛,

Ubuntu 默认桌面环境采用 GNOME,一个 Unix和 Linux 主流桌面套件和开发平台。

Ubuntu的版本和发布号
Ubuntu的版本号是由该次发布的年份和月份组成,并未反映其实际版本。我们的首次发布是在2004年10月,因此该版本为4.10。当前版本(DapperDrake)于2006年6月发布,因此版本号为6.06 LTS。

3、Redhat

可能这是最著名的Linux版本了,Red Hat Linux已经创造了自己的品牌,越来越多的人听说过它。Red Hat在1994年创业,当时聘用了全世界500多名员工,他们都致力于开放的源代码体系。
Red Hat Linux是公共环境中表现上佳的服务器。它拥有自己的公司,能向用户提供一套完整的服务,这使得它特别适合在公共网络中使用。这个版本的Linux也使用最新的内核,还拥有大多数人都需要使用的主体软件包。
Red Hat Linux的安装过程也十分简单明了。它的图形安装过程提供简易设置服务器的全部信息。磁盘分区过程可以自动完成,还可以选择GUI工具完成,即使对于 Linux新手来说这些都非常简单。选择软件包的过程也与其他版本类似;用户可以选择软件包种类或特殊的软件包。系统运行起来后,用户可以从Web站点和 Red Hat那里得到充分的技术支持。我发现Red Hat是一个符合大众需求的最优版本。在服务器和桌面系统中它都工作得很好。Red Hat的唯一缺陷是带有一些不标准的内核补丁,这使得它难于按用户的需求进行定制。 Red Hat通过论坛和邮件列表提供广泛的技术支持,它还有自己公司的电话技术支持,后者对要求更高技术支持水平的集团客户更有吸引力

4、Fedora

Fedora和Redhat这两个Linux的发行版放联系很密切。Redhat 自9.0以后,不再发布桌面版的,而是把这个项目与开源社区合作,于是就有了Fedora 这个 Linux 发行版。Fedora项目是由 Red Hat 赞助,由开源社区与 Red Hat 工程师合作开发的项目统称。Fedora 的目标,是推动自由和开源软件更快地进步。

特点:
1、 Fedora 是一个开放的、创新的、前瞻性的操作系统和平台,基于 Linux。它允许任何人自由地使用、修改和重发布,无论现在还是将来。可运行的体系结构包括x86(即i386),x86_64 和PowerPC!
2、Fedora 可以说是Redhat 桌面版本的延续,只不过是与开源社区合作。

3、Fedora 是一个独立的inux发行版本的操作系统。

5centos

CentOS(Community ENTerprise Operating System)是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用(我会告诉你,以为企业想省钱,运维要靠这个东西来赚钱嘛,国内运维主流是CentOS剩下版本很少)。两者的不同,在于CentOS并不包含封闭源代码软件,CentOS 是一个基于Red Hat Linux 提供的可自由使用源代码的企业级Linux发行版本。每个版本的CentOS都会获得十年的支持(通过安全更新方式)。新版本的 CentOS 大约每两年发行一次,而每个版本的 CentOS 会定期(大概每六个月)更新一次,以便支持新的硬件。这样,建立一个安全、低维护、稳定、高预测性、高重复性的 Linux 环境

6、Slackware介绍

Slackware 由PatrickVolkerding(帕特里克.沃克登)创建于1992年。算起来应当是历史最悠久的Linux发行版。尽管如此,Slackware仍然深入人心(大部分都是比较有经验的 Linux老手)。Slackware稳定、安全,所以仍然有大批的忠实用户。由于Slackware尽量采用原版的软件包而不进行任何修改,所以制造新 bug的几率便低了很多。Slackware的版本更新周期较长(大约1年),但是新版本的软件仍然不间断的提供给用户下载。

7、openSUSE介绍

SUSE是德国最著名的Linux发行版,在全世界范围中也享有较高的声誉。SUSE自主开发的软件包管理系统也大受好评。SUSE于2003年年末被Novell收购。SUSE在收购之后的发布显得比较混乱,比如9.0版本是收费的,而10.0版本(也许由于各种压力)又免费发布。这使得一部分用户感到困惑,也转而使用其它发行版本。最近还跟微软扯到了一起。但是瑕不掩瑜,SUSE仍然是一个非常专业、优秀的发行版。

openSUSE 项目是由Novell公司资助的全球性社区计划,旨在推进 Linux 的广泛使用。这个计划提供免费的openSUSE 操作系统。这里是一个由普通用户和开发者共同构成的社区,我们拥有一个共同的目标—创造世界上最好用的 Linux 发行版。openSUSE 是 Novell 公司发行的企业级 Linux 产品的系统基础。

openSUSE 项目是由Novell 发起的开源社区计划。 旨在推进 Linux 的广泛使用。提供了自由简单的方法来获得世界上最好用的 Linux 发行版,SUSE Linux。openSUSE 项目为 Linux 开发者和爱好者提供了开始使用 Linux 所需要的一切。

8、中国大陆的Linux发行版

红旗Linux(RedflagLinux) ,冲浪Linux(Xteam Linux) ,蓝点Linux , GNU/Linux,OpenDesktop等等 。

9、 台湾地区的Linux发行版

鸿奇Linux

目前最著名的发行版本:Debian,ubuntu、OpenSuse(原Suse)、CentOS、fedora等。国内比较著名的红旗Linux版本

对于上面的知识我们做下重点总结

  • redhat:目前,全球最大的linux发行厂商,功能全面、稳定。
    • RedhatIBM 收购!
  • ubuntu:目前,是linux桌面操作系统做的最好的。
  • centos:免费版的redhat,centos 基于 redhat 发行版基础之上,再重新编译发布的版本。
    • 目前 centos 已经被 Redhat 公司收购,但是依然免费

7、 Linux 应用领域

今天各种场合都有使用各种 Linux 发行版,从嵌入式设备到超级计算机,并且在服务器领域确定了地位。在企业级开发中,我们通常使用Linux作为我们的服务器。

比如:服务器系统Web应用服务器、数据库服务器、接口服务器、DNS、FTP等等;

嵌入式系统路由器、防火墙、手机、PDA、IP 分享器、交换器、家电用品的微电脑控制器等等,高性能运算、计算密集型应用Linux有强大的运算能力。

目前 Linux 不仅在家庭与企业中使用,并且在政府中也很受欢迎

  • 巴西联邦政府由于支持 Linux 而世界闻名。
  • 有新闻报道俄罗斯军队自己制造的 Linux 发布版的,做为 G.H.ost 项目已经取得成果。
  • 印度的 Kerala 联邦计划在向全联邦的高中推广使用 Linux。
  • 中华人民共和国为取得技术独立,在龙芯处理器中排他性地使用 Linux。
  • 在西班牙的一些地区开发了自己的 Linux 发布版,并且在政府与教育领域广泛使用,如 Extremadura 地区的 gnuLinEx 和 Andalusia 地区的 Guadalinex。
  • 葡萄牙同样使用自己的 Linux 发布版 Caixa Mágica,用于 Magalh?es 笔记本电脑和 e-escola 政府软件。
  • 法国和德国同样开始逐步采用 Linux。

8、 Linux之CentOS

前面章节介绍了一些Linux的基本知识,前已经对Linux有了一个初步的认识,也知道了在Linux发行版中有各个家族的发行版本;比如比较知名的ubuntu、CentOS,在今天的Linux课程中我们将采用发行版CentOS作为我们Linux课程的讲解内容。

CentOS,是基于 Red Hat Linux 提供的可自由使用源代码的企业级 Linux 发行版本;是一个稳定,可预测,可管理和可复制的免费企业级计算平台

主要特点:

1.主流: 目前的Linux操作系统主要应用于生产环境,主流企业级Linux系统仍旧是RedHat或者CentOS
2.免费: RedHat 和CentOS差别不大,CentOS是一个基于Red Hat Linux 提供的可自由使用源代码的企业级Linux发行版本
3.更新方便:CentOS独有的yum命令支持在线升级,可以即时更新系统,不像RED HAT那样需要花钱购买支持服务!

我们在当前课程中的环境:

Windows7 , VMware Workstation15.02, CentOS Linux release 7.6.1810

9、 总结

当前章节主要介绍了Linux发行的主要版本(我们使用的是CentOS Linux release 7.6.1810 )、以及与Unix、Windows系统的区别;主要让学生了解Linux是基于Unix的以及与Windows一样,Linux也是操作系统即可。

二、系统与设置命令

1、 学习命令的原因

  • Linux刚面世时并没有图形界面, 所有的操作全靠命令完成, 如 磁盘操作、文件存取、目录操作、进程管理、文件权限 设定等。

  • 在职场中,大量的 服务器维护工作 都是在 远程 通过SSH客户端 来完成的, 并没有图形界面, 所有的维护工作都需要通过命令来完成。

  • Linux发行版本的命令大概有200多个, 但是常用的命令只有几十个而已

  • 不需要死记硬背, 对于常用命令, 记住语法是关键,在用的时候去查下参数选项,有的很常用的命令,用的多自然就记住了

  • 不要尝试一次学会所有的命令, 有些命令是非常不常用的,临时遇到,就去根据语法找参数选项

2、 Linux 用户和用户组管理

(1) Linux账号管理

① 添加用户

使用者权限:管理员用户

格式:useradd 选项 用户名

参数说明:

  • 选项:

    • -c comment 指定一段注释性描述。
    • -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。有默认值。
    • -g 用户组 指定用户所属的用户组。有默认值。
    • -G 用户组,用户组 指定用户所属的附加组。
    • -s Shell文件 指定用户的登录Shell。
    • -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
//添加用户user
[root@localhost ~]# useradd user
[root@localhost ~]# 

useradd 可用来建立用户帐号。帐号建好之后,再用 passwd 设定帐号的密码。只有root用户具有该权限。

[root@localhost ~]# su song		//切换用户:root切换到普通用户不需要输入密码
[song@localhost root]$ su root	//切换用户:普通用户切换到root用户需要输入密码
密码://密码不可见
[root@localhost ~]# 

补充:在密码的地方输入我们的root密码【root】即可进入到root用户下。

② 用户口令(密码)

用户账号刚创建时没有口令,被系统锁定,无法使用,设置密码之后才可以使用。

注意:root用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。

格式:passwd 选项 用户名

可使用的选项:

  • -l 锁定口令,即禁用账号。
  • -u 口令解锁。
  • -d 使账号无口令。
  • -f 强迫用户下次登录时修改口令。

设置当前用户的口令

[root@localhost ~]# passwd user
更改用户 user 的密码 。
新的 密码:(user)
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
③ 修改用户

usermod 命令通过修改系统帐户文件来修改用户账户信息,如用户号、主目录、用户组、登录Shell等。

格式:usermod 选项 用户名
[root@localhost home]# usermod -l users user	//将用户user改为users

以下是usermod常用选项

  -d, --home HOME_DIR           用户的新主目
  -l, --login LOGIN             新的登录名称
  -u, --uid UID                 用户帐号的新 UID
  -U, --unlock                  解锁用户帐号
④ 删除用户

假如账号不再使用,需要从系统中删除。删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。

格式:userdel 选项 用户名
[root@localhost home]# userdel -rf user3	//删除用户user3(包括目录,即使登录)

以下是userdel常用选项

  • -f:强制删除用户,即使用户当前已登录;

  • -r:删除用户的同时,删除与用户相关的所有文件

(2) Linux用户组

为了方便用户管理,提出了组的概念。新建用户,默认属于自己(账户)的组。一个用户有一个或者多个组。

① 增加用户组
格式:groupadd 选项 用户组
  • -g GID 指定新用户组的组标识号(GID)。
  • -o 一般与-g选项同时使用,允许创建有重复的GID
  • -f 如果新组已存在则成功退出
[root@localhost home]# groupadd usergroup	//新增用户组usergroup

上面的命令向系统中增加了一个新组usergroup,新组的组标识号是在当前已有的最大组标识号的基础上加1

② 修改用户组

使用者权限:管理员用户

groupmod 选项 用户组

常用的选项有:

  • -g GID 为用户组指定新的组标识号。
  • -o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
  • -n 改组名
[root@localhost etc]# groupmod -n groupuser usergroup	//将组usergroup改为groupuser
③ 查询用户所属组

要查询一个用户属于哪个用户组,使用groups命令,其格式如下

groups 用户名	//查询用户属于哪个组
[root@localhost etc]# groups user//查询用户user属于哪个组,默认属于user组
user : user
④ 删除用户组

要删除一个已有的用户组,使用groupdel命令,其格式如下

groupdel 用户组

删除kaifazu用户组

[root@localhost etc]# groupdel kaifazu	//删除开发组
[root@localhost etc]# cat /etc/group	//查询linux组文件

(3) 将用户添加到组

gpasswd ,用于将一个用户添加到组或者从组中删除。

格式:gpasswd [可选项] 组名
  • -a, --add USER 向组 GROUP 中添加用户 USER
  • -d, --delete USER 从组 GROUP 中添加或删除用户
  • -r, --delete-password remove the GROUP’s password

新建一个组,新建三个用户将用户添加到组中

[root@localhost etc]# groupadd -g 8888 kaifazu	//添加一个开发组,组id为8888
[root@localhost etc]# useradd user1		//创建用户user1,user2,user3
[root@localhost etc]# useradd user2
[root@localhost etc]# useradd user3
[root@localhost etc]# gpasswd -a user1 usergroup
正在将用户“user1”加入到“usergroup”组中
[root@localhost etc]# gpasswd -a user2 usergroup
正在将用户“user2”加入到“usergroup”组中
[root@localhost etc]# gpasswd -a user3 usergroup
正在将用户“user3”加入到“usergroup”组中
[root@localhost etc]# 

gpasswd:是 Linux 下工作组文件 /etc/group(组名) 和 /etc/gshadow(组密码) 管理工具。

(4) 查看用户组下所有用户(所有用户)

方式1:此处的grep命令我们将在文件管理章节详细讲解,这里先使用它查看下效果

[root@localhost etc]# grep 'usergroup' /etc/group	//查询usergroup组中的用户
usergroup:x:1001:user1,user2,user3

方式2:执行效果如下(或者直接打开/etc/group文件都可以)

[root@localhost etc]# cat /etc/group
...
user1:x:1003:
user2:x:1004:
user:x:1006:
kaifazu:x:8888:
user3:x:1005:
usergroup:x:1001:user1,user2,user3

3、 系统管理

(1) 日期管理

date命令:可以用来显示或设定系统的日期与时间

date [参数选项]

常用的选项有:

-d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号;
-s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号;
-u:显示GMT;

shell演示:

[root@localhost etc]# date -s "2019-12-11 16:15:00"	//用-s选项可以设置系统时间
					
[root@localhost etc]# date		//显示时间
2020年 11月 23日 星期一 19:41:01 CST

[root@localhost etc]# date -u	//显示GMT时间
2020年 11月 23日 星期一 11:41:01 UTC	
[root@localhost etc]# 

① UTC 协调世界时,又称世界统一时间、世界标准时间、国际协调时间。

② GMT格林尼治 平太阳时间,是指格林尼治所在地的标准时间,也是表示地球自转速率的一种形式

③ CST北京时间 (中国国家标准时间)

④ 东八区东八区(UTC/GMT+08:00)是比世界协调时间(UTC)/格林尼治时间(GMT)快8小时的时区,

(2) 显示用户

logname命令用于显示目前用户的名称。

语法为如下:

[root@localhost etc]# logname
root

(3) su切换账户

su命令用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码。

[song@localhost root]$ su -c ls root	//将用户切换到root,执行ls展示出来,再切换到用户song
密码:
anaconda-ks.cfg  initial-setup-ks.cfg 
公共  模板  视频  图片  文档  下载  音乐  桌面

(4) id命令

查看当前用户的所有详细信息,比如用户id、群组id以及所属组

格式:id [-gGnru][--help][--version][用户名称]

显示当前用户信息

[song@localhost root]$ id
uid=1000(song) gid=1000(song)=1000(song),10(wheel) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023    

(5) sudo执行

提高普通用户的操作权限(普通用户使用root用户权限来执行命令),使用者权限:普通用户

[song@localhost root]$ sudo cat /etc/shadow		//song用户使用root权限查询
[sudo] song 的密码:
root:$6$tYmQl.CgICeGzxdR$/NyoeYnHcQR2IEwLroIghUvTR2xrahFwenZ0Jz/4zwyfmvPpllFOE7XI0gJll771w83jhSC/M.g60tQOdsp9l0::0:99999:7:::
·····
    ····
song:$6$TGnGxCBkOp62.IaQ$T9qdsqNkZ4ZcFTAe4kTuSeBQQPCn0Z1v8A2U4tXb25Jdf7w/InzKJ0OOnypB8oUc7Ah9VdbgZ4h0.3JHEGIny/:18589:0:99999:7:::
user1:!!:18589:0:99999:7:::
user2:!!:18589:0:99999:7:::
user3:!!:18589:0:99999:7:::

举例:修改网卡配置文件

比如,我们使用普通用户修改网卡的配置文件,在进行保存的时候,提示我们【无法打开并写入文件】,那么此时,我们可以通过sudo命令来提升自己的写入权限

那么我们在修改上面的 命令,使用sudo进行修改

sudo   vi /etc/sysconfig/network-scripts/ifcfg-ens33 


[root@localhost ~]# su song
[song@localhost root]$ sudo   vi /etc/sysconfig/network-scripts/ifcfg-ens33 
[sudo] song 的密码:
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="3735acf8-2f45-44bd-9bc9-8b8a52d315bd"
DEVICE="ens33"
ONBOOT="yes"
~
~

"/etc/sysconfig/network-scripts/ifcfg-ens33" 15L, 310C

(6) top命令

查看服务器上运行的程序占用的CPU情况以及占用内存情况,目的就是检测我们的程序是否在正常范围内运行

top命令用于实时显示 process 的动态。使用权限:所有使用者。

① 显示进程信息

格式:top
[song@localhost network-scripts]$ top
   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                 
  9177 root      20   0  566920  12476   5568 S  1.0  0.7   0:35.51 vmtoolsd                                 
 12908 user      20   0  566876  11972   5192 S  0.7  0.6   0:24.39 vmtoolsd                                 
 15617 song      20   0  162144   2456   1596 R  0.7  0.1   0:00.02 top                                     
     1 root      20   0  193812   5032   3104 S  0.0  0.3   0:05.91 systemd                                

② 显示完整命令,与top命令不同的就是command属性像是进行了命令补全

格式:top -c
[song@localhost network-scripts]$ top -c  
   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                 
 15669 song      20   0  162176   2560   1680 R  1.3  0.1   0:00.23 top -c                                   
  9177 root      20   0  566920  12476   5568 S  0.3  0.7   0:36.59 /usr/bin/vmtoolsd -n vmusr               
 12908 user      20   0  566876  11972   5192 R  0.3  0.6   0:25.45 /usr/bin/vmtoolsd -n vmusr               
 14544 root      20   0       0      0      0 S  0.3  0.0   0:01.49 [kworker/0:1]                           
     1 root      20   0  193812   5032   3104 S  0.0  0.3   0:05.94 /usr/lib/systemd/

③ 显示指定的进程信息,以下显示进程号为14544的进程信息,CPU、内存占用率等

格式: top -p pid
[song@localhost network-scripts]$ top -p 14544
   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                 
 14544 root      20   0       0      0      0 S  0.0  0.0   0:01.62 kworker/0:1     

(7) ps命令

Linux ps命令用于显示当前进程 (process) 的状态信息。使用者权限:所有用户

语法如下:

[song@localhost network-scripts]$ ps
[song@localhost network-scripts]$ ps -A 		//显示进程信息
[song@localhost network-scripts]$ ps -u user1	//显示指定用户信息
[song@localhost network-scripts]$ ps -ef 		//显示所有进程信息 

(8) kill命令

Linux kill命令用于删除执行中的程序或工作(可强制中断)。使用者权限:所有用户

语法如下:

kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]

参数说明

  • -l <信息编号>  若不加<信息编号>选项,则-l参数会列出全部的信息名称。
  • -s <信息名称或编号>  指定要送出的信息。
  • [程序]  [程序]可以是程序的PID或是PGID,也可以是工作编号。
kill 15642			//杀死一个进程
kill -KILL 15642	//强制杀死进程
kill -9 15642		//彻底杀死进程

//杀死指定用户所有进程
kill -u user1					//直接杀死user1用户线程
kill -9 $(ps -ef | grep itcast) //过滤出itcast用户进程 (常用)

(9) 关机命令

shutdown命令可以用来进行关闭系统,并且在关机以前传送讯息给所有使用者正在执行的程序,shutdown 也可以用来重开机。使用者权限:管理员用户

语法如下:

shutdown [-t seconds] [-rkhncfF] time [message]

立即关机

shutdown //默认一分钟后关机
shutdown +1 "1分钟以后关机"
shutdown –r +1 “1分钟后关机重启”

shutdown -c	//取消关机

shutdown -h now	//设置立即关机

(10) 重启命令

reboot命令用于用来重新启动计算机

使用者权限:管理员、普通(需要验证)用户

语法如下:

reboot [-n] [-w] [-d] [-f] [-i]

参数

  • -n : 在重开机前不做将记忆体资料写回硬盘的动作
  • -w : 并不会真的重开机,只是把记录写到 /var/log/wtmp 档案里
  • -d : 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d)
  • -f : 强迫重开机,不呼叫 shutdown 这个指令
  • -i : 在重开机之前先把所有网络相关的装置先停止

开始重新启动

reboot

此时我们的虚拟机正在重启**(别忘记使用root用户执行)**

(11) who命令

who命令用于显示系统中有哪些使用者正在上面,显示的资料包含了使用者 ID、使用的终端机、从哪边连上来的、上线时间、呆滞时间、CPU 使用量、动作等等

语法如下:

who - [husfV] [user]

参数说明

  • -H 或 --heading:显示各栏位的标题信息列;
  • -i 或 -u 或 --idle:显示闲置时间,若该用户在前一分钟之内有进行任何动作,将标示成"."号,如果该用户已超过24小时没有任何动作,则标示出"old"字符串;
  • -m:此参数的效果和指定"am i"字符串相同;
  • -q 或–count:只显示登入系统的帐号名称和总人数;
  • -s:此参数将忽略不予处理,仅负责解决who指令其他版本的兼容性问题;
  • -w 或-T或–mesg或–message或–writable:显示用户的信息状态栏;

显示当前登录系统的用户

[song@localhost root]$ who
root     :0           2020-11-23 23:15 (:0)
root     pts/0        2020-11-23 23:17 (:0)
root     pts/1        2020-11-23 23:19 (192.168.85.1)
[song@localhost root]$ who -H
名称   线路       时间           备注
root     :0           2020-11-23 23:15 (:0)
root     pts/0        2020-11-23 23:17 (:0)
root     pts/1        2020-11-23 23:19 (192.168.85.1)
[song@localhost root]$ 

由上图可知,截止到现在只有itcast在线。

(12) timedatectl命令

timedatectl是用于控制系统时间和日期。用来查询和更改系统时钟于设定,同时可以设定和修改时区信息。在实际开发过程中,系统时间的显示会和实际出现不同步;我们一般为了校正服务器时间、时区的时候会使用timedatectl命令。

使用者权限:所有使用者都可使用,设置时间需要管理员,下面会标注。

几个常见的概念,进行总结如下:

assets

显示系统的当前时间和日期,使用命令行中的timedatectl命令

执行效果如下

[root@localhost 桌面]# timedatectl 
或者
[root@localhost ~]# timedatectl status
      Local time: 一 2020-11-23 16:14:31 CST//北京时间
  Universal time: 一 2020-11-23 08:14:31 UTC//世界标准时间
        RTC time: 一 2020-11-23 08:14:31//主板上的时间
       Time zone: Asia/Shanghai (CST, +0800)//时区
     NTP enabled: no//NTP协议并没有开启
NTP synchronized: no//NTP没有开始同步
 RTC in local TZ: no
      DST active: n/a    

查看当前时区

[song@localhost root]$ timedatectl | grep Time
       Time zone: Asia/Shanghai (CST, +0800)

查看所有可用的时区

[song@localhost root]$ timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau
...
Africa/Gaborone
Africa/Harare
Africa/Johannesburg

设置本地时区

timedatectl set-timezone "Asia/Shanghai"

启用时间同步

NTP即Network Time Protocol(网络时间协议),是一个互联网协议,用于同步计算机之间的系统时钟。timedatectl实用程序可以自动同步你的Linux系统时钟到使用NTP的远程服务器。

禁用时间同步(使用管理员账户)

timedatectl set-ntp false
再执行
timedatectl set-time "2019-03-11 20:45:00"

注意: 如果ntp时间同步为true时无法修改时间设定,下面马上介绍

打开ntp启用时间同步

timedatectl set-ntp true
再执行
timedatectl set-time "2019-03-11 20:45:00"//报错信息

(13) clear命令

clear命令用于清除屏幕

clear    //通过执行clear命令,就可以把缓冲区的命令全部清理干净了

(14) exit命令

exit命令用于退出目前的shell

(15)切换shell快捷键:

Ctrl+Alt+F1、Ctrl+Alt+F3

三、Linux目录管理

1、 Linux 文件与目录管理

在Linux系统中,所有目录结构为树状结构,最顶级的目录为根目录 /。

目录常用命令

  • ls: 列出目录
  • cd: 切换目录
  • pwd: 显示目前的目录
  • mkdir:创建一个新的目录
  • rmdir:删除一个空的目录
  • cp: 复制文件或目录
  • rm: 移除文件或目录
  • mv: 移动文件与目录或修改文件与目录的名称

自动补全

  • 在敲出 文件/ 目录 / 命令 的前几个字母之后, 按下 tab
  • 如果还存在其他 文件 / 目录 / 命令, 再按一下tab键, 系统会提示可能存在的命令
1) ls (列出目录)

注意: ls 命令算是比较常用的命令。所有使用者都可使用。

格式:ls [选项]  目录名称

选项与参数:

  • -a :全部的文件,连同隐藏文件。
  • -d :仅列出目录本身,而不是列出目录内的文件数据(常用)
  • -l :长数据串列出,包含文件的属性与权限等等数据;(常用)

将根目录下的所有文件列出来(含属性与隐藏档)

[root@localhost home]# ls	显示不隐藏的文件与文件夹
song  user  user1  user2  user3
[root@localhost home]# 

[root@localhost home]# ls -l	显示不隐藏的文件与文件夹的详细信息
drwx------. 16 song  song  4096 11月 23 23:35 song

[root@localhost home]# ls -al	显示所有文件与文件夹的详细信息
drwxr-xr-x.  7 root  root    69 11月 23 19:03 .
dr-xr-xr-x. 17 root  root   224 11月 23 12:02 ..
drwx------. 16 song  song  4096 11月 23 23:35 song

ls -l 详细信息, 从左到右 依次是:

  • 权限(A区域), 第一个字符如果是 d 表示目录
  • 硬链接数(B区域), 通俗的讲就是有多少种方式, 可以访问当前目录和文件
  • 属主(C区域), 文件是所有者、或是叫做属主
  • 属组(D区域), 文件属于哪个组
  • 大小(E区域):文件大小
  • 时间(F区域):最后一次访问时间
  • 名称(G区域):文件的名称
2) pwd显示当前目录

pwd 是 Print Working Directory 的缩写,也就是显示目前所在当前目录的命令。

使用者权限:所有使用者都可使用。

查看当前所在目录

[root@localhost song]# pwd
/home/song
[root@localhost song]# pwd -P
/home/song
3) cd (切换目录)

注意: cd 命令算是比较常用的命令,cd是Change Directory的缩写,这是用来变换工作目录的命令。

相对路径: 在输入路径时, 最前面不是以 / 开始的 , 表示相对 当前目录 所在的目录位置

绝对路径: 在输入路径时, 最前面是以 / 开始的, 表示 从 根目录 开始的具体目录位置

4) mkdir(创建目录)

语法

mkdir [-p] dirName

参数说明:

  • -p 确保目录名称存在,不存在的就建一个
[root@localhost 桌面]# ls
song.txt
[root@localhost 桌面]# mkdir song
[root@localhost 桌面]# ls
song  song.txt

[root@localhost 桌面]# mkdir -p song	//-p不会提示,不提示文件已存在
[root@localhost 桌面]# mkdir song
mkdir: 无法创建目录"song": 文件已存在

[root@localhost 桌面]# mkdir -p aaa/bbb	//可以创建多级目录
[root@localhost 桌面]# mkdir aaa/bbb		//报错:不能创建多级目录
5) rmdir(删空目录)

rmdir命令删除空的目录。-p 是当子目录被删除后使它也成为空目录的话,则顺便一并删除。

格式:rmdir [-p] dirName

将工作目录下,名为 aaa的子目录删除

rmdir aaa	//删除空文件夹
rmdir  -p aaa/bbb	//删除多级空文件夹,说明aaa中只有bbb,bbb中为空
6) cp(文件复制)

cp命令主要用于复制文件或目录。

格式:
cp source dest	  	//复制文件
cp -r source dest 	//复制文件夹

cp aaa/a.txt ccc	//文件:将aaa文件夹中的a.txt文件拷贝到bbb文件夹
cp -r aaa/* ccc		//文件夹:将aaa文件夹中的所有文件和文件夹拷贝到bbb文件夹

参数说明:

  • -f:覆盖已经存在的目标文件而不给出提示。

  • -i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目标文件将被覆盖。

  • -r/R:可以复制文件夹和文件

  • -l:不复制文件,只是生成链接文件。

总结:用户使用该指令复制目录时,必须使用参数"-r"或者"-R"。如果不加参数"-r"或者"-R",只复制文件,而略过目录

7) rm(删除目录)
  • -i 删除前逐一询问确认。
  • -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
  • -r 将目录及以下之档案亦逐一删除。

如果我们要删除文件可以直接使用rm命令,若删除目录则必须配合选项"-r",例如:

rm 文件路径
rm -r  文件或文件夹路径

注意:文件一旦通过rm命令删除,则无法恢复,所以必须格外小心地使用该命令。如果删除文件(比如.sh 、.txt),直接使用rm name.txt。

8) mv(移动文件)

mv 命令用来为文件或目录改名、或将文件或目录移入其它位置

格式:mv [options] source dest

参数说明:

  • -i: 询问是否覆盖旧文件;
  • -f: 在 mv 操作要覆盖时不给任何指示;

在这里插入图片描述

将文件 aaa 更名为 bbb :

[root@localhost song]# ls
aaa
[root@localhost song]# mv aaa bbb
[root@localhost song]# ls
bbb

将aaa目录放入bbb目录中

[root@localhost song]# ls
aaa  bbb
[root@localhost song]# mv aaa bbb
[root@localhost song]# ls
bbb

2、 Linux 文件基本属性

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

[root@localhost /]# ls -l
总用量 28
lrwxrwxrwx.   1 root root    7 11月 23 11:52 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 11月 23 12:18 boot
drwxr-xr-x.  20 root root 3300 11月 24 08:46 dev
drwxr-xr-x. 143 root root 8192 11月 24 08:46 etc
drwxr-xr-x.   7 root root   69 11月 23 19:03 home
lrwxrwxrwx.   1 root root    7 11月 23 11:52 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 11月 23 11:52 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 4月  11 2018 media
drwxr-xr-x.   2 root root    6 4月  11 2018 mnt
drwxr-xr-x.   3 root root   16 11月 23 11:57 opt
dr-xr-xr-x. 174 root root    0 11月 24 08:45 proc
dr-xr-x---.  14 root root 4096 11月 23 23:15 root
drwxr-xr-x.  40 root root 1220 11月 24 08:46 run
lrwxrwxrwx.   1 root root    8 11月 23 11:52 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 4月  11 2018 srv
dr-xr-xr-x.  13 root root    0 11月 24 08:45 sys
drwxrwxrwt.  30 root root 4096 11月 24 09:50 tmp
drwxr-xr-x.  13 root root  155 11月 23 11:52 usr
drwxr-xr-x.  21 root root 4096 11月 23 12:18 var

在Linux中第一个字符含义:当为[ d ]则是目录。当为[ - ]则是文件。若是[ l ]则表示为链接文档(link file);

每个文件的属性由左边第一部分的10个字符来确定。如果没有权限,就会出现减号[ - ]而已

在这里插入图片描述

从左至右用0-9这些数字来表示。第0位确定文件类型,第1-3位确定属主(该文件的所有者)拥有该文件的权限。第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。

3、 Linux文件属主和属组

(1) chgrp更改属组

chgrp命令用于变更所属群组。可以将 chgrp 理解为是 “change group” 的缩写

改变文件的群组属性

我们现在通过chgrp命令将文件bbb的属组更改成root

chgrp root bbb		//不带提示信息,将文件bbb的属组更改成root
chgrp -v root aaa	//带提示信息,将文件bbb的属组更改成root

[root@localhost song]# chgrp root aaa	
chgrp: 无法访问"aaa": 没有那个文件或目录
[root@localhost song]# chgrp root bbb
[root@localhost song]# chgrp -v root bbb
"bbb" 的所属组已保留为root
[root@localhost song]# ll
总用量 0
drwxr-xr-x. 3 root root 17 11月 24 10:02 bbb 

(2) chown更改属主和属组

语法如下

chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名
//将文件bbb的属主改为root
[root@localhost song]# chown root bbb
[root@localhost song]# ll
总用量 0
drwxr-xr-x. 3 root user 17 11月 24 10:02 bbb
[root@localhost song]# 

//将bbb文件的属组和属主都改为user
[root@localhost song]# chown user:user bbb
[root@localhost song]# ll
总用量 0
drwxr-xr-x. 3 user user 17 11月 24 10:02 bbb
[root@localhost song]# 

(3) chmod权限命令

Linux文件属性有两种设置方法,一种是数字,一种是符号。Linux的文件调用权限分为三级 : 文件属主、属组、其他。

语法:chmod -R 权限 文件

名词解释:

u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。

+表示增加权限、- 表示取消权限、= 表示唯一设定权限。
r 表示可读取,w 表示可写入,x 表示可执行

1) 数字权限

Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute权限。

在这里插入图片描述

例如当权限为: [-rwxrwx—] 分数则是:owner = rwx = 4+2+1 = 7 group = rwx = 4+2+1 = 7 others= — = 0+0+0 = 0

格式:chmod [-R] xyz 文件或目录
选项与参数:
	  -R : 进行递归(recursive)的持续变更,(递归设置)
	 xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。

举例:将a.txt所有权限启用

[root@localhost 桌面]# chmod -R 777 a.txt		//-R是指子目录文件拥有相同的权限
[root@localhost 桌面]# ll			
-rwxrwxrwx. 1  777 root 174 11月 24 11:35 a.txt	(由之前的【-rw-rw-r--】变成【-rwxrwxrwx】)
2) 符号权限

还有一个改变权限的方法,就是符号权限:user属主权限、group属组权限、others其他权限

那么我们就可以使用 u, g, o 来代表三种身份的权限! a 则代表 all,即全部的身份。

读写的权限可以写成 r, w, x,也就是可以使用下表的方式来看

在这里插入图片描述

如果我们需要将文件权限设置为 -rwxr-xr– ,可以使用 chmod u=rwx,g=rx,o=r 文件名 来设定:

chmod u=rwx,g=rx,o=r  as.txt	//设置权限
chmod  a-r as.txt		//去掉已有的权限

4、 综合案例

需求:

比如一个公司的开发团队有三个用户:java、erlang、golang有一个文件目录tmp/work供他们开发,如何实现让这三个用户都对其具有写权限

1、首先,我们创建三个账户(切换到root)

[root@localhost 桌面]# useradd java
[root@localhost 桌面]# useradd erlang
[root@localhost 桌面]# useradd golang

2、增加用户组

[root@localhost 桌面]# groupadd dev-group

3、创建公共文件并设置权限

给文件/tmp/work/设置属组为dev-group

[root@localhost 桌面]# mkdir -p tmp/work
 
[root@localhost 桌面]# chgrp -R dev-group  tmp/work
 或者chown -R :dev-group /tmp/work/

4、将用户添加到组

[root@localhost 桌面]# gpasswd -a java dev-group
正在将用户“java”加入到“dev-group”组中
[root@localhost 桌面]# gpasswd -a erlang dev-group
正在将用户“erlang”加入到“dev-group”组中
[root@localhost 桌面]# gpasswd -a golang dev-group
正在将用户“golang”加入到“dev-group”组中
[root@localhost 桌面]# chgrp dev-group  tmp/work

查询dev-group组下所有用户

[root@localhost 桌面]# grep 'dev-group' /etc/group
dev-group:x:8890:java,erlang,golang

5、切换到java用户

切换到java用户看看是否有写入权限

[root@localhost 桌面]# su java
[java@localhost 桌面]$ cd tmp
[java@localhost tmp]$ ll
总用量 0
drwxr-xr-x. 2 root dev-group 6 11月 25 13:17 work
[java@localhost tmp]$ cd work
[java@localhost work]$ mkdir aa
mkdir: 无法创建目录"ss": 权限不够
[java@localhost tmp]$ 

6、增加写入权限

给work目录增加写入权限,执行下面的命令
记得切换到root下执行

[root@localhost tmp]# chmod -R 770 work
[root@localhost tmp]# ll
总用量 0
drwxrwx---. 2 root dev-group 6 11月 25 13:17 work

7、切换用户,继续写入

[root@localhost tmp]# su java
[java@localhost tmp]$ cd work
[java@localhost work]$ mkdir aa
[java@localhost work]$ ls
aa
[java@localhost work]$

那么,其他两个用户golang、erlang也是和java一个组的,他们能不能正常写入呢,我们试试(从root切换过去)

[java@localhost work]$ su root
密码:
[root@localhost work]# su erlang
[erlang@localhost work]$ mkdir erlang.txt
[erlang@localhost work]$ ls
aa  erlang.txt
[erlang@localhost work]$ su root
密码:
[root@localhost work]# su golang
[golang@localhost work]$ mkdir gonlang.txt
[golang@localhost work]$

8、验证结论

为了验证上面的结论,我们新增一个用户itt

看看能否正常新建文件

[root@localhost work]# useradd itt
[root@localhost work]# su itt
[itt@localhost work]$ mkdir aaaaa
mkdir: 无法创建目录"aaaaa": 权限不够
[itt@localhost work]$ 

由上图我们发现,我们刚刚新创建的用户在创建文件的时候发现了权限不足。

由此说明用户itt用户的属组和文件的属组不一样,所以没有权限。

5、 总结

在企业级开发过程中,实际操作目录是最经常出现的,对于目录常用命令我们要熟练掌握并能熟练编写
因为Linux是多用户系统,所以权限也是非常核心和重要的,我们要熟练编写权限(属主、属组、其他权限)的常用命令。

一、 Linux文件管理

1、 touch命令

touch命令用于创建文件、修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。

使用 touch 创建一个空文件

[root@localhost 桌面]# touch a.txt
[root@localhost 桌面]# ls
a.txt  

使用touch批量创建文件

[root@localhost 桌面]# touch a{1..10}.txt
[root@localhost 桌面]# ls
a10.txt  a1.txt  a2.txt  a3.txt  a4.txt  a5.txt  a6.txt  a7.txt  a8.txt  a9.txt  a.txt  song  song.txt

显示文件状态

[root@localhost 桌面]# stat a.txt
  文件:"a.txt"
  大小:0               块:0          IO 块:4096   普通空文件
设备:fd00h/64768d      Inode:71306       硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2020-11-24 11:15:50.655979592 +0800
最近更改:2020-11-24 11:15:50.655979592 +0800
最近改动:2020-11-24 11:15:50.655979592 +0800
创建时间:-
[root@localhost 桌面]# touch a.txt	//再次创建已存在文件,时间变化
[root@localhost 桌面]# stat a.txt
  文件:"a.txt"
  大小:0               块:0          IO 块:4096   普通空文件
设备:fd00h/64768d      Inode:71306       硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2020-11-24 11:16:37.119979487 +0800
最近更改:2020-11-24 11:16:37.119979487 +0800
最近改动:2020-11-24 11:16:37.119979487 +0800
创建时间:-
[root@localhost 桌面]# 

2、 vi与vim命令

(1) vi/vim介绍

vi介绍:vi是 visual interface的简称, 是linux中最经典的文本编辑器。

  • 只能是编辑 文本内容, 不能对字体段落进行排版,只有命令
  • 不支持鼠标操作没有菜单

vim介绍:是从 vi 发展出来的一个文本编辑器。

(2) vi/vim模式

vi/vim模式主要分为以下三种:

命令模式:在Linux终端中输入“vim 文件名”就进入了命令模式,但不能输入文字。
**编辑模式:**在命令模式下按i就会进入编辑模式,此时就可以写入程式,按Esc可回到命令模式。
**末行模式:**在命令模式下按:进入末行模式,左下角会有一个冒号出现,此时可以敲入命令并执行。

(3) 打开和新建文件

  • 打开文件
vim txtfile.txt
  • 如果文件已经存在, 会直接打开该文件
  • 如果文件不存在, 保存且退出时 就会新建一个文件

(4) 三种模式切换

① 模式

vim txtfile.txt		//默认进入命令模式

② 模式

  • 在 vi 中除了常用 i 进入编辑模式 外, 还提供其他进入编辑模式
命令英文功能常用
iinsert在当前字符前插入文本常用
Iinsert在行首插入文本较常用
aappend在当前字符后添加文本
Aappend在行末添加文本较常用
o在当前行后面插入一空行常用
O在当前行前面插入一空行常用

③ 进入末行模式

编辑模式不能保存文件,必须先退到命令模式
先按Esc键退出到命令模式,然后按小写的**:wq 正常保存退出**

以下为其他的退出模式:

:q 没有对文件进行操作,按"q"退出

:q! 对文件操作不想保存退出

:wq 正常保存退出

:wq! 强行保存退出,只针对与root用户或文件所有人生效

(5) 文件查看

以下5个为文件查看命令,我们只讲4个常用的命令,head不在赘述

序号命令对应英文作用
01cat 文件名concatenate查看小文件内容,全部展示出来
02less -N 文件名less分频 显示大文件内容
03head -n 文件名查看文件的前一部分
04tail -n 文件名查看文件的最后部分
05grep 关键字 文件名grep根据关键词, 搜索文本文件内容
① cat命令

查看一个文件的内容,用cat比较简单,就是cat 后面直接接文件名。

查看文件名为txtfile.txt的内容

cat song.txt

查看文件名为song.txt的内容(加入行号)

[root@localhost 桌面]# cat -n song.txt
     1  hehe
     2  haha
     3  heimachengxuyuan
[root@localhost 桌面]# 
② grep命令

grep 命令用于查找文件里符合条件的字符串,语法如下:

1、搜索存在关键字的行的文件

grep eeee song.txt 

2、搜索存在关键字的行且显示行号

grep -n eeee song.txt 

3、忽略大小写搜索存在关键字的行

grep -i EEEE song.txt 

4、搜索存在关键字的行

grep -v 中国 song.txt 

5、查找指定的进程信息(包含grep进程)

[root@localhost 桌面]# ps -ef | grep sshd
root       7189      1  0 08:46 ?        00:00:00 /usr/sbin/sshd -D
root       8560   7189  0 09:10 ?        00:00:00 sshd: root@pts/0
root      13941   8565  0 14:20 pts/0    00:00:00 grep --color=auto sshd

6、查找指定的进程信息(不包含grep进程)

[root@localhost 桌面]# ps aux | grep sshd | grep -v "grep"
root       7197  0.0  0.2 112756  4316 ?        Ss   16:30   0:00 /usr/sbin/sshd -D
root       7995  0.0  0.3 160848  5632 ?        Ss   16:31   0:01 sshd: root@pts/0
[root@localhost 桌面]# 

7、查找进程个数

[root@localhost 桌面]# ps -ef | grep -c sshd
3

由上图可知sshd的进程个数为3(包含grep进程本身)

③ tail命令

会把文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 文件更新就可以看到最新的文件内容。

命令格式:tail [参数] [文件]  //默认显示后十行

要显示 txtfile.txt 文件的最后 3 行,请输入以下命令:

tail -3 txtfile.txt 	//查看最后三行

动态显示文档的最后内容,一般用来查看日志,默认十行

tail -f txtfile.txt		//	动态显示

当将某些行添加至 txtfile.txt 文件时,tail 命令会继续显示这些行。 显示一直继续,直到您按下(Ctrl-C)组合键停止显示。

tail -4f txtfile.txt   //动态显示最后4行

显示文件txtfile.txt 的内容,从第 2 行至文件末尾

tail  -n +2  txtfile.txt

显示文件 txtfile.txt的最后 10 个字符

tail -c 10 txtfile.txt
④ less命令

适合内容较多的文本文件,它也可以用于分屏显示文件内容。less用于查看文大件,但是less 在查看之前不会加载整个文件。

格式:less [参数] 文件 

查看命令历史使用记录并通过less分页显示

[itcast@localhost ~]$  history | less
    1  ifconfig
    2  reboot
    3  ifconfig
    4  reboot
    5  ifconfig
   ......

(6) vim定位行

我们打开文件定位到第6行,如下:

vim txtfile.txt +6

(7) 异常处理

如果 vim异常退出, 在磁盘上可能会保存有 交换文件。下次再使用 vim 编辑文件时, 会报错。解决方案:将后缀名为.swp的文件删除即可恢复,再次编辑文件不在出现提示警告!

E325: 注意
发现交换文件 ".song.txt.swp"
            所有者: root    日期: Tue Nov 24 14:26:26 2020
            文件名: ~root/桌面/song.txt
            修改过: 是
            用户名: root      主机名: localhost.localdomain
           进程 ID: 14024
正在打开文件 "song.txt"
              日期: Tue Nov 24 14:26:05 2020

(1) Another program may be editing the same file.  If this is the case,
    be careful not to end up with two different instances of the same
    file when making changes.  Quit, or continue with caution.
(2) An edit session for this file crashed.
    如果是这样,请用 ":recover" 或 "vim -r song.txt"
    恢复修改的内容 (请见 ":help recovery")。
    如果你已经进行了恢复,请删除交换文件 ".song.txt.swp"
    以避免再看到此消息。

交换文件 ".song.txt.swp" 已存在!
以只读方式打开([O]), 直接编辑((E)), 恢复((R)), 删除交换文件((D)), 退出((Q)

3、 echo 命令

echo string 将字符串输出到控制台 , 通常和 重定向 联合使用

echo hello world
# 如果字符串有空格, 为了避免歧义 请增加 双引号 或者 单引号
echo "hello world"

默认情况下 命令的结果输出到 控制台,通过 重定向 可以将结果 输出到文件

第一步: 将命令的成功结果覆盖指定文件内容

 echo  传智博客 >czbk-txt.txt

第二步: 将命令的成功结果追加 指定文件的后面

echo  黑马程序员 >> czbk-txt.txt

第三步: 将命令的失败结果追加 指定文件的后面
cat 不存在的目录 &>> error.txt

[root@localhost 桌面]# cat hahaha.txt &>> error.txt
[root@localhost 桌面]# cat error.txt 
cat: hahaha.txt: 没有那个文件或目录
[root@localhost 桌面]# 

4、 XXXXawk命令XXXX

AWK是一种处理文本文件的语言,是一个强大的文本分析工具。

具体语法如下

awk [选项参数] 'script' var=value file(s)awk [选项参数] -f scriptfile var=value file(s)

1、数据准备:qiang.txt文本内容如下:

zhangsan 68 99 26
lisi 98 66 96
wangwu 38 33 86
zhaoliu 78 44 36
maq 88 22 66
zhangba 98 44 46

2、搜索含有 zhang 和 li 的学生成绩:

[root@localhost 桌面]# cat qiang.txt | awk '/zhang|li/'
zhangsan 68 99 26
lisi 98 66 96
zhaoliu 78 44 36
zhangba 98 44 46
[root@localhost 桌面]# 

指定分割符, 根据下标显示内容

命令含义
awk -F ‘,’ ‘{print $1, $2, $3}’ 文件操作1.txt文件, 根据 逗号 分割, 打印 第一段 第二段 第三段 内容

选项

选项英文含义
-F ','field-separator使用 指定字符 分割
$ + 数字获取第几段内容
$0获取 当前行 内容
NFfield表示当前行共有多少个字段
$NF代表 最后一个字段
$(NF-1)代表 倒数第二个字段
NR代表 处理的是第几行
# 查看文档内容
cat czbk-txt.txt 
#直接输出
cat score.txt | awk -F ' ' '{print $1,$2,$3}'

执行效果如下

在这里插入图片描述

指定分割符, 根据下标显示内容

命令含义
awk -F ’ ’ ‘{OFS="==="}{print $1, $2, $3}’ 1.txt操作1.txt文件, 根据 逗号 分割, 打印 第一段 第二段 第三段 内容

选项

选项英文含义
OFS="字符"output field separator向外输出时的段分割字符串
转义序列含义
\b退格
\f换页
\n换行
\r回车
\t制表符
# 按照 === 进行分割, 打印 第一段 第二段 第三段
cat  czbk-txt.txt | awk -F ' ' '{OFS="==="}{print $1,$2,$3}'
# 按照 制表符tab 进行分割, 打印 第一段 第二段 第三段
cat czbk-txt.txt| awk -F ' ' '{OFS="\t"}{print $1,$2,$3}'

执行效果如下

在这里插入图片描述

在这里插入图片描述

调用 awk 提供的函数

命令含义
awk -F ‘,’ ‘{print toupper($2)}’ 1.txt操作1.txt文件, 根据 逗号 分割, 打印 第一段 第二段 第三段 内容

常用函数如下:

函数名含义作用
toupper()upper字符 转成 大写
tolower()lower字符 转成小写
length()length返回 字符长度
# 打印第一段内容
 cat czbk-txt.txt | awk -F ' ' '{print $1}'
# 将第一段内容转成大写 且 显示 
 cat czbk-txt.txt | awk -F ' ' '{print toupper($1)}'

执行效果如下

在这里插入图片描述

求指定学科平均分

命令含义
awk ‘BEGIN{初始化操作}{每行都执行} END{结束时操作}’ 文件名BEGIN{ 这里面放的是执行前的语句 }
{这里面放的是处理每一行时要执行的语句}
END {这里面放的是处理完所有的行后要执行的语句 }

查看czbk-txt.txt 文件内容

cat czbk-txt.txt 

执行效果如下

在这里插入图片描述

查看总分

注意:这里计算的是第4列的总分

cat czbk-txt.txt| awk -F ' ' 'BEGIN{}{total=total+$4} END{print total}'

执行效果如下
在这里插入图片描述

查看总分, 总人数

注意:这里计算的是第4列的

cat czbk-txt.txt| awk -F ' ' 'BEGIN{}{total=total+$4} END{print total, NR}'

执行效果如下

在这里插入图片描述

查看总分, 总人数, 平均分

注意:这里计算的是第4列的

 cat czbk-txt.txt | awk -F ' ' 'BEGIN{}{total=total+$4} END{print total, NR, (total/NR)}'

执行效果如下

在这里插入图片描述

总结

awk在使用过程中主要用作分析

简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理

5、 软连接(快捷方式)

为什么有软连接?因为某些文件和目录的 路径很深, 所以 需要增加 软链接

语法如下:

命令英文作用
ln -s 目标文件绝对路径 快捷方式路径link给目标文件增加一个软链接, 通俗讲就是快捷方式

给aaa/bbb/ccc/a.txt文件增加软连接

 ln  -s aaa/bbb/ccc/a.txt    a.txt

总结:通过 `ln -s 源文件的绝对路径 其实就是给目标文件 增加 快捷方式

6、 find查找

find概念:find按照文件的属性进行查找,一般是按照文件名查找。

语法

find <指定目录> <指定条件> <指定内容>

1、将当前目录及其子目录下所有延伸档名是 txt的文件查询出来

[root@localhost 桌面]# find . -name '*.txt'
./a.txt
./song.txt
./error.txt

2、将当前目录及其子目录下所有最近 1天内更新过的文件查询出来

find . -ctime -1

3、全局搜索czbk

/代表是全盘搜索,也可以指定目录搜索

 find / -name  'czbk'

7、 XXread命令XXXX

注意:

read命令属于文件范畴的命令

在下面的演示中,会涉及到shell,shell章节在最后一章

建议:讲解shell的时候在回过来说下read命令的语法

我们在综合案例中也会降到read

引子:
read命令相当于在java SE阶段我们学习的键盘录入输入Scanner(read命令会比Scanner更强大),开发人员可以动态的与程序交互,

read命令用于从标准输入读取数值。

read 内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。

语法

read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]

1、简单读取

#!/bin/bash
echo "请您输入网站名: "  
#读取从键盘的输入  
read website  
echo "你输入的网站名是 $website"  
exit 0  #退出

执行效果如下

在这里插入图片描述

3、读取文件

每次调用 read 命令都会读取文件中的 “一行” 文本。当文件没有可读的行时,read 命令将以非零状态退出。

我们可以使用 cat 命令将结果直接传送给包含 read 命令的 while 命令。

测试文件 test.txt 内容如下:

AAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDD
================传智播客

脚本如下,可以将脚本放到xxx.sh中进行执行

#!/bin/bash
count=1
cat test.txt | while read line      
# cat 命令的输出作为read命令的输入,read读到>的值放在line中
do
   echo "Line $count:$line"
   count=$[ $count + 1 ]          # 注意中括号中的空格。
done
echo "finish"
exit 0

执行效果如下
在这里插入图片描述

总结

由此可看read命令不仅可以读取键盘输入,而且还可以读取静态文件

二、 Linux备份压缩

1、 gzip命令

gzip命令用于压缩文件。其名称后面会多出".gz"的扩展名

格式:gzip[参数][文件或者目录]

(1)压缩当前目录下的指定文件

[root@localhost 桌面]# ls
a.txt  error.txt  song.txt
[root@localhost 桌面]# gzip a.txt		//压缩
[root@localhost 桌面]# ls
a.txt.gz  error.txt  song.txt

(2)压缩当前目录下的所有文件

[root@localhost 桌面]# gzip *		//	压缩当前文件夹下所有文件夹压缩
[root@localhost 桌面]# ls
a.txt.gz  error.txt.gz  song.txt.gz

(3) 解压并列出详细的信息

[root@localhost 桌面]# gzip -dv *	//解压所有,v列出详细信息
a.txt.gz:        42.9% -- replaced with a.txt
error.txt.gz:    -2.2% -- replaced with error.txt
song.txt.gz:      0.0% -- replaced with song.txt
[root@localhost 桌面]# ls
a.txt  error.txt  song.txt

2、 gunzip命令

gunzip命令用于解压文件。

格式:gunzip[参数][文件或者目录]
[root@localhost 桌面]# gzip *		//压缩所有文件
[root@localhost 桌面]# ls
a.txt.gz  error.txt.gz  song.txt.gz
[root@localhost 桌面]# gunzip a.txt.gz	//解压指定文件
[root@localhost 桌面]# ls
a.txt  error.txt.gz  song.txt.gz
[root@localhost 桌面]# gunzip *			//解压所有文件
gzip: a.txt: unknown suffix -- ignored
[root@localhost 桌面]# ls
a.txt  error.txt  song.txt
[root@localhost 桌面]# 

3、 tar命令

tar的主要功能是打包、压缩和解压文件。tar本身不具有压缩功能。他是调用压缩功能实现的 。

在这里插入图片描述

格式:tar[必要参数][选择参数][文件] 

1、将 txtfile.txt文件打包(仅打包,不压缩)

tar -cvf txt.tar txtfile.txt 

2、将 txtfile.txt文件打包压缩(打包压缩(gzip))

tar -zcvf txt.tar.gz txtfile.txt 

3、查看tar中有哪些文件

tar -ztvf txt.tar.gz

4、将tar 包解压缩

tar -zxvf /home/itcast/ysFiles/txt.tar.gz

4、 zip命令

zip命令用于压缩文件。产生具有".zip"扩展名的压缩文件。

  • -q不显示执行过程
  • -r 递归到目录中
[root@localhost 桌面]# zip -q -r song.zip song		//将song文件夹压缩为song.zip
[root@localhost song]# zip -q -r z.zip *		//将当前目录所有文件压缩为z.zip

[root@localhost 桌面]# zip qiang.zip qiang.txt	//压缩单个文件
  adding: qiang.txt (stored 0%)
[root@localhost 桌面]# ls

5、 unzip命令

Linux unzip命令用于解压缩zip文件,unzip为.zip压缩文件的解压缩程序

格式:unzip[必要参数][选择参数][文件] 

1、查看压缩文件中包含的文件:

 unzip -l song.zip	//解压song.zip到当前文件夹

2、如果要把文件解压到指定的目录下,需要用到-d参数

unzip -d bbb song.zip		//解压song.zip到bbb文件夹

6、 XXXXXXXbzip2命令XXXXXXX

引子
".bz2"格式是 Linux 的另一种压缩格式,从理论上来讲,".bz2"格式的算法更先进、压缩比更好;而 咱们上面学到的".gz"格式相对来讲时间更快
在使用过程中可以根据需求自由选择

bzip2命令是.bz2文件的压缩程序。

bzip2采用新的压缩演算法,压缩效果比传统的LZ77/LZ78压缩演算法来得好。若没有加上任何参数,bzip2压缩完文件后会产生.bz2的压缩文件,并删除原始的文件。

使用者权限:所有用户

语法

bzip2 [-cdfhkLstvVz][--repetitive-best][--repetitive-fast][- 压缩等级][要压缩的文件]

1、压缩文件

1.创建目录
 mkdir  bzFiles
 cd ./bzFiles/
2.创建文件
touch 001
3.压缩
bzip2 001
ll

执行效果如下

在这里插入图片描述

如上图001.bz2就是压缩后的文件

7、 XXXXXXbunzip2命令XXXX

引子
Linux bunzip2命令是.bz2文件的解压缩程序。

使用者权限:所有用户

语法

bunzip2 [-fkLsvV][.bz2压缩文件]

参数

解压.bz2文件

bunzip2 -v 001.bz2 

执行效果如下图

在这里插入图片描述

001文件即是被解压后的

8、 XXXXXXXX总结XXXXX

gz:由gzip压缩工具压缩的文件。

.bz2:由bzip2压缩工具压缩的文件。

.tar:由tar打包程序打包的文件(tar没有压缩功能,只是把一个 目录合并成一个文件)

.tar.gz:可理解为先由tar打包,再由gz压缩。

.zip:可理解为由zip压缩工具直接压缩

三、 网络与磁盘管理

1、 网络命令

(1) ifconfig命令

1、显示激活的网卡信息

ifconfig
[root@localhost 桌面]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.85.171  netmask 255.255.255.0  broadcast 192.168.85.255
        inet6 fe80::8634:1baa:6f4e:cb6d  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:47:18:b4  txqueuelen 1000  (Ethernet)
        RX packets 16035  bytes 6167009 (5.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5922  bytes 804593 (785.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 468  bytes 54084 (52.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 468  bytes 54084 (52.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:c1:3f:e8  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost 桌面]#

2、关闭网卡(需要切换到管理员账户)

ifconfig ens37 down

3、启用网卡(需要切换到管理员账户)

ifconfig ens37 up

4、配置ip信息

// 配置ip地址
ifconfig ens37 192.168.23.199
// 配置ip地址和子网掩码
ifconfig ens37 192.168.23.133 netmask 255.255.255.0

这样的话我们就可以通过命令的方式设置网卡的网络信息了。

(2) ping命令

ping命令用于检测主机。执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。

1、检测是否与主机连通

[root@localhost 桌面]# ping www.baidu.com
PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=128 time=38.0 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=128 time=35.8 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=3 ttl=128 time=37.4 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=4 ttl=128 time=37.1 ms

icmp_seq:ping序列,从1开始
ttl:IP生存时间值
time: 响应时间,数值越小,联通速度越快

2、指定接收包的次数

和上面不同的是:收到两次包后,自动退出

[root@localhost 桌面]# ping -c 2 www.baidu.com
PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=128 time=37.1 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=128 time=37.3 ms

--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 37.188/37.278/37.368/0.090 ms
[root@localhost 桌面]#

ping命令也是我们在开发过程中常用到的命令。通常使用 ping xxx.xxx.xxx.xxx命令进行检测本地与目标机器是否连通。

(3) netstat命令

netstat命令用于显示网络状态。

1、显示详细的连接状况

netstat -a		//显示网络状态

2、显示网卡列表

[root@localhost 桌面]# netstat -i
Kernel Interface table
Iface             MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
ens33            1500    16404      0      0 0          6096      0      0      0 BMRU
lo              65536      468      0      0 0           468      0      0      0 LRU
virbr0           1500        0      0      0 0             0      0      0      0 BMU
[root@localhost 桌面]# 

2、 XXXXX磁盘命令XXXX

(1) lsblk命令

使用lsblk命令可以以tree的形式展示所有设备的信息

lsblk命令的英文是“list block”,即用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息。

**语法格式:**lsblk [参数]

使用者权限:所有用户

1、lsblk命令默认情况下将以树状列出所有块设备:

lsblk

执行效果如下图

在这里插入图片描述

NAME : 这是块设备名。

MAJ:MIN : 本栏显示主要和次要设备号。

RM : 本栏显示设备是否可移动设备。注意,在上面设备sr0的RM值等于1,这说明他们是可移动设备。

SIZE : 本栏列出设备的容量大小信息。

RO : 该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。

TYPE :本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。

MOUNTPOINT : 本栏指出设备挂载的挂载点。

2、默认选项不会列出所有空设备:

lsblk -f

执行效果如下图

在这里插入图片描述

NAME表示设备名称

FSTYPE表示文件类型

LABEL表示设备标签

UUID设备编号

MOUNTPOINT表示设备的挂载点

注意

我们学习这个命令主要是在下面将要学习的fdisk分区中会经常使用到

(2) df命令

引子(如下图):
Linux的df命令类似于在Windows中的【计算机】--【管理】--【磁盘管理】菜单对磁盘的统计情况查看

在这里插入图片描述

df命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计。

使用者权限:所有用户

语法

df [选项]... [FILE]...

1、显示磁盘使用情况统计情况

df  

执行效果如下图

在这里插入图片描述

第一列指定文件系统的名称

第二列指定一个特定的文件系统1K-块1K是1024字节为单位的总容量。

已用和可用列分别指定的容量。

最后一个已用列指定使用的容量的百分比

最后一栏指定的文件系统的挂载点。

2、df命令也可以显示磁盘使用的文件系统信息

比如我们df下之前创建过的目录gzipTest的使用情况

df  gzipTest/

执行效果如下图

在这里插入图片描述

3、df显示所有的信息

df --total 

执行效果如下图

在这里插入图片描述

我们看到输出的末尾,包含一个额外的行,显示总的每一列。

4、df换算后显示

df -h 

执行效果如下图

在这里插入图片描述

我们可以看到输出显示的数字形式的’G’(千兆字节),“M”(兆字节)和"K"(千字节)。

这使输出容易阅读和理解,从而使显示可读的。请注意,第二列的名称也发生了变化,为了使显示可读的"容量"。

(3) mount命令

在Linux当中所有的存储设备如u盘、光盘、硬盘等,都必须挂载之后才能正常使用。

其实挂载可以理解为Windows当中的分配盘符(重要),只不过windows当中是以英文字母ABCD等作为盘符,而linux是拿系统目录作为盘符,当然linux当中也不叫盘符,而是称为挂载点,而把为分区或者光盘等存储设备分配一个挂载点的过程称为挂载

mount命令是经常会使用到的命令,它用于挂载Linux系统外的文件。

挂载概念

在安装linux系统时设立的各个分区,如根分区、/boot分区等都是自动挂载的,也就是说不需要我们人为操作,开机就会自动挂载。但是光盘、u盘等存储设备如果需要使用,就必须人为的进行挂载。

其实我们在windows下插入U盘也是需要挂载(分配盘符)的,只不过windows下分配盘符是自动的

Linux中的根目录以外的文件要想被访问,需要将其“关联”到根目录下的某个目录来实现,这种关联操作就是“挂载”,这个目录就是“挂载点”,解除次关联关系的过程称之为“卸载”。

注意:“挂载点”的目录需要以下几个要求:

(1)目录事先存在,可以用mkdir命令新建目录;

(2)挂载点目录不可被其他进程使用到;

(3)挂载点下原有文件将被隐藏。

使用者权限:所有用户,设置级别的需要管理员

语法

mount [-hV]
mount -a [-fFnrsvw] [-t vfstype]
mount [-fnrsvw] [-o options [,...]] device | dir
mount [-fnrsvw] [-t vfstype] [-o options] device dir

需求:
比如现在我们要通过挂载的方式查看Linux CD/DVD光驱里面的内容

1、CD/DVD设置

进入【虚拟机】–【设置】

在这里插入图片描述

设置CD/DVD的内容,我们这里使用的是F:\CentOS-7-x86_64-DVD-1810.iso

在这里插入图片描述

查看F:\CentOS-7-x86_64-DVD-1810.iso;里面的内容

在这里插入图片描述

2、创建挂载点

注意:一般用户无法挂载cdrom,只有root用户才可以操作

我们切换到root下创建一个挂载点(其实就是创建一个目录)

mkdir  -p mnt/cdrom

3、开始挂载

通过挂载点的方式查看上面的【ISO文件内容】

mount -t auto /dev/cdrom /mnt/cdrom

执行效果如下

在这里插入图片描述

表示挂载成功

4、查看挂载点内容

ls -l -a ./mnt/cdrom/

执行效果如下图

在这里插入图片描述

如上图所示,我们通过挂载点查看CD/DVD的文件个数是14个,和上面的【ISO文件内容】个数一致。

5、卸载cdrom

在前面我们将CD/DVD挂载到了文件系统,如果我们不用了,就可以将其卸载掉

umount ./mnt/cdrom/

执行效果如下图

在这里插入图片描述

我们发现卸载后,通过挂载点就无法查看CD/DVD里面的数据了。

3、 总结XXXX

关于挂载:用户不能直接访问 硬件设备需要将硬件设备 挂载 到 系统目录上, 才可以让用户访问。

四、 shell与安装

1、 yum使用

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

注意:必须联网。不同的服务通过yum命令连接远程yum源进行查找、下载、安装

格式:yum [options] [command] [package ...]
  • **options:**可选,选项包括-h(帮助),-y(当安装过程提示选择全部为"yes"),-q(不显示安装的过程)等等。
  • **command:**要进行的操作。
  • package操作的对象。

yum常用命令

  • 1.列出所有可更新的软件清单命令:yum check-update
  • 2.更新所有软件命令:yum update
  • 3.仅安装指定的软件命令:yum install <package_name>
  • 4.仅更新指定的软件命令:yum update <package_name>
  • 5.列出所有可安裝的软件清单命令:yum list
  • 6.删除软件包命令:yum remove <package_name>
  • 7.查找软件包 命令:yum search
  • 8.清除缓存命令:
    • yum clean packages: 清除缓存目录下的软件包
    • yum clean headers: 清除缓存目录下的 headers
    • yum clean oldheaders: 清除缓存目录下旧的 headers
    • yum clean, yum clean all (= yum clean packages; yum clean oldheaders) :清除缓存目录下的软件包及旧的headers

(1) 安装tree

[root@localhost 桌面]# yum -y install tree		//y当安装过程提示选择全部为"yes"
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirror.bit.edu.cn
 * updates: mirrors.aliyun.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 tree.x86_64.0.1.6.0-10.el7 将被 安装
--> 解决依赖关系完成
...
...
...
已安装:
  tree.x86_64 0:1.6.0-10.el7                                                                              

完毕!
[root@localhost 桌面]# tree
.
├── a.txt
├── error.txt
├── song
│   ├── 1.txt
│   ├── 2.txt
│   ├── 3.txt
│   ├── 4.txt
│   └── 5.txt
├── song.gz
├── song.tar
└── song.txt

(2) 移除tree

[root@localhost 桌面]# yum remove tree
已加载插件:fastestmirror, langpacks
正在解决依赖关系
--> 正在检查事务
---> 软件包 tree.x86_64.0.1.6.0-10.el7 将被 删除
--> 解决依赖关系完成
...
...
...
删除:
  tree.x86_64 0:1.6.0-10.el7                                                                              

完毕!
[root@localhost 桌面]# tree
-bash: /usr/bin/tree: 没有那个文件或目录
[root@localhost 桌面]# 

(3) yum查找

利用 yum 的功能,找出以 python3为开头的软件名称有哪些

[root@localhost 桌面]# yum list python3*
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirror.bit.edu.cn
 * updates: mirrors.aliyun.com
可安装的软件包
python3.i686                                             3.6.8-18.el7                              updates
python3-libcomps.x86_64                                  0.1.8-14.el7                              extras 
python3-libs.i686                                        3.6.8-18.el7                              updates
python3-libs.x86_64                                      3.6.8-18.el7                              updates
python3-pip.noarch                                       9.0.3-8.el7                               base   
python3-wheel.noarch                                     0.31.1-5.el7_7                            base   
[root@localhost 桌面]# 

(4) yum源

**概述:**yum需要一个yum库,也就是yum源。简单的说,我们安装软件的时候需要下载软件,将很多软件放在一起就是源。软件安装包的来源,所以yum源就是软件安装包来源 。

yum源分类目前,yum默认使用的是CentOS的yum源,如下

[root@localhost yum.repos.d]# yum repolist
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirror.bit.edu.cn
 * updates: mirrors.aliyun.com
源标识                                           源名称                                             状态
base/7/x86_64                                    CentOS-7 - Base                                    10,072
extras/7/x86_64                                  CentOS-7 - Extras                                     448
updates/7/x86_64                                 CentOS-7 - Updates                                    773
repolist: 11,293
[root@localhost yum.repos.d]# 

目前,国内有很多不错的yum源,比如阿里、网易、搜狐等

安装阿里yum源

因为默认的yum源服务器在国外,我们在安装软件的时候会受到速度的影响,所以安装国内yum源在下载的时候速度、稳定性会比国外的好很多。

1) 安装wget

[root@localhost yum.repos.d]# yum install -y wget
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirror.bit.edu.cn
 * updates: mirrors.aliyun.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 wget.x86_64.0.1.14-18.el7 将被 升级
---> 软件包 wget.x86_64.0.1.14-18.el7_6.1 将被 更新
--> 解决依赖关系完成
  wget.x86_64 0:1.14-18.el7_6.1                                                                           
完毕!
[root@localhost yum.repos.d]# 安装成功。

2) 备份/etc/yum.repos.d/CentOS-Base.repo文件

cd /etc/yum.repos.d/
mv CentOS-Base.repo CentOS-Base.repo.back

3) 下载阿里云的Centos-7.repo文件

wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

注意:上面的url中要卸载Centos-7.repo;而不是Centos-6.repo

[root@localhost yum.repos.d]# wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
--2020-11-24 16:53:51--  http://mirrors.aliyun.com/repo/Centos-7.repo
正在解析主机 mirrors.aliyun.com (mirrors.aliyun.com)... 118.123.2.187, 219.153.52.226, 118.123.2.181, ...
正在连接 mirrors.aliyun.com (mirrors.aliyun.com)|118.123.2.187|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:2523 (2.5K) [application/octet-stream]
正在保存至: “CentOS-Base.repo”
100%[===============================================>] 2,523       --.-K/s 用时 0s 

查看下载的阿里云的Centos-6.repo文件

cat CentOS-Base.repo
[root@localhost yum.repos.d]# cat CentOS-Base.repo
[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
···
···
···
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
[root@localhost yum.repos.d]# 

如上面的命令,之前是【CentOS】,现在是【aliyun】

4) 重新加载yum

[root@localhost yum.repos.d]# yum clean all
已加载插件:fastestmirror, langpacks
正在清理软件源: base extras updates
Cleaning up list of fastest mirrors

5)建立一个缓存文件

[root@localhost yum.repos.d]# yum makecache
已加载插件:fastestmirror, langpacks
Determining fastest mirrors
 * base: mirrors.aliyun.com
                                                        | 2.9 kB  00:00:00     
(1/10): base/7/x86_64/group_gz                                    | 153 kB  00:00:00     
(2/10): extras/7/x86_64/filelists_db                              | 224 kB  00:00:07     
(3/10): extras/7/x86_64/other_db                                  | 134 kB  00:00:00     
...
..
...
(10/10): base/7/x86_64/primary_db                                 | 6.1 MB  00:00:50     
元数据缓存已建立

就是把服务器的包信息下载到本地电脑缓存起来,makecache建立一个缓存,以后用install时就在缓存中搜索,提高了速度。

如上图,元数据缓存已建立,缓存成功。

6)验证yum源使用

yum search tomcat
[root@localhost yum.repos.d]# yum search tomcat
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
================================================ N/S matched: tomcat =================================================
tomcat-admin-webapps.noarch : The host-manager and manager web applications for Apache Tomcat
tomcat-docs-webapp.noarch : The docs web application for Apache Tomcat
tomcat-javadoc.noarch : Javadoc generated documentation for Apache Tomcat
tomcat-jsp-2.2-api.noarch : Apache Tomcat JSP API implementation classes
tomcat-jsvc.noarch : Apache jsvc wrapper for Apache Tomcat as separate service
tomcat-lib.noarch : Libraries needed to run the Tomcat Web container
tomcat-servlet-3.0-api.noarch : Apache Tomcat Servlet API implementation classes
tomcat-webapps.noarch : The ROOT and examples web applications for Apache Tomcat
tomcatjss.noarch : JSS Connector for Apache Tomcat, a JSSE module for Apache Tomcat that uses JSS
tomcat.noarch : Apache Servlet/JSP Engine, RI for Servlet 3.0/JSP 2.2 API
tomcat-el-2.2-api.noarch : Expression Language v2.2 API

  名称和简介匹配 only,使用“search all”试试。
[root@localhost yum.repos.d]# 

(5)yum.pid 已被锁定

已加载插件:fastestmirror, langpacks /var/run/yum.pid 已被锁定,PID 为 2323 的另一个程序正在运行。
已加载插件:fastestmirror, langpacks
/var/run/yum.pid 已被锁定,PID 为 2323 的另一个程序正在运行。
Another app is currently holding the yum lock; waiting for it to exit...
  另一个应用程序是:PackageKit
    内存:155 M RSS (574 MB VSZ)
    已启动: Mon Mar 23 14:13:26 2020 - 01:07之前
    状态  :运行中,进程ID:2323
 解决方法:

[root@chao ~]# rm -f /var/run/yum.pid

(6)安装jdk

(1)切换权限为root

(2)查看版本java -version

[root@localhost ~]# java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
[root@localhost ~]# 

(3)查看CentOS中自带的JDK,

[root@localhost ~]# rpm -qa | grep java
java-1.7.0-openjdk-1.7.0.191-2.6.15.5.el7.x86_64`````````````````
python-javapackages-3.4.1-11.el7.noarch
java-1.7.0-openjdk-headless-1.7.0.191-2.6.15.5.el7.x86_64```````````
java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64``````````````
tzdata-java-2018e-3.el7.noarch
javapackages-tools-3.4.1-11.el7.noarch
java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64````````````
[root@localhost ~]# 

(4)删除openjdk

rpm -e --nodeps java-1.7.0-openjdk-1.7.0.191-2.6.15.5.el7.x86_64
rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.191-2.6.15.5.el7.x86_64
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64
rpm -e --nodeps java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64

(5)检查是否删除成功

java -version 再次查看Java版本,没有任何信息就表示删除成功了

(6)下载JDK

(7)把JDK上传至CentOS中。

//在CRT中输入alt + p命令,进入
//默认上传至,root用户家目录

sftp> put -r "D://桌面/jdk-8u171-linux-x64.tar.gz"
Uploading jdk-8u171-linux-x64.tar.gz to /root/jdk-8u171-linux-x64.tar.gz
  100% 186416KB  93208KB/s 00:00:02     
D:/桌面/jdk-8u171-linux-x64.tar.gz: 190890122 bytes transferred in 2 seconds (93208 KB/s)
sftp> 

(8)在根的usr文件夹里面新建一个java文件夹

mkdir /usr/java

(9)把压缩包拷贝到/usr/java文件夹当中

cp jdk-8u261-linux-x64.tar.gz 	/usr/java

(10)进入到/usr/java 去解压。

cd /usr/java
解压:tar -zxvf 压缩包

(11)配置环境变量(注意版本)

vim /etc/profile
#java environment
export JAVA_HOME=/usr/java/jdk1.8.0_171
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin

(12)让当前环境变量生效

source /etc/profile

(13)验证jdk的安装

[root@localhost jdk1.8.0_171]# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
[root@localhost jdk1.8.0_171]# 

2、 rpm使用

RPM包管理类似于windows下的“添加/删除程序”但是功能却比“添加/删除程序”强大很多

(1)rpm介绍

rpm(redhat package manager) 原本是 Red Hat Linux 发行版。

(2)rpm与yum区别

rpm 只能安装已经下载到本地机器上的rpm 包. yum能在线下载并安装rpm包,能更新系统,且还能自动处理包与包之间的依赖问题,这个是rpm 工具所不具备的。

语法如下:

用法: rpm [选项...]

扩展名为.rpm的包

rpm -ivh 软件全包名	  //安装rpm软件包
rpm -e 软件全包名      //卸载rpm软件包
rpm -qa				//列出所有安装过的包
rpm -qi 软件全包名	//查询软件包信息
rpm -ql 软件全包名	//查看文件安装位置

3、 shell使用

shell脚本类似于我们在Windows中编写的批处理文件,它的扩展名是.bat,比如我们启动Tomcat(后面的课程我们会详细讲解)的时候经常启动的startup.bat,就是Windows下的批处理文件

在Linux中,shell脚本编写的文件是以.sh结尾的。比如Tomcat下我们经常使用startup.sh来启动我们的Tomcat,这个startup.sh文件就是shell编写的。

(1) shell入门

编写一个简单的入门shell程序。我们通过前面学习的echo命令,在shell脚本中打印出一句话。

1) 什么是shell

在计算机科学中,shell就是一个命令解释器。

shell是位于操作系统应用程序之间,是他们二者最主要的接口。

shell负责把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序。

一句话,shell就是在操作系统和应用程序之间的一个命令翻译工具。

2) shell环境

java需要JVM虚拟机解释器, 同理 shell脚本也需要解释器。

Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

查看默认解释器

[root@localhost 桌面]# echo $SHELL	//	默认的shell
/bin/bash

Linux 的 Shell 种类众多,常见的有:

[root@localhost 桌面]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

我们当前课程使用的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell

3) 编写第一个shell

现在,我们打开文本编辑器(我们也可以使用 vi/vim 命令来创建文件),新建一个文件 czbk.sh,扩展名为 sh(sh代表shell):

#!/bin/bash  --- 指定脚本解释器
echo "你好,传智播客 !"

① 写shell的习惯 第一行指定解释器
② 文件是sh为后缀名
③ 括号成对书写,[] 括号两端要要有空格。 [ neirong ]
④ 注释的时候尽量不用中文注释。不友好。
⑤ 习惯代码索引,增加阅读性
⑥ 写语句的时候,尽量写全了,比如if。。。

1、创建sh文件

vim sh.sh

2、编写并保存

在这里插入图片描述

3、查看czbk.sh文件通过chmod设置执行权限

[root@localhost 桌面]# ll
总用量 28
-rw-r--r--. 1 root root    41 11月 27 18:52 sh.sh


# 如上发现root没有执行权限,需要授权,然后执行
[root@localhost 桌面]# chmod -R 777 sh.sh
[root@localhost 桌面]# ./sh.sh
你好,传智播客

如上,我们刚刚编写的shell在执行的时候正常打印出来了,说明czbk.sh具备执行的能力

注意:**#!**是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。echo 命令用于向窗口输出文本。

(2) shell注释

引子:
在Java SE课程中,我们也学习了注释
比如单行注释我们使用双斜杠//
   多行注释我们使用/**开头表示注释多行
而在shell编程中,我们同样也要有注释,注释掉程序中不用的脚本

1、单行注释

# 开头的单行就是注释,会被解释器忽略。

2、多行注释

多行注释还可以使用以下格式:

:<<EOF
注释内容...
注释内容...
注释内容...
EOF

或者

:<<'
注释内容...
注释内容...
注释内容...
'

(3) shell变量

① 定义变量:

variable_name="czbk"

变量名和等号之间不能有空格,同时,变量名的命名须遵循如下规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

有效的 Shell 变量名示例如下:

RUNOOB
LD_LIBRARY_PATH
_var
var2

无效的变量命名:

?var=123
user*name=runoob

② 使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

[root@localhost 桌面]# vi sh.sh
#!/bin/bash
username="zhangsan"
echo $username
echo ${username}	# 变量名外面的花括号是可选的,加不加都行
echo "你好,传智播客"

[root@localhost 桌面]# ./sh.sh
zhangsan
zhangsan
你好,传智播客

变量名外面的花括号是可选的,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

#!/bin/bash
username="zhangsan"
echo "${username}你好!!!"

通过上面的脚本我们发现,如果不给username变量加花括号,写成echo " u s e r n a m e 你 好 ! ! ! " , 解 释 器 s h e l l 就 会 把 username你好!!!",解释器shell就会把 username"shellusername当成一个变量,如果我们前面没有定义username变量,那么解释器执行执行的结果自然就为空了。这里我们推荐给所有变量加上花括号,这也是一个好的编程习惯。

③ 只读变量

这里的只读变量类似于final变量,不允许被修改,使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。下面的例子尝试更改只读变量,结果报错:

#!/bin/bash
username="zhangzhang"
readonly username
username="lisi"

[root@localhost 桌面]# ./sh.sh
./sh.sh:行4: username: 只读变量

④ 删除变量

使用 unset 命令可以删除变量。语法:

[root@localhost 桌面]# vi sh.sh
#!/bin/bash
username="zhangsan"
unset username
echo $username
echo "程序结束了"

[root@localhost 桌面]# ./sh.sh

程序结束了
[root@localhost 桌面]#

变量被删除后不能再次使用。unset 命令不能删除只读变量。

删除这个变量,然后通过echo进行输出,结果是就是为空,没有任何的结果输出。

(4) shell 字符串

字符串可以用单引号,双引号,不用引号。

单引号

str='this is a string variable'

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单独一个的单引号(使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号

[root@localhost 桌面]# vi sh.sh
#!/bin/bash
username='frank'
str="Hello,  \"$username\"! \n"
echo -e $str

[root@localhost 桌面]# ./sh.sh
Hello, "frank"! 

[root@localhost 桌面]# 

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

拼接字符串

#!/bin/bash
username="zhangsan"
# 使用双引号拼接
greet="hello,"${username}"!"
greet1="hello,${username}!"
echo $greet $greet1

[root@localhost 桌面]# ./sh.sh
hello,zhangsan! hello,zhangsan!

获取字符串长度

[root@localhost 桌面]# username="zhangsan"
[root@localhost 桌面]# echo $username
zhangsan
[root@localhost 桌面]# echo ${#username}
8
[root@localhost 桌面]# 

提取字符串

实例从字符串第 2 个字符开始截取 4 个字符:

[root@localhost 桌面]# username="zhangsan"
[root@localhost 桌面]# echo ${username:1:4}
hang
[root@localhost 桌面]# 

通过截取我们发现,它的下标和我们在java中的读取方式是一样的,下标也是从0开始。

(5) shell数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

定义数组

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。如下:

格式:数组名=(值1 值2 ... 值n)

例如:array_name=(value0 value1 value2 value3)

或者:
    array_name=(
    value0
    value1
    value2
    value3
    )

通过下标定义数组中的其中一个元素:

[root@localhost 桌面]# vi sh.sh
#!/bin/bash
# 数组的小练习

# 定义一个数组
username=(n1 n2 n3 n4 n5)
# 给数组中的元素赋值
username[0]=A

# 获取数组中的元素
echo ${username[0]}
echo ${username[1]}

# 获取数组的长度
echo "数组的长度${#username[*]}"
echo "数组的长度${#username[@]}"

[root@localhost 桌面]# ./sh.sh
A
n2
数组的长度5
数组的长度5
读取数组格式:${数组名[下标]}

使用 @ 符号可以获取数组中的所有元素,例如:

[root@localhost 桌面]# vi sh.sh
#!/bin/bash
username=(n1 n2 n3 n4 n5)
echo ${username[@]}

[root@localhost 桌面]# ./sh.sh
A n2 n3 n4 n5

获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

# 取得数组元素的个数
length=${#username[@]}
# 或者
length=${#username[*]}

下面,我们通过一个例子,定义数组、提取数组元素的例子来验证下

[root@localhost 桌面]# vi sh.sh
#! /bin/bash
g=(a b c d e f)
echo "数组下标为2的数据为:" ${g[2]}
echo "数组所有数据为:" ${#g[@]}
echo "数组所有数据为:" ${#g[*]}

[root@localhost 桌面]# ./sh.sh
数组下标为2的数据为: c
数组所有数据为: 6
数组所有数据为: 6

(6) shell运算符

Shell 和其他编程一样,支持包括:算术、关系、布尔、字符串等运算符。

原生 bash **不支持 **简单的数学运算,但是可以通过其他命令来实现,例如expr。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加,我们还是利用上面的例子test-shell.sh

1、算数运算符

val=`expr 2 + 2`
echo "相加之后的结果为:" $val

相加之后的结果为:4

注意:

表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2。

完整的表达式要被 ` 包含,注意不是单引号。

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
+加法expr $a + $b 结果为 30。
-减法expr $a - $b 结果为 -10。
*乘法expr $a \* $b 结果为 200。
/除法expr $b / $a 结果为 2。
%取余expr $b % $a 结果为 0。
=赋值a=$b 将把变量 b 的值赋给 a。
==相等。用于比较两个数字,相同则返回 true。[ $a == $b ] 返回 false。
!=不相等。用于比较两个数字,不相同则返回 true。[ $a != $b ] 返回 true。

**注意:**条件表达式要放在方括号之间,并且要有空格,例如: [ a = = a== a==b] 是错误的,必须写成 [ $a == $b ]

下面是运算符shell脚本(还是采用之前的例子test-shell.sh )w

#! /bin/bash
#g=(a b c d e f)
#echo "数组下标为2的数据为:" ${g[2]}
#echo  "数组所有数据为:"  ${#g[@]}
#echo  "数组所有数据为:"   ${#g[*]}
:<<EOF
val= `expr 2 + 2`
echo "相加之后的结果为:" $val
EOF

a=4
b=20
echo “加法运算”  `expr $a + $b`
echo “减法运算”  `expr $a - $b`
echo “乘法运算,注意*号前面需要反斜杠” ` expr $a \* $b`
echo “除法运算”  `expr  $b / $a`
((a++))
echo "a = $a"
c=$((a + b)) 
d=$[a + b]
echo "c = $c"
echo "d = $d"

上面的shell命令#开头的为单行注释

:<<EOF 开头和EOF结尾的为多行注释

执行效果如下

在这里插入图片描述

2、字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:

运算符说明举例
=检测两个字符串是否相等,相等返回 true。[ $a = $b ] 返回 false。
!=检测两个字符串是否相等,不相等返回 true。[ $a != $b ] 返回 true。
-z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false。
-n检测字符串长度是否为0,不为0返回 true。[ -n “$a” ] 返回 true。
$检测字符串是否为空,不为空返回 true。[ $a ] 返回 true。

字符串运算符实例如下(还是采用之前的例子test-shell.sh ):

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
 

执行效果如下

在这里插入图片描述

3、关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 false。
-ne检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false。
-lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。[ $a -ge $b ] 返回 false。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true。

关系运算符(还是采用之前的例子test-shell.sh )

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

执行效果如下:
在这里插入图片描述

4、布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
!非运算,表达式为 true 则返回 false,否则返回 true。[ ! false ] 返回 true。
-o或运算,有一个表达式为 true 则返回 true。[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a与运算,两个表达式都为 true 才返回 true。[ $a -lt 20 -a $b -gt 100 ] 返回 false。

布尔运算符实例如下(还是采用之前的例子test-shell.sh ):

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

执行效果如下

在这里插入图片描述

5、逻辑运算符

假定变量 a 为 10,变量 b 为 20:

运算符说明举例
&&逻辑的 AND[[ $a -lt 100 && $b -gt 100 ]] 返回 false
||逻辑的 OR[[ $a -lt 100 || $b -gt 100 ]] 返回 true

逻辑运算符实例如下(还是采用之前的例子test-shell.sh ):

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

执行效果如下

在这里插入图片描述

(7) shell流程控制

在前面的Java SE课程中,我们学习了很多的流程控制语句,比如有if-else、if else-if else、switch、for、while等语句;
在shell编程中,我们同样也有这些流程控制,只是语法和java SE有所区别,但是目的是一样的。

1、if 语句:

主要用于判断,相当于java se中的if,我们还是采用之前的例子test-shell.sh

if condition
then
    command1 
    command2
    ...
    commandN 
fi

比如,我们现在通过前面学习的知识查找一个进程,如果进程存在就打印true

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

注意

末尾的fi就是if倒过来拼写

执行效果如下

在这里插入图片描述

2、if else 语句:

主要用于判断,相当于java se中的if else,我们还是采用之前的例子test-shell.sh。

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

上接上面的例子,如果找不到sshAAA**(此处可以随便输入一个)**进程,我们就打印false

if [ $(ps -ef | grep -c "sshAAA") -gt 1 ]; then echo "true";  else echo "false"; fi

执行效果如下
在这里插入图片描述

3、if else-if else 语句:

主要用于判断,相当于java se中的if else-if else

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

以下实例判断两个变量是否相等

我们继续使用上面的例子(test-shell.sh )

a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi

执行效果如下

在这里插入图片描述

4、for 循环

主要用于循环,相当于java se中的for循环,我们还是采用之前的例子test-shell.sh

for循环格式为

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

顺序输出当前列表中的字母:

for loop in A B C D E F G 
do
    echo "顺序输出字母为: $loop"
done

执行效果如下

在这里插入图片描述

5、while循环

主要用于循环,相当于java se中的while循环

while循环用于不断执行一系列命令,也用于从输入文件中读取数据

语法格式为

while condition
do
    command
done

以下是一个基本的while循环,测试条件是:如果int小于等于10,那么条件返回真。int从0开始,每次循环处理时,int加1。

还是采用之前的例子test-shell.sh

#!/bin/bash
int=1
while(( $int<=10 ))
do
    echo "输出的值为:"$int
    let "int++"
done

执行效果如下图

在这里插入图片描述

6、case … esac语句

主要用于分支条件选择,相当于java se中的switch case循环

case … esac 与其他语言中的 switch … case 语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句,esac(就是 case 反过来)作为结束标记。

还是采用之前的例子test-shell.sh

case … esac 语法格式如下:

casein
模式1)
    command1
    command2
    command3
    ;;
模式2)
    command1
    command2
    command3
    ;;
*)
    command1
    command2
    command3
    ;;
esac

case 后为取值,值可以为变量或常数。

值后为关键字 in,接下来是匹配的各种模式,每一模式最后必须以右括号结束,模式支持正则表达式。

下面通过v的值进行case–esac

v="czbk"

case "$v" in
   "czbk") echo "传智播客"
   ;;
   "baidu") echo "baidu 搜索"
   ;;
   "google") echo "google 搜索"
   ;;
esac

执行效果如下

在这里插入图片描述

(7) shell函数

我们将要学习的shell函数,我们可以理解成在Java SE阶段我们学习的方法,它和shell函数的作用是一样的。

函数语法如下:

[ function ] funname [()]

{

    action;

    [return int;]

}

注意:

  • 1、可以使用function fun() 定义函数,也可以直接fun() 定义,不带任何参数。
  • 2、函数参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255

下面我们将定义一个函数,并发生函数调用

还是采用之前的例子test-shell.sh

#!/bin/bash

czbk(){
    echo "这是第一个函数!"
}
echo "-----这里是函数开始执行-----"
czbk
echo "-----这里是函数执行完毕-----"

执行效果如下图

在这里插入图片描述

下面,我们定义一个带有return语句的函数:

function czbk(){
    echo "对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
}
czbk
echo "输入的两个数字之和为 $? !"

注意:

函数返回值在调用该函数后通过 $? 来获得。

注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

(8) 总结

在企业级开发过程中,我们(开发人员)学习Linux主要的目的就是在Linux系统中能够熟练的操作目录、文件,还有就是通过所学的命令系统化的编写sh文件,所以,在当前章节中,我们要熟练的编写shell脚本相关命令以及综合案例中的知识点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值