目录
[1. 发展史](#1. 发展史)
[2. 开源](#2. 开源)
[3. 官网](#3. 官网)
[4. 企业应用现状](#4. 企业应用现状)
[• Linux在服务器领域的发展](#• Linux在服务器领域的发展)
[• Linux在桌面领域的发展](#• Linux在桌面领域的发展)
[• Linux在移动嵌入式领域的发展](#• Linux在移动嵌入式领域的发展)
[• Linux在云计算/大数据领域的发展](#• Linux在云计算/大数据领域的发展)
[5. 发行版本](#5. 发行版本)
[• DebianDbian运行起来极其稳定,这使得它非常适合用于服务器。 debian这款操作系统无疑并不适合新手用户,而是适合系统管理员和高级用户。](#• DebianDbian运行起来极其稳定,这使得它非常适合用于服务器。 debian这款操作系统无疑并不适合新手用户,而是适合系统管理员和高级用户。)
[• Ubuntu](#• Ubuntu)
[• 红帽企业级Linux](#• 红帽企业级Linux)
[• CentOS](#• CentOS)
[• Fedora](#• Fedora)
[• Kali Linux](#• Kali Linux)
[6. os概念,定位](#6. os概念,定位)
[使用 XShell 远程登录 Linux](#使用 XShell 远程登录 Linux)
[关于 Linux 桌面](#关于 Linux 桌面)
[下载安装 XShell](#下载安装 XShell)
[查看 Linux 主机 ip](#查看 Linux 主机 ip)
[使用 XShell 登陆主机](#使用 XShell 登陆主机)
[XShell 下的复制粘贴](#XShell 下的复制粘贴)
[ls 指令](#ls 指令)
[pwd 命令](#pwd 命令)
[cd 指令](#cd 指令)
[touch 指令](#touch 指令)
[mkdir 指令](#mkdir 指令)
[rmdir 指令 && rm 指令](#rmdir 指令 && rm 指令)
[man 指令](#man 指令)
[cp 指令](#cp 指令)
[mv 指令](#mv 指令)
[cat 指令](#cat 指令)
[more 指令](#more 指令)
[less 指令](#less 指令)
[head 指令](#head 指令)
[tail 指令](#tail 指令)
[date 指令](#date 指令)
[cal 指令](#cal 指令)
[find 指令](#find 指令)
[which 指令](#which 指令)
[whereis 指令](#whereis 指令)
[alias 指令](#alias 指令)
[grep 指令](#grep 指令)
[zip/unzip 指令](#zip/unzip 指令)
[tar 指令(重要)](#tar 指令(重要))
[bc 指令](#bc 指令)
[uname --r 指令](#uname –r 指令)
[重要的几个热键 [Tab], [ctrl]-c, [ctrl]-d](#重要的几个热键 [Tab], [ctrl]-c, [ctrl]-d)
[1. chmod](#1. chmod)
[2. chown](#2. chown)
[3. chgrp](#3. chgrp)
[4. umask](#4. umask)
[file 指令](#file 指令)
Linux背景
1. 发展史
对于Linux你可能要问Linux从哪里来?它是怎么发展的?在这里简要介绍Linux的发展史。要说Linux,还得从UNIX说起。
UNIX发展的历史
• 1968年,一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫
Multics的特殊操作系统。Multics在多任务文件管理和用户连接中综合了许多新概念。
• 1969-1970年,AT&T的贝尔实验室研究人员Ken Tompson和Dennis Ritchie,在采用很多
Multics特点的基础上开发了UINX系统。它运行在小型机上,满足了系统对科研环境的要求。从产生开始,UNIX就是一个有价值的、高效的、多用户和多任务的操作系统。
• UNIX从满足个人的设计需求开始,逐步成长为由许多不同开发商所支持的标准软件产品。
• 第一个UNIX版本是免费给许多知名大学的计算机系使用的。
• 1972年,贝尔实验室开始发放商业版本,并且给不同的用户授权使用这个系统,使用者之一是加州大学伯克莱分校的计算机系。伯克莱给系统增加了许多新的特点,后来成为了标准。
• 1975年伯克莱由下属部门BSD发行了自己的UNIX版本。UNIX的BSD版本成为AT&T贝尔实验室版本的主要竞争者,而其它的独立开发出的UNIX版本也开始萌生。
• 1980年微软公司开发了叫做Xenix的UNIX PC版本。AT&T发行了第一个商业版本。名叫SystemⅢ,后来被成为对商用软件产品良好支持的System Ⅴ所替代。
• 同时UNIX的BSD版本不断发展,在70年代末期,BSD UNIX成为了国防部的高科技研究机构科研项目的基础。其结果,伯克莱发行了一个叫做BSD Release 4.2的有效版本。
• 它包括了高级的文件管理器和基于TCP/IP网络协议的网络特点。现在TCP/IP被Internet所使用。BSD Release 4.2被许多厂商所采用,例如SUN Microsystem。
• UNIX不同版本的出现导致了UNIX标准的需要,软件开发商不知道他们的程序运行在哪些版本上比较合适。
• 到80年代中期,两个竞争的标准出现了,一个是基于AT&T的UNIX版本,另一个是BSD版本。在今天的书店里你能发现分别适用于这两个版本的不同的UNIX的书,一些是System V,另一些集中在BSD UNIX。
• AT&T建立了一个叫UNIX系统实验室的新组织,它的作用就是综合UNIX的不同版本,集中开发一个标准系统。
• 1991年,UNIX综合实验室综合了System V Release3,SUN OS和Xenix的所有特点,发行了System V Release 4。为了与System V Release 4 竞争,一些其它公司,如IBM和惠普OpenSoftware Foundation(OSF)去产生自己的UNIX标准版本,继而出现了两个标准商业版本OSF版本和System Release 4。
• 1993年,AT&T把它的UNIX转卖给Novell公司。UNIX系统实验室成为了Novell的UNIX系统小组的一部分。Novell发行了基于System V Release 4的自己的UNIX版本UNIXWare,它可以和Novell公司的Netware系统相联。SUN公司已经把System V Release 4 融进了它的SUN OS,发行了Solaris。两个相互竞争的UNIX使用的图形用户界面(一个叫Motif,另一个叫Openlook),已经合并为一个新的工作平台标准,叫做通用平台环境(CDE)。
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 Bourne Again
Shell(bash)和GNU的C编译程序(gcc)以及为数不多的其它语言。Torvalds绝对没有想到他设想的一种能够针对高级业余爱好者和黑客们的操作系统已经产生,这就是人们所称的Linux。
• Linux发布时的版本是0.02,后来又有0.03版,然后又跳到0.10版。因为世界各地越来越多的程序员都开始开发Linux,它已经达到0.95版。这就意味着正式公布1.0版本的时间已经为期不远了。正式的1.0版本是在1994年公布的

• 对比一下 Windows 发展史

2. 开源
• Linux是一种自由和开放源代码的类UNIX操作系统,该操作系统的内核由林纳斯托瓦兹在1991年首次发布,之后,在加上用户空间的应用程序之后,就成为了Linux操作系统。严格来讲,Linux只是操作系统内核本身,但通常采用"Linux内核"来表达该意思。而Linux则常用来指基于Linux内核的完整操作系统,它包括GUI组件和许多其他实用工具。
• GNU通用公共许可协议(GNU General Public License,简称GNU GPL或GPL),是一个广泛被使用的自由软件许可协议条款,最初由理查德斯托曼为GNU计划而撰写,GPL给予了计算机程序自由软件的定义, 任何基于GPL软件开发衍生的产品在发布时必须采用GPL许可证方式,且必须公开源代码
• Linux是自由软件和开放源代码软件发展中最著名的例子。只要遵循GNU通用公共许可证,任何个人和机构都可以自由地使用Linux的所有底层源代码,也可以自由地修改和再发布。随着Linux操作系统飞速发展,各种集成在Linux上的开源软件和实用工具也得到了应用和普及,因此,Linux也成为了开源软件的代名词。
3. 官网
4. 企业应用现状
• 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成为最受青睐的云
计算、大数据平台操作系统。
5. 发行版本
不同种类的Linux是由使用它的大量用户进行区分的。
技术方面的版本主要是指的内核版本2.6.32 2.6.16这种
而商业角度本指的是如ubuntu,kailm,centos/redhat,红旗这些。基于使用的人群不同,不同商业上的Linux细化迭代、一些处理策略等等都会有所不同,比如面向企业的Linux版本操作往往会更加保守,确保程序员知道自己在做什么;而面向学生的Linux往往社区内各种入门文档较多,对新手友好。
• DebianDbian运行起来极其稳定,这使得它非常适合用于服务器。 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来管理软件包。
毫无疑问,Kali Linux是一款渗透测试工具,或者是文明黑客(我不想谈论恶意黑客)青睐的操
作系统。
• ... ...

认识Linux的内核版本名称

Linux的版本也并不是越新越好,往往越新的版本虽然会有新增的功能,但是也会有更多的bug,导致我们原有的程序出现问题;遇到问题后,社区中也更难找到解决办法。
6. os概念,定位
使计算机更好用! 这是操作系统的根本要义!!随着后面的介绍,大家会对下图有越来越深的认识。

使用 XShell 远程登录 Linux
关于 Linux 桌面
很多人接触更多的可能是Windows的图形化界面,其实一开始不管什么样的操作系统都是黑屏终端+指令的操作形式,之后才出现图形化界面,并以此PC推广到普通人。图形化操作确实非常方便,但是图形化本身需要占用系统的资源,影响效率;针对服务器,我们也并不需要图形化,并且图形化将系统的很多概念都抽象化了,不利于我们对于底层的理解。
处于效率、理解上的考量,后文中使用Linux使用终端+指令进行操作。
下载安装 XShell
XShell 是一个远程终端软件. 下载官网:https://www.netsarang.com/products/xsh_overview.html
下载安装的时候选择 "home/school" 则为免费版本.
查看 Linux 主机 ip
在终端下敲 ifconfig 指令, 查看到 ip 地址.
使用 XShell 登陆主机
在 XShell 终端下敲 ssh [ip] ,ip 为刚才看到的 ifconfig 结果。
如果网络畅通, 将会提示输入用户名密码。输入即可正确登陆。
XShell 下的复制粘贴
复制: ctrl + insert (有些电脑的 insert 需要配合 fn 来按)
粘贴: shift + insert
ctrl + c / ctrl + v 是不行的.
Linux下基本指令
ls 指令
语法: ls [选项] [目录或文件]
功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。
常用选项:
• -a 列出目录下的所有文件,包括以 . 开头的隐含文件。
• -d 将目录像文件一样显示,而不是显示其下的文件。 如:ls --d 指定目录
• -i 输出文件的 i 节点的索引信息。 如 ls --ai 指定文件
• -k 以 k 字节的形式表示文件的大小。ls --alk 指定文件
• -l 列出文件的详细信息
• -n 用数字的 UID,GID 代替名称。 (介绍 UID, GID)
• -F 在每个文件名后附上一个字符以说明该文件的类型,"*"表示可执行的普通文件;"/"表示
目录;"@"表示符号链接;"|"表示FIFOs;"="表示套接字(sockets)。(目录类型识别)
• -r 对目录反向排序
• -t 以时间排序
• -s 在l文件名后输出该文件的大小。(大小排序,如何找到目录下最大的文件)
• -R 列出所有子目录下的文件。(递归)
• -1 一行只输出一个文件。
pwd 命令
语法: pwd
功能:显示用户当前所在的目录
常用选项:
无
理论知识:
ls是显示当前目录下的文件,当前目录即当前我这个用户所处的目录,其中用户可以用whoami
查看,所处的目录可以用pwd打印而这里我们所属的目录就等于文件夹。

上图ls -l 中ls称为命令,-l称为命令行选项,命令行选项可以有一个或者多个,命令与命令行选项件以空格间隔。
ls,我们发现显示的显示的是文件的内容,而ls -l 还显示了更多的内容。

Windows先常可以看到所谓的0KB大小的文件,那对于这样的文件,需要存储空间吗?
其实想文件的大小、位置、占用空间等属性也是文件的数据,文件并不是真的0KB。
所以如果我们创建了一个0KB大小的文件,我们也需要空间来存储它,实际文件的大小也包括文件的属性。
所以我们可以说文件=内容+属性。所以我们学习文件,要么是对文件的内容做操作,要么是对文件的属性做操作。
而ls -l指令所显示的更多内容其实就是显示一个文件的属性。

mkdir可以创建目录,mkdir后面跟的是文件名,指令与文件名中间用用空格分隔。
这里我们看到创建的目录是蓝色的,在Windows中,可以通过后缀.png、.txt区分,但是在Linux操作系统中,区分文件的并不是通过颜色区分的,这只是一种配色方案,也不是通过后缀区分的。

ls -l显示的属性后面的是文件创建的日期、时间,而最前面的这个d就代表当前这个文件是一个目录即文件夹

touch命名是创建一个普通文件,而这里我们看到test.c开头是-,这就代表这是一个普通文件。

上图,我们可以看到Linux中命名后面的选项的形式非常自由,多个选项可以直接相连、可以分隔。
而这里的-a,是all的意思,ls -a即显示所有的文件

使用-a后我们发现可以看到多出来了.、..两个文件,我们把这种以.开头的文件叫做隐藏文件

所以-a即显示隐藏文件,功能类似于Windows中上图。

通过前面加.,我们也可以主动创造隐藏文件。


pwd是显示我们当前所处的路径,Win中我们可以像上图取到当前的路径,这里介绍的是对于/或者\隔开的中间部分,我们可以肯定一定是一个目录即文件夹,而对于路径尾端的这是一个目录或者文件。

cd 指令
语法: cd 目录名
功能:改变工作目录。将当前工作目录改变到指定的目录下
举例:
理论知识:

虽然我们可以创建隐藏文件,但是.和..又是从何而来的呢?
在任何一个目录,即使是空目录,也会自带.和..,.是当前目录,..是上级目录。

我们用cd改变当前的目录,cd .时我们发现当前的路径没有变化,这就说明.就是当前目录,cd ..时我们的路径会一直往上级目录回退,这说明..就是上级目录。
但是当我们一直往上回退,我们又发现回退到/就回退不了了。
/在Linux中我们叫做根目录

这里我们在输出一个小结论,ls -l 默认显示的是当前目录下的文件,ls -l 指定目录 显示的是指定目录中的文件,而目录本身也是一个文件,如果我们只是想查看目录本身,需要使用-d

经过上面的学习,我们发现目录里面可以放文件,目录里面还可以放目录,目录里面再放文件....所以Linux的文件结构是一颗从根目录/开始的多叉树,它的叶子一定是普通文件或者空目录,非叶子节点一定是一个非空目录。



如上图,根据之前的学习,我们可以根据路径找到test.c,但是为什么我们可以找到呢?
现在我们可以回答:树状组织方式,都是为了保证快速定位查找到指定的文件,而定位文件就需要具有唯一性的方案来进行定位文件。其中任何一个节点,都只有一个父节点,所以,从根目录开始,定位指定文件,路径具有唯一性。
我们把一般从/开始,不依赖其他目录的定位文件的路径叫做绝对路径。
以非/、相对于当前用户所处目录或者其他目录,定位文件的路径方式叫做相对路径。
绝对路径一般不会随着用户的路径变化而丧失唯一性,并且是从根目录开始,我们不需要考虑其他系统不存在根目录的情况,所以绝对路径一般在特定服务的配置文件中经常被使用。
而相对路径因为它是可以指定从某一路径开始的,路径一般比较短,使用便捷,一般在命令行中使用较多。
而任何一个目录即使是空目录,系统也会自动生成.和..,现在我们也可以理解了,其中.相当于指向当前文件的指针,..相当于指向上级目录的指针(/都指向自己),我们把这种叫做线索化过的。
**cd ~**可以进入到当前用户的家目录下,那么什么叫做家目录呢?
如下图当我们分别以root和普通用户登录,我们所处的默认目录就是当前用户的家目录。

cd - 命令可以在最近的两个路径之间相互切换

touch 指令
Linux理论知识:文件类型的认识
语法: touch [选项]... 文件...
功能:touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在
的文件。
常用选项:
• -a : change only the access time
• -c : change only the modification time
举例:
touch出了可以创建普通文件,还可以修改文件的时间。

系统中时间非常重要,时间乱了,可能会导致整个系统的混乱,我们可以通过stat查看时间

mkdir 指令
语法: mkdir [选项] dirname...
功能:在当前目录下创建一个名为 "dirname"的目录
常用选项:
• -p/--parents: 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录
举例:

rmdir 指令 && rm 指令
rmdir是一个与mkdir相对应的命令,mkdir是建立目录,而rmdir是删除命令
语法: rmdir [-p] [dirName]
适用对象:具有当前目录操作权限的所有使用者
功能:删除空目录
常用选项:
• -p 当子目录被删除后如果父目录也变成空目录的话,就连带父目录一起删除。
举例:
rmdir只能删除空目录

知识:

创建完后,如果我们想查看,可以使用tree 目录名 ,会将目录中所有文件及目录以树形形式展开。


查看对应指令,我们发现对应指令在系统中都可以查到,这里要说明的是命令其实就是文件,并且是-开头的普通文件。

我们创建一个文件mycmd,并且编译,我们发现通过./mycmd,我们也可以运行它(因为要运行文件就要先找它,而文件在当前路径下,所以./),而对于ls,我们发现通过路径下文件形式也可以运行。所以命令就是可执行文件就等同于我们写的C/C++代码。
所以如下图,当我们将mycmd也拷贝到/user/bin下,也可以不带路径直接使用了。
所以我们所谓的安装指令其实就是将对应的文件拷贝到指定目录下如/user/bin


所以回归到ls -l 和ll ,其实这两个就是同一个指令,ll就是ls -l 起的别名。
使用alias就可以为指令起别名,--color=auto是命令行选项,可以使ls显示的文件按照系统方案显示颜色。使用alias起得别名只在当前会话有效,除非我们修改配置文件。

rm 命令可以同时删除文件或目录
语法: rm [-f-i-r-v] [dirName/dir]
适用对象:所有使用者
功能:删除文件或目录
常用选项:
• -f 即使文件属性为只读(即写保护),亦直接删除
• -i 删除前逐一询问确认
• -r 删除目录及其下所有文件
举例:
普通用户使用rm删除文件,如果当前文件是自己创建的,系统不会过问,但是因为当前是root用户,所以系统会询问是否删除。y表示yes,n表示no。

rm -f强制删除文件,系统不会过问

rm 的-r选项表示递归删除,rm -r可以用来删除目录


*表示通配符,可以用来匹配任意字符,code.*表示文件名中有code.都可以匹配上。
man 指令
Linux的命令有很多参数,我们不可能全记住,可以通过查看联机手册获取帮助
语法: man [选项] 命令
常用选项
• -k 根据关键字搜索联机帮助
• num 只在第num章节查找
• -a 将所有章节的都显示出来,比如 man printf 它缺省从第一章开始搜索,知道就停止,用a选项,当按下q退出,他会继续往后面搜索,直到所有章节都搜索完毕
解释一下:man手册分为9章(不同系统可能会有差别)
• 1 是普通的命令
• 2 是系统调用,如open,write之类的(通过这个,至少可以很方便的查到调用这个函数,需要加什么头文件)
• 3 是库函数,如printf,fread4是特殊文件,也就是/dev下的各种设备文件
• 4 略
• 5 是指文件的格式,比如passwd, 就会说明这个文件中各个字段的含义
• 6 是给游戏留的,由各个游戏自己定义
• 7 是附件还有一些变量,比如像environ这种全局变量在这里就有说明
• 8 是系统管理用的命令,这些命令只能由root使用,如ifconfig
• 9 略
举例:


man 指令 从默认从一号手册中查找指令,man 数字 指令 默认从对应号手册查询指令。
cp 指令
语法: cp [选项] 源文件或目录 目标文件或目录
功能: 复制文件或目录
说明:
• cp指令用于复制文件或目录
• 如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中
常用选项
• -f 或 --force 强行复制文件或目录, 不论目的文件或目录是否已经存在
• -i 或 --interactive 覆盖文件之前先询问用户
• -r 递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理
mv 指令
mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files,经常用来备份文件或者目录
语法: mv [选项] 源文件或目录 目标文件或目录
功能:
- 视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其
移至一个新的目录中。
当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。
当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。
常用选项:
• -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
• -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
cat 指令
语法: cat [选项] [文件]
功能: 查看目标文件的内容
常用选项:
• -b 对非空输出行编号
• -n 对输出的所有行编号
• -s 不输出多行空行

同一目录下不能有同名文件

cp拷贝是如果后面不跟文件名,cp就会将文件原名拷贝至其他目录下

目录的拷贝cp,需要-r,表示递归式拷贝

cp 如果是将目录拷贝到目录中,如果目标目录不存在会创建,存在会将拷贝目录拷贝至目标目录内。

如果目标目录内已经有拷贝目录,那么cp会覆盖式拷贝,-f强制拷贝,系统不再询问,不过由于这里是root用户,所以系统依然询问

echo 与cat类似都可以直接打印,不过cat是显示指定文件名里面的内容,echo是将后续的内容作为字符串显示。

知识:
**在Linux中一切皆文件,**对于操作系统来说,用户新建的文件、键盘、显示器等都是文件。
C语言中我们学习过。如果想要对某一个文件进行操作,必须先打开它,所以如果我们想要使用printf/scanf、cout/cin之类,也必须打开对应键盘、显示器的文件才行,即下图这三个文件

但是实际使用我们有没有打开过,这其实是因为系统默认为我们打开了,之所以会默认打开三个文件而不是其他文件,是因为三个文件我们程序会经常使用。

上图中,我们发现使用>,echo将原本应该显示到显示器上面的内容,显示到了一个文件中,对于这种操作我们叫做输出重定向。

输出重定向的特点是后续的文件不存在则创建,如果存在会先清空再写入。而这种特点就意味着利用>可以直接创建一个文件,也可以直接清空一个文件echo本质上所谓的显示就是向显示器这个文件写入数据,重定向之后就是向hello.txt文件写入。

而使用>>,与>不同的是对于已有的文件不会清空内容,而是会在文件原本内容上追加新的内容,我们把这个叫追加重定向。
通过<,我们可以把文件内容写入到显示器文件上,我们把这个叫做输入重定向


重定向的特点正好与我们文件打开模式类似,所以随着深入学习,就可以发现上述操作都可以转换为C语言操作
因为一切皆文件,所以我们XShell远端登录时,所产生的文件就存储在下面的路径中,因为对于终端我们既要能显示也要能从键盘输入,所以系统一定要将终端能以文件的形式往里输入


我们多打开几个终端,可以发现对应文件也增加了。既然终端也是文件,我们输出重定向发现我们也可以往其他终端上写入信息了。

所以终端本质上就是Linux /dev/pts上的文件,当我们打开终端就会打开对应的文件,我们就可以在终端上进行各种输入输出操作了。
在Linxu上我们区分文件类型不靠后缀,而是靠文件信息开头的字母

-:普通文件,如文本、可执行文件、库、图片、视频
d:目录文件
c:字符文件、键盘、显示器、终端,这一类文件输入的数据具有顺序性
b:块设备文件,如磁盘
I:连接文件
p:管道文件。
需要注意的是即使Linxu系统本身不关心后缀,但是工具如gcc还是关心文件的后缀的。


mv 可以将文件转移至指定目录(如果目录存在)(默认递归的),但是如果该目录名不存在,那么mv就是将文件名修改成指定文件名。

之前我们所介绍的cat主要是查看短文件的(-n显示文件行数),从前往后显示文件内容,而tac正好相反,将文件内容从后往前显示的。
cat本身并不是专门打印文件内容的,主要是当我们想查看一些配置项但是又不想打开文件,所以我们会使用cat


打印系统的log信息,我们发现我们在终端所做的所有信息都被记录下来的,专门存储这些信息的就是日志,软件领域,凡是大型项目,必有日志,主要用于记录信息,方便后续出现问题便于排查,如果我们使用tac打印就可以看到最新系统的消息了。

more 指令
语法: more [选项]
功能:more命令,功能类似 cat
常用选项:
• -n 指定输出行数
• q 退出more
举例:

more主要就是用于查看日志的,如果使用cat、tac那么全部信息都打印,不方便排查问题。


morer然后就会把一整屏打满信息,按回车,就可以不断往下翻,但是more不支持往上翻,所以实际使用中也被less代替了。

在实际使用中输入/,后面输入对应字符,就可以自动筛选出对应的内容
less 指令
• less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大
• less 的用法比起 more 更加的有弹性,在 more 的时候,我们并没有办法向前面翻, 只能往后面看
• 但若使用了 less 时,就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更
容易用来查看一个文件的内容
• 除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。
语法: less [参数] 文件
功能:less与more类似,但使用less可以随意浏览文件,而more仅能向前移动,却不能向后移动,而且less在查看之前不会加载整个文件。
选项:
• -i 忽略搜索时的大小写
• -N 显示每行的行号
• /字符串:向下搜索"字符串"的功能
• ?字符串:向上搜索"字符串"的功能
• n:重复前一个搜索(与 / 或 ? 有关)
• N:反向重复前一个搜索(与 / 或 ? 有关)
• q:quit
举例

less与more非常类似,不过less支持上翻。
head 指令
head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾。
语法:
head [参数]... [文件]...
功能:
head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的从开头指定行的内容。
选项:
• -n<行数> 显示的行数
举例:
head 可以按照-510参数从头将对应行数的内容显示出来。

tail 指令
tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不断刷新,使你看到最新的文件内容.
语法: tail 必要参数 [文件]
功能:用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。
选项:
• -f 循环读取
• -n<行数> 显示行数
举例
tail就是从文件尾部开始拿出指定行数的内容显示

知识:
这里的|,我们叫做管道,上一条指令处理的结果可以通过|,交给下一条指令继续处理
比如下图中可以先从log.txt中拿出钱510行内容,再通过管道把这些交给tail -10,拿出后10条

date 指令
指定格式显示时间: date +%Y:%m:%d
用法: date [OPTION]... [+FORMAT]
- 在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记,其中常用的标记
列表如下
• %H : 小时(00..23)
• %M : 分钟(00..59)
• %S : 秒(00..61)
• %X : 相当于 %H:%M:%S
• %d : 日 (01..31)
• %m : 月份 (01..12)
• %Y : 完整年份 (0000..9999)
• %F : 相当于 %Y-%m-%d
- 在设定时间方面
• date -s //设置当前时间,只有root权限才能设置,其他只能查看。
• date -s 20080523 //设置成20080523,这样会把具体时间设置成空00:00:00
• date -s 01:01:01 //设置具体时间,不会对日期做更改
• date -s "01:01:01 2008-05-23″ //这样可以设置全部时间
• date -s "01:01:01 20080523″ //这样可以设置全部时间
• date -s "2008-05-23 01:01:01″ //这样可以设置全部时间
• date -s "20080523 01:01:01″ //这样可以设置全部时间
- 时间戳
• 时间->时间戳:date +%s
• 时间戳->时间:date -d@1508749502
• Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒
- 举例

时间戳的有个用途就是转换成正常的时间用来进行日志对应时间段的区间式查找

cal 指令
cal命令可以用来显示公历(阳历)日历。公历是现在国际通用的历法,又称格列历,通称阳历。"阳历"又名"太阳历",系以地球绕行太阳一周为一年,为西方各国所通用,故又名"西历"。
命令格式: cal 参数 [年份]
功能:用于查看日历等时间信息,如只有一个参数,则表示年份(1-9999),如有两个参数,则表示月份和年份
常用选项:
• -3 显示系统前一个月,当前月,下一个月的月历
• -j 显示在当年中的第几天(一年日期按天算,从1月1号算起,默认显示当前月在一年中的天数)
• -y 显示当前年份的日历
举例:

find 指令
• Linux下find命令在目录结构中搜索文件,并执行指定的操作。
• Linux下find命令提供了相当多的查找条件,功能很强大。由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。
• 即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限。
• 在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。
语法: find pathname -options
功能:用于在文件树中查找文件,并作出相应的处理(可能访问磁盘)
常用选项
• -name 按照文件名查找文件
• 其他选项需要在查,这个命令其实比较复杂
which 指令
功能:在指定的目录下取查找指定的命令
举例:

whereis 指令
功能:用于找到程序的源、二进制文件或手册
举例:
alias 指令
功能:设置命令的别名
举例:
grep 指令
语法: grep [选项] 搜寻字符串 文件
功能:行文本过滤工具,在文件中搜索字符串,将找到的行打印出来,可以理解为根据关键字,将其他信息过滤
常用选项:
• -i :忽略大小写的不同,所以大小写视为相同
• -n :顺便输出行号
• -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行
举例:
针对上文提到的日志,我们可以使用grep将带Removed的信息过滤出来


结合上文的tail以及|管道,我们就可以将最近的removed信息筛选出来,方便我们排查问题。


随着后面的学习,grep也可以帮助我们筛选出对应的进程

grep也可以直接从我们的文件中直接筛选出对应的文本内容,比如我们想查看一段程序的入口函数

grep使用-n选项,我们不光可以筛选出文件中符合条件的行文本,还可以查看在文件中对应的行

grep -v选项将不匹配条件的文本都筛选出来,如下图,筛选的行文本都没有9

grep -i选项是忽略大小写匹配,注:关键词的""可以加,可不加,不过如果关键字内有空格建议加上

zip/unzip 指令
语法: zip 压缩文件.zip 目录或文件
功能:将目录或文件压缩成zip格式
常用选项
• -r:递归处理,将指定目录下的所有文件和子目录一并处理
• :递归处理,将指定目录下的所有文件和子目录并处理
举例
知识:
在日常我们下载一款软件,不光要下载软件本身,还要下载软件各种依赖库文件,如果我们是分散的一个一个下载,最终我们因为各种原因导致一两个文件缺失,进而软件就无法运行了,所以为了避免这种情况,我们可以将多个文件合并成一个文件,这就是我们所说的打包 ,这样我们最终只需要下载一个文件,避免文件丢失的情况 ,而为了打包后文件的体积往往很大,我们就需要将文件包压缩 ,这样不光减少体积,节省存储空间,而且可以有效减少网络传送的时间。
zip 压缩文件夹需要-r,才能将文件夹中所有文件都打包,不然只能打包一个空目录,unzip解压缩可以直接解压缩

unzip -d选项可以让我们将压缩包解压到指定路径下

Linux下还有sz命令,sz 压缩包名 可以支持我们将压缩包传送到Windows上

rz命令可以支持我们将压缩包从Windows上传到Linux。

在安装完sz命令后,我们也可以以直接拖拽的方式将Windows上的压缩包上传到Linux上
tar 指令(重要)
打包/解包,不打开它,直接看内容
语法: tar [-cxtzjvf] 文件与目录 ....
参数:
• -c :建立一个压缩文件的参数指令(create 的意思);
• -x :解开一个压缩文件的参数指令!
• -t :查看 tarfile 里面的文件!
• -z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?
• -j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?
• -v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!
• -f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!
• -C : 解压到指定目录
tar使用时多个选项组合使用,简单理解c表示创建一个文件包,z表示将目标文件包压缩,f表示使用指定的压缩包文件名,czf搭配使用,就创建了一个tar后缀的文件名。tar打包目录默认是递归将所有文件都打包

解压缩是将上面的选项c改为x就行了,x表示解包

加上v选项,就可以展示压缩和解压缩的整个过程



scp按照上图中的格式就可以实现不同主机间的压缩包互传

bc 指令
bc命令可以很方便的进行浮点运算,是一个简便的计算器

正常来说我们想要知道一些数据的和,比如配置文件的一些项,就可以使用bc

uname --r 指令
语法:uname [选项]
功能: uname用来获取电脑和操作系统的相关信息。查看体系架构和内核版本。
补充说明:uname可显示linux主机所用的操作系统的版本、硬件的名称等基本信息。
常用选项:
• -a或--all 详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理
器类型,硬件平台类型,操作系统名称

uname -r 可以查看内核版本、体系结构

注:体系结构其实就是知道芯片结构,一般有X86_32、X86_64(也叫X64)。
对于内核版本问题,一般来说在实际的开发过程中,公司内部使用版本往往会最新几个版本,这是因为新版本往往存在未知的bug,没有解决方案,非常不可控,而老版本的bug往往都踩过了,有成熟的解决方案,风险可控,所以公司会倾向于使用老版本,即稳定的版本。
重要的几个热键 [Tab], [ctrl]-c, [ctrl]-d
• [Tab]按键---具有『命令补全』和『档案补齐』的功能,使用时需要快速摁两下
当忘记具体的指令,使用Tab可以快速匹配对应的命令


• [Ctrl]+c按键---让当前的程序『停掉』,可以终止异常任务,或者有点时候误触发一些操作,也可以使用这个进行终止

• [Ctrl]+d按键---退出当前用户,方便进行用户切换,另外,他也可以用来取代exit

Ctrl\]+r按键--Linux系统会记录输入的历史命令,存在上限,我们输入代码的片段,就会从历史命令进行匹配   ### 关机 语法:shutdown \[选项
常见选项:
• -h:将系统的服务停掉后,立即关机。
• -r:在将系统的服务停掉之后就重新启动
• -t sec:-t 后面加秒数,亦即『过几秒后关机』的意思
注:一般云服务器一上线是一致运行的,不会主动关机,持续性的提供服务,
以下命令作为扩展
• 安装和登录命令:login、shutdown、halt、reboot、install、mount、umount、chsh、
exit、last;
• 文件处理命令:file、mkdir、grep、dd、find、mv、ls、diff、cat、ln;
• 系统管理相关命令:df、top、free、quota、at、lp、adduser、groupadd、kill、crontab;
• 网络操作命令:ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、
mail、 nslookup;
• 系统安全相关命令:passwd、su、umask、chgrp、chmod、chown、chattr、sudo ps、
who;
• 其它命令:tar、unzip、gunzip、unarj、mtools、man、unendcode、uudecode。
shell命令以及运行原理

我们上面使用的XShell命令行左边的显示的信息含义如上,这种命令行是有XShell这个外壳程序提供的,并不是操作系统提供的。
Linux严格意义上说的是一个操作系统,我们称之为"核心(kernel)" ,但我们一般用户,不能直接使用kernel。而是通过kernel的"外壳"程序,也就是所谓的shell,来与kernel沟通。

如何理解?为什么不能直接使用kernel?
从技术角度,Shell的最简单定义:命令行解释器(command Interpreter) 主要包含:
• 将使用者的命令翻译给核心(kernel)处理。
• 同时,将核心的处理结果翻译给使用者。
对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从
而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。 通过shell,作为用户,我们不在需要关心如何kernel的复杂接口如何交互,我们只需要将对应的指令交给外壳程序,所以shell简化了我们的操作,同时如何我们输入一些错误、非法的指令,shell也可以将这些指令拦截在系统之外,保护了内核的安全。
• 帮助理解:如果说你是一个闷骚且害羞的程序员,那shell就像媒婆,操作系统内核就是你们村头漂亮的且有让你心动的MM小花。你看上了小花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆
姓王,所以我们叫它王婆,它对应我们常使用的bash。
shell作为命令行解释器,需要解释命令,所以作为进程来说不能挂,不然后面的命令会都解释不了,所以新命令到来,shell会创建子进程,将命令交由子进程执行。
而在Centos下具体的shell程序是bash,每一次登录都会常见一个bash进程。shell是一个抽象概率,bash则是基于这个概念的具体实体,所以其他版本的系统也存在sh等其他命令行解释器

Linux权限的概念
Linux下有两种用户:超级用户(root)、普通用户。
• 超级用户:权限高,可以再linux系统下做任何事情,不受限制
• 普通用户:权限低,受管控,在linux下做有限的事情。
• 超级用户的命令提示符是"#",普通用户的命令提示符是"$"。
当我们安装某一个指令,我们需要将对应文件拷贝至系统/user/bin目录下,但是我们发现普通用户是无法拷贝到这个目录下的

命令:su [用户名]
功能:切换用户。
针对上面需要安装软件的情况,我们就需要从普通用户user切换到root用户,使用 su root(root可以省略,此时系统会提示输入root用户的口令,口令不回显,输入完则切换成功,可以安装指令了。

使用exit就可以退出root用户变成普通目录

之后我们想切换root,也可以使用su -,与su相比,su -相当于以root重新登录,会导致所处路径变化,su切换前后路径不变。

root切换普通用户,只需要root 普通用户,不需要输入密码

如下图,当我们想要以root身份创建文件,但又不想切换用户,通过常规手段,我们发现文件的拥有者和所属组依然是普通用户,所以这里我们就需要sudo 命令形式执行,这里需要普通用户的密码

sudo可以用来短暂的提权,当面临一些特殊情况,将软件按照到系统中,供大家共同使用(系统中其实只会按照一份供大家使用),我们就可以使用sudo短暂提权,sudo的提权一般只有几分钟,超过这个时间需要重新输入密码。

既然可以使用sudo提权,那是否意味着,人人都可以是管理员呢?
其实并不是,Linux中存在一份类似白名单的文件,在sudoers中记录了谁可以sudo提权,我们发现这个文件拥有者和所属组都是root,这就意味着只有root可以决定谁可以使用sudo提权,在实际开发中这就意味着想要sudo,必须线下真人找管理员沟通,拥有权限的必然是管理员可以信任的人。



Linux权限管理
那么再次回到权限本身,权限的本质是能或不能做某事,权限控制着用户的行为,防止错误的发生。
其次在日常中就好像非VIP不能看VIP视频,一般学生不能随便进校长办公室一样,张三不能看VIP视频,并不是因为他是张三,而是因为他不是VIP。
所以权限限制的并不是具体的人,而是一个人担任的角色。
其次就好像leetcode上不能追剧,爱奇艺上不能刷题,在谈论权限之前,权限要求目标本身具有对应的属性,比如爱奇艺可以追剧,我们才能来区分VIP和非VIP所看到视频的区别。
所以综上权限=角色+目标属性
而在Linux中一切皆文件,面对的一切问题也都是文件,所以Linux下的目标属性就是针对的文件,即读、写、可执行三类。
而角色分为拥有者、所属组、other三类,在文件的信息中可以看到。

这里谈论的角色,与之前的用户的概念并不冲突,这里角色就是用户所担任的角色,root和普通用户是具体的人,角色是他们担任的角色,用来区分对应的权限。
上面文件信息中只有拥有者和所属组两栏,之所以没有other,是因为相比较拥有者和所属组而言,对于文件的other可以有很多个,不好记录;并且比较完拥有者和所属组之后,如果都不是就是other,所以没必要单独记录other。
其次这里的所属组的概念这要针对一个公司内同一个开发小组下的多个人,这些人在同一个小组内都可以查看同一个所属组内的文件,而其他小组就看不到,这种更精细化的角色划分有利于更加精细化的权限管理(不过实际公司中往往是一人一台主机,系统上是一人一组)。
- 文件访问者的分类(人)
• 文件和文件目录的所有者:u---User
• 文件和文件目录的所有者所在的组的用户:g---Group
• 其它用户:o---Others (外国人)
- 文件类型和访问权限(事物属性)
• 文件类型:
◦ d:文件夹
◦ -:普通文件
◦ l:软链接(类似Windows的快捷方式)
◦ b:块设备文件(例如硬盘、光驱等)
◦ p:管道文件
◦ c:字符设备文件(例如屏幕等串口设备)
◦ s:套接口文件
• 基本权限,分为rwx:
◦ 读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息
的权限
◦ 写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内
文件的权限
◦ 执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权
限
◦ "---"表示不具有该项权限
在查看文件信息左边去掉第一个位,身下9个位,三三为一组,对应拥有者权限位、所属组权限位、other权限位,一组的顺序是固定的,即rwx,每个位置上要么是字母,要么是-表示没有

在介绍完角色、目标属性之后,我们再来理解一个文件权限=角色+目标属性的含义。
如下图的my.txt文件,对应拥有者来说,可读、可写、不可执行;对于所属组来说,可读、可写、不可以执行,对于所属组来说,可读,不可写、不可执行。
所以当我们描述一个文件权限时,必须是角色+目标属性,才能完整描述好一个权限

文件访问权限的相关设置方法
1. chmod
功能:设置文件的访问权限
格式:chmod [参数] 权限 文件名
常用选项:
• R -> 递归修改目录文件的权限
• 说明:只有文件的拥有者和root才可以改变文件的权限
chmod命令权限值的格式:
• 用户表示符+/-=权限字符
◦ +:向权限范围增加权限代号所表示的权限
◦ -:向权限范围取消权限代号所表示的权限
◦ =:向权限范围赋予权限代号所表示的权限
◦ 用户符号:
◦ u:拥有者
◦ g:拥有者同组用
◦ o:其它用户
◦ a:所有用户

这里需要说明的是对于普通用户来说只能改自己的文件权限,但是root不受限制

其次当文件失去对应权限,比如r,我们就不能在查看文件内容,失去w,我们就不能再向文件中写入数据

其次系统在确定用户权限是,会先确定用户的的角色,拥有者、所属组还是other,角色确定好后,在Centos系统下会按照拥有者、所属组、other顺序确定权限,且只确定一次。
如下图,当我们将whb拥有者的rwx权限去掉,即使我们所属组也是whb,具有对应的权限,但是我们依然不能读写,这是因为系统会按照顺序确认角色,whb与拥有者比对成功,就按照拥有者权限,不会继续比较其他角色权限了。

其次root用户所具有的权限不受到上述权限规则的限制,想怎么做就怎么做。

对于可执行来说会特殊一点,我们上面我们所添加的X可执行权限,只是一种资格,即使不是可执行文件,我们依然可以添加x,但是由于文件本身不具备可执行的能力,即使有这个可执行的权限,依然无法执行

2. chown
功能:修改文件的拥有者
格式:chown [参数] 用户名 文件名
实例:

3. chgrp
功能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名 文件名
常用选项:-R 递归修改文件或目录的所属组


其次系统默认是不允许我们将文件随便给别人,想要将文件给别人,也必须高权限,需要使用sudo
其次对于系统权限的表示方式,还有进制表示方法,如下图,对于每一组权限位上的每一个都只有两台,即字母或者-,对应1或者0,表示有或者无,所以按照这个思路rw-rw-r--可以表示成110110100,而每三位再按照8进制算成一个数字则变成664,而这就是权限的8进制表示方式

所以我们现在可以按照上面8进制表示方式修改文件权限了,比如444,4对应的是100,所以会给每一组权限位加上r权限

目录的权限
• 可执行权限: 如果目录没有可执行权限, 则无法cd到目录中.
• 可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.
• 可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件.
通过下面实验,我们发现对于目录来说,想要进入目录需要的是x权限

如果没有r权限就无法查看文件内的内容

如果没有w权限就无法删除或新增文件

所以默认情况下,为了支持对目录的一系列操作,新建目录默认rwx都要有
所以我们现在再回头理解Linux下的多用户隔离特性:
当我们新增一个普通用户,都会在home目录下新增一个同名家目录,而我们发现对于这个目录,只有拥有者有rwx,对于其他人没有任何权限,这样Linux下对于普通用户来说,就无法对其他用户做任何事情(root除外)


那么问题再次回到文件权限本身,为什么创建的新目录和文件权限是这样的呢?如下图

在系统中,对于普通文件来说,其实权限是666,不带可执行,对于目录文件来说,默认权限是777,默认带x,但是我们发现上面的权限并不是这样,这是因为系统中存在umask的原因
4. umask
功能:
• 查看或修改文件掩码
• 新建文件夹默认权限=0666
• 新建目录默认权限=0777
• 但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是:
最终权限 = mask &(~umask)
格式:umask 权限值
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用户默认为0002。根据系统不同,默认umask也会不同。



umask的目的就是希望凡是在umask中出现的权限都不应该在最终权限中出现,而umask的出现让系统可配置,可以根据需要灵活修改os自主决定的权限,不至于出现无法再创建前修改系统默认配置的情况,其次在特殊情况下,umask的出现,可以让我们控制文件的默认权限,让我们的代码是可控的
file 指令
功能说明:辨识文件类型。
语法: file [选项] 文件或目录...
常用选项:
• -c:详细显示指令执行过程,便于排错或分析程序执行的情形。
• -z:尝试去解读压缩文件的内容。
使用 sudo 分配权限
(1)修改/etc/sudoers 文件分配文件
bash
# chmod 740 /etc/sudoers
# vi /etc/sudoer
格式:接受权限的用户登陆的主机 =(执行命令的用户) 命令
(2)使用 sudo 调用授权的命令
bash
$ sudo --u 用户名 命令
实例:
bash
$ sudo -u root /usr/sbin/useradd u2
关于权限的总结
• 目录的可执行权限是表示你可否在目录下执行命令。
• 如果目录没有 -x 权限,则无法对目录执行任何命令,甚至无法 cd 进入目, 即使目录仍然有 -r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)
• 而如果目录具有 -x 权限,但没有 -r 权限,则用户可以执行命令,可以 cd 进入目录。但由于没有目录的读权限
• 所以在目录下,即使可以执行 ls 命令,但仍然没有权限读出目录下的文档。

重新回到目录权限的问题上,通过上图,我们发现只要对一个文件能否被删除与文件本身无关,而与文件所处目录所处目录w权限有关
于是, 问题来了~~ 换句话来讲, 就是只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写权限.
这好像不太科学啊, 我张三创建的一个文件, 凭什么被你李四可以删掉?
但其实这个问题不算问题,因为首先关键在于为什么别人的文件会在我的目录下?既然在我的目录下,作为我"家"当然有权利删除文件了
但是问题又来了,既然一个文件在其他人目录下可以被删除,那么如果多个用户之间要进行文件级别的协同操作呢?
所以一定不能放在一个私人账号下(/home下),我们应该将这个文件放在系统根目录下的某个文件,系统为我们提供了tmp文件。

但是还存在的一个问题是,根目录下的文件已经可以和别人共享了,但是文件依然可以被随便删除,所以为了解决这个不科学的问题, Linux引入了粘滞位的概念.
粘滞位
cpp
[root@localhost ~]$ chmod +t /home/ # 加上粘滞位
[root@localhost ~]$ ls -ld /home/
drwxrwxrwt. 3 root root 4096 9月 19 16:00 /home/
[root@localhost ~]$ su - litao
[litao@localhost ~]$ rm /home/abc.c #litao不能删除别人的文件
rm:是否删除有写保护的普通空文件 "/home/abc.c"?y
rm: 无法删除"/home/abc.c": 不允许的操作
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
超级管理员删除
该目录的所有者删除
该文件的所有者删除
而由于根目录下的目录所有者是root,所以当为了文件共享,将文件放在根目录下的某一个目录内,此时只有root和文件所有者可以删除,其他人可以读写但是不能删除文件。
所以最终为了文件级的系统操作,我们可以将文件放在根目录下的tmp
