• Linux初探 - 概念上的理解和常见指令的使用


    目录

    Linux的背景

    Linux发展史

    GNU

    应用场景

    发行版本

    从概念上认识Linux

    操作系统的概念

    用户的概念

    路径与目录

    Linux下的文件

    时间戳的概念

    文件的常规权限

    文件的特殊权限

    Shell的概念

    控制台指令的概念


    Linux的背景

    Linux发展史

    1991年10月5日,赫尔辛基大学的一名研究生Linus Benedict Torvalds在一个Usenet新闻组
    (comp.os.minix)中宣布他编制出了一种类似UNIX的小操作系统,叫Linux。新的操作系统是受到另一个UNIX的小操作系统——Minix的启发,该系统是由一名叫Andrew S Tanenbaum的教师开发的。读者也许猜想所发布的这个系统应该是Linux的0.01版本,实际上不是这样。真正的Linux 0.01版本并没有被发布,原因是0.01版本不实用。Linus仅仅在第一个Linux的FTP站点ftp://nic.funet.fi上提供过这个版本的的源代码。Torvalds于10月5日发布的这个Linux版本被称为0.02版,它能够运行GNU BourneAgainShell(bash)和GNU的C编译程序(gcc)以及为数不多的其它语言。Torvalds绝对没有想到他设想的一种能够针对高级业余爱好者和黑客们的操作系统已经产生,这就是人们所称的Linux。Linux发布时的版本是0.02,后来又有0.03版,然后又跳到0.10版。因为世界各地越来越多的程序员都开始开Linux,它已经达到0.95版。这就意味着正是公布1.0版本的时间已经为期不远了。正式的1.0版本是在1994年公布的Linux是一种自由和开放源代码的类UNIX操作系统,该操作系统的内核由林纳斯托瓦兹在1991年首次发布,之后,在加上用户空间的应用程序之后,就成为了Linux操作系统。严格来讲,Linux只是操作系统内核本身,但通常采用“Linux内核”来表达该意思。而Linux则常用来指基于Linux内核的完整操作系统,它包括GUI组件和许多其他实用工具。

    GNU

    GNU是一个非盈利组织, 于1983年由Richard Stallman(rms)发起,意在为所有软件用户能够自由控制自己的计算而构建一款由大家共同努力开发而成的操作系统。rms今天仍然是GNU的首席搞事者。GNU的基本目标和一贯目标是提供一个和Unix兼容的100% 自由软件的操作系统。不是95%、也不是99.5%、而是100%自由。这个系统的名字叫GNU,是GNU's Not Unix的首字母递归缩写—这是对Unix的技术思想致敬的一种方法,同时表达GNU有所不同。从技术上说,GNU很像Unix。但是它不同于Unix,GNU给予其用户自由。
    GNU由自由软件基金会以多种方式支持,这也是由rms创建的倡导自由软件理念的非盈利组织。FSF还接受版权合约和免责声明,因此它可以为GNU程序打官司。(更确切地说,为GNU贡献程序不要求把版权转交给FSF。如果你赋予FSF版权,FSF在有人违反GPL时会执行版权;如果你保留版权,那么你自己负责执行版权。)

    GNU通用公共许可协议(GNU General Public License,简称GNU GPL或GPL),是一个广泛被使用的自由软件许可协议条款,最初由理查德斯托曼为GNU计划而撰写,GPL给予了计算机程序自由软件的定义, 任何基于GPL软件开发衍生的产品在发布时必须采用GPL许可证方式,且必须公开源代码,Linux是自由软件和开放源代码软件发展中最著名的例子。只要遵循GNU通用公共许可证,任何个人和机构都可以自由地使用Linux的所有底层源代码,也可以自由地修改和再发布。随着Linux操作系统飞速发展,各种集成在Linux上的开源软件和实用工具也得到了应用和普及,因此,Linux也成为了开源软件的代名词。

    应用场景

    • Linux在服务器领域

    随着开源软件在世界范围内影响力日益增强,Linux服务器操作系统在整个服务器操作系统市场格局中占据了越来越多的市场份额,已经形成了大规模市场应用的局面。并且保持着快速的增长率。尤其在政府、金融、农业、交通、电信等国家关键领域。此外,考虑到Linux的快速成长性以及国家相关政策的扶持力度,Linux服务器产品一定能够冲击更大的服务器市场。据权威部门统计,目前Linux在服务器领域已经占据75%的市场份额,同时,Linux在服务器市场的迅速崛已经引起全球IT产业的高度关注,并以强劲的势头成为服务器操作系统领域中的中坚力量。

    • Linux在桌面领域

    近年来,特别在国内市场,Linux桌面操作系统的发展趋势非常迅猛。国内如中标麒麟Linux、红旗
    Linux、深度Linux等系统软件厂商都推出的Linux桌面操作系统,目前已经在政府、企业、OEM等领域得到了广泛应用。另外SUSE、Ubuntu也相继推出了基于Linux的桌面系统,特别是Ubuntu Linux,已经积累了大量社区用户。但是,从系统的整体功能、性能来看,Linux桌面系统Windows系列相比还有一定的差距,主要表现在系统易用性、系统管理、软硬件兼容性、软件的丰富程度等方面。

    • Linux在移动嵌入式领域

    Linux的低成本、强大的定制功能以及良好的移植性能,使得Linux在嵌入式系统方面也得到广泛应用,目前Linux以广泛应用于手机、平板电脑、路由器、电视和电子游戏机等领域。在移动设备上广泛使用的Android操作系统就是创建在Linux内核之上的。目前,Android已经成为全球最流行的智能手机操作系统,据2015年权威部门最新统计,Android操作系统的全球市场份额已达84.6%。此外,思科在网络防火墙和路由器也使用了定制的Linux,阿里云也开发了一套基于Linux的操作系统“YunOS”,可用于智能手机、平板电脑和网络电视;常见的数字视频录像机、舞台灯光控制系统等都在逐渐采用定制版本的Linux来实现,而这一切均归功与Linux与开源的力量。

    • Linux在云计算、大数据领域

    互联网产业的迅猛发展,促使云计算、大数据产业的形成并快速发展,云计算、大数据作为一个基于开源软件的平台,Linux占据了核心优势;据Linux基金会的研究,86%的企业已经使用Linux操作系统进行云计算、大数据平台的构建,目前,Linux已开始取代Unix成为最受青睐的云计算、大数据平台操作系统。

    发行版本

    这些发行版本其实本质上都是基于Linux拓展而来的,所以它们的指令等大多数是互通的,在操作系统选择时并不需要过于纠结。对Linux版本感兴趣可以访问:The Linux Kernel Archives

    • Debian

    Debian运行起来极其稳定,这使得它非常适合用于服务器。 Debian这款操作系统无疑并不适合新手用户,而是适合系统管理员和高级用户。

    • Ubuntu

    Ubuntu是Debian的一款衍生版,也是当今最受欢迎的免费操作系统。Ubuntu侧重于它在这个市场的应用,在服务器、云计算、甚至一些运行Ubuntu Linux的移动设备上很常见。Ubuntu是新手用户肯定爱不释手的一款操作系统。

    • 红帽企业级Linux

    这是第一款面向商业市场的Linux发行版。它有服务器版本,支持众多处理器架构,包括x86和x86_64。红帽公司通过课程红帽认证系统管理员、红帽认证工程师(RHCSA/RHCE),对系统管理员进行培训和认证。

    • CentOS

    CentOS是一款企业级Linux发行版,它使用红帽企业级Linux中的免费源代码重新构建而成。这款重构版完全去掉了注册商标以及Binary程序包方面一个非常细微的变化。有些人不想支付一大笔钱,又能领略红帽企业级Linux,对他们来说,CentOS值得一试。此外,CentOS的外观和行为似乎与母发行版红帽企业级Linux如出一辙。 CentOS使用YUM来管理软件包。

    • Fedora

    小巧的Fedora适合那些人想尝试最先进的技术,等不及程序的稳定版出来的人。其实,Fedora就是红帽公司的一个测试平台,在成为企业级发行版之前,在该平台上进行开发和测试。Fedora是一款非常好的发行版,有庞大的用户论坛,软件库中还有为数不少的软件包。

    • Kali Linux

    Kali Linux是Debian的一款衍生版。Kali旨在用于渗透测试。Kali的前身是Backtrack。用于Debian的所有Binary软件包都可以安装到Kali Linux上,而Kali的魅力或威力就来自于此。此外,支持Debian的用户论坛为Kali加分不少。Kali随带许多的渗透测试工具,无论是Wifi、数据库还是其他任何工具,都设计成立马可以使用。Kali使用APT来管理软件包。


    Linux有多个发行版本,我们可以根据需要选择系统进行环境搭建,一般国内常用的是Centos和Ubuntu。而Linux搭建环境的方式主要有三种:

    1、直接安装在物理机上. 但是由于 Linux 桌面使用起来非常不友好, 不推荐。

    2、使用虚拟机软件,将 Linux 搭建在虚拟机上,但是由于当前的虚拟机软件,如 VMWare 之类的,但新手安装时可能会出现一些 bug,导致出现各种莫名其妙的问题,比较折腾。

    3、使用云服务器, 可以直接在 腾讯云、阿里云、华为云 等直接购买一个云服务器,直接一键安装比较方便,就是需要花钱。

    从概念上认识Linux操作系统

    操作系统的概念

    计算机的层次结构

    计算机可以说是由硬件和软件两大部分所构成的,可以细分为如下7个层次:

    670a65e0aceb4053ba781392b22fbb38.jpeg

    也可以简化为如下的四个层次:

    74086160cfda4ecc9c2d38d46d7d0ca8.png

    从上面的简化示意图可以看到,操作系统介于硬件和应用软件之间。操作系统的本质就是软件,是一款能够进行软硬件之间资源管理的软件。那么为什么要有操作系统呢?一方面,操作系统提供一系列底层接口和上层标准,“抹平”不同电脑之间的硬件差异,这样只要操作系统相同,硬件能达到软件运行的最低标准,理论上这个软件就能互通。此外,操作系统可以为所有程序分配资源,一切程序要调用计算机资源都需要向操作系统申请权限,这样就能最大程度利用计算机资源同时让各种程序不互相冲突。简而言之,操作系统在计算机系统中承上启下的地位:向下封装硬件,向上提供操作接口。

    3853e933c5fe4062a569ff49bc2cb294.png

    而我们平时编写的程序,也都是访问了硬件的,例如printf是在显示器上打印数据,加减等操作需要访问CPU。而从应用程序到硬件之间,也就必定经过了操作系统,调用了操作系统对应的接口。也就是说,操作系统可以看作是一个中介,用于应用程序和硬件之间的交互,起到了防止应用程序的不当操作对硬件造成损坏和调配实际的硬件资源等作用。

    用户的概念

    在Linux操作系统中,用户是指使用计算机系统的个体或实体。每个用户都有一个唯一的用户名,用于识别他们并允许他们访问系统资源和执行任务。
    同时,Linux是一个多用户操作系统,这意味着多个用户可以同时使用同一台计算机,并且系统能够有效地管理这些用户,确保他们的数据和任务彼此隔离。每个用户都有自己的权限和设置,包括文件和目录的访问权限、家目录(用于存储个人文件和配置信息)、登录密码等。用户可以通过登录到系统来执行各种任务,例如运行程序、编辑文件、管理系统配置等。
    在Linux中,有一个管理员用户,也称root用户,它拥有系统的最高权限,任何操作都不受权限的约束。然而,出于安全原因,通常情况下不以root用户身份工作,而是使用sudo等机制来以非特权用户的身份执行系统管理任务。

    如下是有关Linux用户的相关概念:

    1. root用户:root用户是系统的超级用户,具有最高级别的权限。root用户可以执行系统范围的任务,如安装软件、更改系统配置等。因为root用户的权限很高,所以需要小心使用,以免造成系统损坏。
    2. 用户账户:用户账户是Linux系统中的个体标识,用于让不同的用户访问系统资源和执行任务。每个用户账户都有一个唯一的用户名,通常由小写字母、数字和一些特殊字符组成。
    3. 用户组:用户组是一组用户的集合,它们可以共享相同的权限和访问特定资源。每个用户至少属于一个主要用户组,并且可以属于多个附加用户组。
    4. 用户ID (UID):每个用户账户都有一个唯一的数字标识,称为用户ID (UID)。UID用于内部系统管理,通常不会被用户直接使用。对应的,也有用户组ID(GID)。
    5. 家目录:每个用户都有一个自己的家目录,用于存储个人文件和配置信息。通常,家目录的路径为/home/用户名,其中"用户名"是实际的用户名。
    6. 创建和管理用户:系统管理员可以使用工具如useradduserdelusermod来创建、删除和管理用户账户。还可以使用passwd命令更改用户密码。
    7. 新增用户通常使用useradd指令,紧接着要用passwd指令设置密码,然后可以用su指令切换用户。

    路径与目录

    路径分隔符

    Windows下的路径分隔符为:\

    例如 D:\用户\Documents\学习资料。

    Linux下的路径分隔符为:/

    例如 /root。


    相对路径和绝对路径

    绝对路径:从根目录开始的路径,一直都是有效的。一般在配置文件中使用。绝对路径是从根目录开始的,所以使用时起始位置是根目录。例如:/home/ytc。

    相对路径:相对当前所在的目录的路径。有自己的有效范围的。常用于日常使用,比如命令行输入等。相对路径的开头是一般来说,如果没有指定起始目录,Linux默认把路径或文件看作是相对当前目录的。所以使用相对路径时既可以写 ./ 也可以不写。


    目录

    Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。这样设计的一个好处之一就是每一个文件都有唯一的路径与之对应,有效地避免了混淆的问题。

    其中,根目录、家目录、当前目录和上级目录,是4个常用的概念,在这里额外介绍一下:

    1、根目录:

    根目录是整个文件系统的顶层目录,用斜杠符号"/"表示。所有其他目录和文件都位于根目录之下,它是文件系统的起点。
    2、家目录:

    家目录是每个用户的个人目录,用于存储用户的个人文件和设置,用波浪号"~"表示。每个用户都有一个特定的家目录,通常以其用户名命名,例如 /home/user1。用户在家目录中可以存储私人文件和设置。
    3、当前目录:

    当前目录表示当前所在的工作目录,也称为工作目录,用"."表示。不需要提供完整的路径时,所有命令和文件操作都默认在当前目录中进行。
    4、上级目录:

    上级目录也称为父目录。用".."表示。这是一种导航到目录树上一级的一种很方便的方式,例如从 /home/user1/documents 导航到 /home/user1。

    342dad8201e04238aec8271164852185.png
    摘自菜鸟教程

    如下是对一些常见目录说明:

    目录

    说明

    /bin

    存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里。

    /etc

    存放系统管理和配置文件

    /home

    存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示

    /usr

    用于存放系统应用程序,比较重要的目录/usr/local 本地系统管理员软件安装目录(安装系统级的应用)。这是最庞大的目录,要用到的应用程序和文件几乎都在这个目录。

    /usr/x11r6 存放x window的目录

    /usr/bin 众多的应用程序  

    /usr/sbin 超级用户的一些管理程序  

    /usr/doc linux文档  

    /usr/include linux下开发和编译应用程序所需要的头文件  

    /usr/lib 常用的动态链接库和软件包的配置文件  

    /usr/man 帮助文档  

    /usr/src 源代码,linux内核的源代码就放在/usr/src/linux里  

    /usr/local/bin 本地增加的命令  

    /usr/local/lib 本地增加的库

    /opt

    额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把tomcat等都安装到这里。

    /proc

    虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息。

    /root

    超级用户(系统管理员)的主目录。

    /sbin

    存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等。

    /dev

    用于存放设备文件。

    /mnt

    系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统。

    /boot

    存放用于系统引导时使用的各种文件

    /lib

    存放跟文件系统中的程序运行所需要的共享库及内核模块。共享库又叫动态链接共享库,作用类似windows里的.dll文件,存放了根文件系统程序运行所需的共享文件。

    /tmp

    用于存放各种临时文件,是公用的临时文件存储点。

    /var

    用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等。

    /lost+found

    这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里

    Linux下的文件

    文件的种类

    在Windows中,我们是以文件的后缀来定义文件的类型的。但在Linux中却不是,如下是Linux中的文件类型区分:

    1. 普通文件:用 - 来表示。这些文件包含文本、二进制数据或程序代码等内容。
    2. 目录文件:用 d 来表示。目录是用于组织和存储其他文件和目录的特殊文件。
    3. 符号链接:用 l 来表示。符号链接是指向其他文件或目录的引用。
    4. 字符设备文件:用 c 来表示。字符设备文件用于和字符设备(如终端、键盘)等之间进行通信。
    5. 块设备文件:用 b 来表示。块设备文件用于与块设备(如硬盘、SSD)进行通信。
    6. 管道文件:用 p 来表示。命名管道用于进程间通信。
    7. 套接字:用 s 来表示。套接字用于进程间的网络通信。

    在ls -l命令的输出中,第一个字符通常用于指示文件的类型。这有助于用户快速识别不同类型的文件。例如,如果第一个字符是 d,则表示这是一个目录,如果是 -,则表示这是一个普通文件,依此类推。这是Linux文件系统的一种常见惯例,有助于文件的管理和识别。

    需要注意的是,虽然Linux中不以后缀区分文件的类型,但有些软件(如gcc、g++等)是需要处理指定后缀的文件才可以正常操作的。

    当然,其实细分的话也许不止这些,例如以.开头的表示隐藏文件(默认不显示)等。但这有些过于细分了,所以一般说的文件类型就是上面那7个。


    Linux下一切皆文件

    "Linux下一切皆文件" 是一个广为流传的说法,它强调了Linux操作系统的一个重要原则:在Linux中,一切都可以被表示为文件。这个原则有助于使Linux系统的设计更加一致和统一,同时也提供了许多优势,比如可以使用相似的命令和工具来处理各种类型的数据。

    如下是一些常用的相关内容:

    1. 文件系统层次结构:在Linux系统中,所有的文件和目录都组织成一个树状结构,从根目录开始,所有的文件和目录都是根目录的子目录或文件。这种层次结构允许用户和程序以一致的方式访问和管理文件。

    2. 设备文件:在Linux中,硬件设备也被表示为文件。例如,硬盘驱动器可以通过文件路径(如/dev/sda)来访问,这使得可以使用文件I/O操作来读取和写入设备。

    3. 虚拟文件系统:Linux还提供了一个虚拟文件系统(Virtual File System,VFS)层,它允许不同的文件系统(如ext4、NTFS、FAT32等)以统一的方式与应用程序交互。这意味着你可以使用相同的文件操作命令来处理不同类型的文件系统。

    4. 管道和套接字:Linux中的管道和套接字也被视为文件。这使得进程之间的通信更加简单,因为可以使用标准的文件I/O操作来发送和接收数据。


    文件 = 内容 + 属性

    文件=内容+属性,这个概念是指文件是由内容和属性两部分构成的:

    1. 内容:指文件实际包含的数据。内容可以是文本、二进制数据、程序代码等等,取决于文件的类型和用途。

    2. 属性:这是文件的元数据信息,包括文件的各种性质和特性。这些属性包括文件的种类、权限、链接数量、所归属用户、所属用户组以及时间戳等等。除了上述的这些基础属性,Linux中还有一些隐藏属性,可以通过chattr命令修改一个文件的隐藏属性,通过lsattr命令查看一个文件的隐藏属性,这里就不展开来讲了。

    下面就举个例子简单介绍一下文件的属性:

    例如下方是执行了ls -l之后显示的内容

    26dfa054d16540a7bc8f5092dafe8bf1.png

    我们单独抽出test文件来分析

    078dcc17d6ce4cf69c0a437d34577fe1.png

    首先,首字符d表示这是一个目录文件。后面的9个字符分别表示用户的权限属性,前三个字符(rwx)表示所有者的权限,中间三个字符(r-x)表示所属组的权限,后三个字符(r-x)表示其他用户的权限。至于权限是什么,后面会说的。
    接着第一个root表示这个文件的拥有者是root,第二个root的表示这个文件的所属组是root。4096表示的是文件大小,单位是字节(byte)。"7月24 17:50"表示文档的最后修改时间(注意不是创建时间)。最后的test表示文件名,如果文件名以点(.)开头表示这是隐藏文件。

    时间戳的概念

    在Linux中,时间戳是一个用于表示时间的数值。它通常以秒为单位,从某个特定的起始点开始计算时间的流逝。有两种主要类型的时间戳:Unix时间戳和文件时间戳。

    Unix时间戳,也称为Epoch时间戳,是从1970年1月1日00:00:00 UTC(协调世界时)开始计算的秒数。这个时间点被称为“Unix纪元”或“Epoch”。Unix时间戳是一个整数,表示从Epoch开始到特定时间的秒数。

    文件时间戳,Linux系统中的文件都有三个与时间相关的时间戳属性:访问时间(atime)、修改时间(mtime)、变化时间(ctime)。这些时间戳以Unix时间戳的形式存储,但它们代表不同的含义。在文件时间戳中,可以手动更改这些时间戳,但通常它们由系统自动更新。

    如下是文件的三种时间戳详解:

    名称概念
    Access - 访问时间 - atime文件最后一次被读取的时间。比如more、cat等命令就会修改atime,而ls、stat等命令则不会。
    Modify - 修改时间 - mtime文件内容最后一次被修改的时间。比如vim操作后保存文件就会修改mtime。ls -l列出的就是这个时间。
    Change - 状态改动时间 - ctime文件属性最后一次被修改的时间,通过chmod、chown等命令修改一次文件属性,这个时间就会更新。

    一个值得注意的小点是,时间也是属性,所以如果access-time变了,change-time也会改变。
    而且access-time的修改策略也不是单纯的cat一次就会修改的,它规定,只有没有任何修改的访问,达到指定次数之后,才会修改一次access-time,以防止access-time频繁修改,提高效率。

    时间戳的展示如下:

    其中,最后的那个+0800是指的时区。

    文件的常规权限

    文件的拥有者、所属组和其它

    在Linux中,每个文件都有拥有者、所属组和其他这三个身份。如下是关于这些身份的详细信息:

    拥有者(Owner):

    文件的拥有者是创建该文件或目录的用户。拥有者通常具有对文件或目录的最高权限,可以读取、写入和执行它们,也可以修改其权限。通常情况下,拥有者可以是文件的创建者或最后修改者。

    所属组(Group):

    每个文件都与一个所属组相关联,这是一个用户组的标识。所属组的成员具有一定的权限,通常比其他用户更多,但比拥有者少。这允许多个用户在同一组中协作访问和编辑文件,而不必拥有者共享他们的权限。

    其他(Others):

    "其他" 是除文件的拥有者和所属组之外的用户身份,权限分配给其他用户通常较少。如果一个文件或目录不是公开共享的,通常需要限制其他用户的权限以增强安全性。


    权限的种类

    一般来说,Linux下一个文件的权限种类有三种:(除此之外还有三种特殊权限,后面再说)

    • 读(R):读权限控制用户是否可以读取文件的内容。用字母"r"表示。例如,读取文件内容,读取目录内容(查看目录的文件列表)等所需要的就是读权限。
    • 写(W):写权限控制用户是否可以修改或删除文件的内容。用字母"w"表示。例如,修改文件内容,对目录下的文件进行创建和删除等所需要的就是写权限(也就是说要删除一个文件是看当前用户在当前目录中是否有写权限)。
    • 执行(X):执行权限控制用户是否可以执行。在权限表示中用字母"x"表示。例如,运行一个编译成功的可执行程序,进入一个目录等需要的就是执行权限。

    如果想要修改权限,可以使用chmod指令。


    权限的表示

    在Linux中,权限的表示方式有两种,分别是字符表示和数字表示:

    • 字符表示

    字符表示是使用字符来表示文件或目录的权限,通常由九个字符组成,分为三组,每组三个字符,分别表示文件所有者、文件所属组和其他用户的权限。这三个字符分别代表读(r)、写(w)、执行(x)权限。例如:rwxr-xr-x:表示文件所有者具有读、写和执行权限,而所属组和其他用户只有读和执行权限。

    0aaaa37476bd4d57950035129e690a46.png

    • 数字表示

    数字方式是使用三个八进制数字(因为每个身份对应的权限只有2^3=8种,从0开始最大为7)来表示文件或目录的权限。每个数字代表一组权限,从左到右分别表示文件所有者、所属组和其他用户的权限。每个数字的值是权限的组合,例如:
    4:读权限(r) 2:写权限(w)    1:执行权限(x)

    0e5b592bfe38400b84a63c1fb225988c.png


    默认权限和权限掩码

    这里说的默认权限是指不考虑权限掩码的情况下,文件的初始权限。其中,普通文件默认不提供执行权限,所以默认权限是666;目录和可执行程序(gcc生成的等)一般默认提供执行权限,所以默认权限是777。

    但默认权限并不是最终的权限,还需要经过一个权限掩码。那么权限掩码是什么呢?

    在Linux下,权限掩码(umask)是一个重要的概念,用于确定新创建文件和目录的默认权限。权限掩码是一个八进制数,用来掩盖文件和目录权限中的特定位。权限掩码的工作原理是,它会从文件和目录的默认权限中去掉指定的位,从而限制新创建文件和目录的权限。
    Linux中的umask通常是一个4位数字,每一位分别代表不同的文件权限位:

    第一位:文件的特殊权限。包括设置用户ID(SUID)、设置组ID(SGID)和粘滞位 (Sticky Bit)。
    第二位:掩盖新创建文件的所有者(Owner)权限。
    第三位:掩盖新创建文件的组(Group)权限。
    第四位:掩盖新创建文件的其他(Others)权限。

    对于 umask 指令的权限掩码,第一个字符通常用来表示特殊权限,而不是常规的文件权限,特殊权限在文件和目录上有不同的含义。至于何为特殊权限,后面会讲。

    普通用户在设置 umask 时不需要显式设置特殊权限,因为它们会根据系统和文件默认规则自动分配。特殊权限通常由系统管理员在特定情况下设置,以确保文件和目录的安全性和访问控制。所以,特殊权限我们现在可以不管,主要是看后3位。要注意,在计算时并不是直接减的,而是用按位与计算的,即最终权限=起始权限&权限掩码。可以理解为把对应的权限掩码给ban掉。

    例如,如果权限掩码为0022,当创建一个目录时,理论上权限为777(rwx rwx rwx),但由于权限掩码的影响,要在原有的基础上去掉022(--- -w- -w-)权限。那么最终的权限就为755(rwx r-x r-x)。

    权限掩码与umask指令息息相关,umask指令:

    umask:

            umask [-p] [-S] [MODE]
        显示或设定文件模式掩码。
        设定用户文件创建掩码为 MODE 。如果省略了 MODE,则打印当前掩码的值。
        如果 MODE 模式以数字开头,则被当作八进制数解析;否则是一个chmod(1) 可接收的符号模式串。
        选项:
          -p    如果省略 MODE 模式,以可重用为输入的格式输入
          -S    以符号形式输出,否则以八进制数格式输出

    常见的用法就是直接umask——获取权限掩码。或者umsak加数字,修改权限掩码。如果umask要通过字符修改权限掩码的话,和chmod操作一样,不过会相对麻烦一些,不推荐这样使用。

    用法示例:

    650d1bf1d65f4354a02ec5e44f842b48.png

    文件的特殊权限

    除了常见的读取(r)、写入(w)和执行(x)权限外,还有特殊权限:SUID(Set User ID)、SGID(Set Group ID)、Sticky Bit(粘滞位)。

    概念

    SUID(Set User ID)

    SUID标志允许一个可执行文件在执行时暂时以文件所有者的执行权限来运行,而不是执行者自己的权限。这意味着当普通用户执行具有SUID标志的文件时,该文件将以拥有它的用户的权限来运行,通常是超级用户(root)的权限。

    SGID(Set Group ID)

    SGID标志允许一个可执行文件或目录在执行或访问时使用文件或目录所属的组的权限,而不是执行者自己的组权限。这意味着当用户访问具有SGID标志的文件或目录时,他们将以该文件或目录所属组的身份执行操作。

    Sticky Bit(粘滞位)

    粘滞位是一种Linux文件系统权限标志,通常应用于目录上,用于限制除文件所有者和root用户外的其他用户删除该目录下的文件或子目录的权限。这有助于保护共享目录和临时目录中的文件免受误删除。

    用法

    #为file文件添加SUID权限

      chmod u+s file

      chmod 4xxx file  #首位是4,剩下的根据实际情况 

    #为file文件消除SUID权限

      chmod u-s  file   

    # 拥有者的x权限变成小写的s,说明添加了SUID权限,且UID身份有x权限。

    # 拥有者的x权限变成大写的S,说明添加了SUID权限,但UID身份没有x权限。


    #为file文件添加SGID权限

      chmod g+s file   

      chmod 2xxx file  #首位是2,剩下的根据实际情况 

    #为file文件消除SGID权限
      chmod g-s  file   

    # 所属组的x权限变成小写的s,说明添加了SUID权限,且GID身份有x权限。

    # 所属组的x权限变成大写的S,说明添加了SUID权限,但GID身份没有x权限。


    #为dir目录添加粘滞位

      chmod +t  dir   

      chmod 1xxx file  #首位是0,剩下的根据实际情况 

    #为dir目录消除粘滞位

    chmod -t   dir 

    # 其它的x权限变成小写的t,说明添加了粘滞位权限,且other身份有x权限。

    # 其它的x权限变成大写的T,说明添加了粘滞位权限,但other身份没有x权限。


    chmod 0xxx file  #首位是0,直接消除所有特殊权限

    注意事项:

    1. 特殊权限同常规权限一样,不同的权限之间是相互独立的,可以叠加。421分别表示特殊权限为SUID、SGID、粘滞位,对应二进制位的表示(类比常规权限的表示)。
    2. 在某些Linux系统中,特别是在一些较新的发行版中,bash已经被设计成不会执行具有SUID和SUID权限的脚本或命令。这是为了减少潜在的安全风险,因为SUID可执行文件可以允许普通用户以特权用户的权限运行某些命令,如果受到恶意使用,可能会导致系统安全问题。但粘滞位还是可以正常使用的。

    Shell的概念

    Linux是一个复杂的操作系统,一个操作系统的组成通常包括:内核(Kernel)、系统库和工具、应用程序、驱动程序等等。而真正起到与硬件进行交互的就只有操作系统的内核(Kernel)。驱动程序相当于内核与硬件设备之间的媒介,并没有与硬件进行交互。而为了安全起见我们并不能直接使用系统内核,而是通过内核的“外壳”程序,也就是所谓的Shell,来与系统内核进行沟通。Shell就相当于是一个介于操作系统内核与用户之间的媒介,既可以有效的保护操作系统——防止系统崩溃和对硬件操作损伤等,相较于直接与内核进行交互,又极大的降低了的操作难度与上手成本。类比Windows,其图形化界面也就相当于是一个shell,只是相较Linux的黑白窗口更易于操作了,本质上它们是一样的。

    Shell 既是一种命令语言,用于与操作系统交互执行任务,又是一种程序设计语言,允许用户编写自动化脚本和程序,从简单的命令操作到复杂的系统管理任务都可以使用 Shell 来实现。Shell作为命令行解释器时,其主要功能是:将使用者的命令翻译给系统内核处理,同时将核心的处理结果翻译给使用者。Shell作为程序设计语言时,其功能是:可以用来编写Shell脚本。

    Shell并不指代具体的程序,只是一个泛称、统称,包括了多种不同的实现和变体,如Bash、Zsh、PowerShell等。提供了命令行和图形界面两种方式,其中Windows中常用的就是图形界面,Linux中常用的就是命令行中的bash。

    控制台指令的概念

    Linux控制台命令是用户通过命令行界面(也称为终端或控制台)与Linux操作系统进行交互的方式。在Linux中,几乎所有的任务都可以通过控制台命令来完成,从文件管理和系统配置到网络操作和用户管理等各种任务。

    从本质上讲,Linux是用C语言写的,而Linux下的指令其实就是操作系统内置的一个个可执行程序,当我们输入指令时,其实是启动了一个个可执行程序。

    如下是关于Linux控制台命令的一些相关概念:

    1. 命令行界面(Command Line Interface, CLI)
      Linux的命令行界面是一个文本界面,用户可以在其中输入命令并查看命令的输出。用户可以通过控制台终端窗口(terminal emulator)或者SSH(Secure Shell)等方式访问Linux的命令行界面。
    2. 命令(Command)
      命令是用户在控制台中输入的指令,用于执行特定的操作。每个命令通常由命令名称和一些参数组成。例如在Linux中,ls命令用于列出目录内容。
    3. 参数和选项
      命令可以带有参数和选项,用来指定命令的具体行为。参数是命令的输入,而选项则是对命令进行定制的标志。例如,ls -l命令中的-l是一个选项,用来显示详细的文件信息。
    4. 命令路径
      Linux文件系统中的每个文件和目录都有一个唯一的路径,用来指示它们在文件系统中的位置。绝对路径从根目录开始,相对路径则相对于当前工作目录。
    5. 管道(Pipe)
      管道是一种特殊的命令连接方式,允许将一个命令的输出直接传递给另一个命令作为输入。这种方式可以实现命令之间的数据传递和处理。
    6. 通配符(Wildcard)
      通配符是一种用于匹配文件名或路径的特殊字符,例如*(匹配任意字符)、?(匹配单个字符)等。通配符在命令中用于进行文件名的模式匹配。
    7. Shell
      Shell是一个命令解释器,负责接收用户输入的命令并将其发送给操作系统内核执行。常见的Linux Shell包括Bash(Bourne Again Shell)、Zsh(Z Shell)等。
    8. 权限和所有权
      每个文件和目录都有一个所有者和一个关联的用户组,并且可以设置针对所有者、用户组和其他用户的读、写、执行权限。
    9. 环境变量
      环境变量是在操作系统中设置的一些变量,用于存储系统和用户的配置信息。用户可以通过环境变量来定制命令的行为和系统的运行环境。

     最后,如果想要了解一些具体的Linux下的常用指令,可以参考这篇博客:Linux - 常用基础指令

  • 相关阅读:
    ODBC数据源管理器不在指定位置找oracle的SQORAS32.DLL
    【无标题】
    通过@QConfigPropertySource为static属性赋值
    MDR上位效应服务器及本地运行
    Qt翻译(本地化)坑总结
    FAT32文件系统---第6章 缓冲区管理
    【c++】Lambda表达式
    以vector动态数组为例来详解快速排序算法
    机器视觉公司怎么可能养我这闲人,连软件加密狗都用不起,项目都用盗版,为什么​?
    第十三章《集合》第6节:使用Collections类操作集合
  • 原文地址:https://blog.csdn.net/m0_73759312/article/details/132287642