目录

1、Shell命令以及运行原理

2、Linux权限的概念

3、Linux权限管理

3.1、文件访问者的分类(人)

3.2、文件类型和文件权限属性(事物属性)

3.3、粘滞位

4、file指令


1、Shell命令以及运行原理

        Linux严格意义上说的是一个操作系统,我们称之为" 核心(kernel) " ,但我们的用户不能直接使用kernel,    而是通过kernel的"外壳"程序,也就是所谓的shell指令,来与kernel沟通,如何理解?为什么不能直接使用kernel?

从技术角度,shell的最简单定义:命令行解释器(command Interpreter)主要包含:
1、将使用者的命令翻译给核心(kernel)处理、
2、同时,将核心的处理结果翻译给使用者、
        对比Windows GUI,我们操作Windows 不是直接操作Windows内核,而是通过图形接口,点击,从而完成我们的操作,比如进入D盘的操作,我们通常是双击D盘盘符,或者运行起来一个应用程序、
        shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核,反馈结果再通过内核运行出结果,通过shell 解析给用户、
     

        严格意义上来讲,我们之前所讲的操作系统重点指的是Linux内核,也叫作核心,即:Kernel,一般来说,用户是不直接使用Kernel的,因为不擅长,而是通过一个叫做外壳的程序,在Linux系统下,所谓的外壳程序就是shell指令,所以,在Linux系统下,用户时通过shell指令来与操作系统进行沟通的,shell指令(Linux系统下的外壳程序),是用来传递用户指令,交给操作系统(OS),操作系统执行完毕后,再把结果交给shell指令(Linux系统下的外壳程序),最后,shell指令(Linux系统下的外壳程序)再交给用户,在Linux系统下,所谓的外壳程序就是命令行解释器,也就是shell指令,而在Windows系统下,外壳程序就是图形化界面,即,图形化界面就是Windows系统下的外壳程序,当然除此之外,在Windows操作系统中也可以使用指令来操作Windows系统,但图形化界面不属于Windows操作系统内核的一部分,Linux系统中也可以带图形化界面,Linux系统下的图形化界面不属于Linux操作系统内核的一部分、

Linux系统中,shell指令(Linux系统下的外壳程序)存在的意义:

1、降低操作OS的成本

2、保护操作系统,如果用户执行非法操作,外壳程序则可以直接拦截、

由上可知,Windows系统中的外壳程序或命令行解释器存在的意义也是如此、

关于shell命令以及运行原理剩下的内容会在建伟干进程概念之后再进行具体的阐述、

        在Linux系统中,shell 指令叫做外壳程序,也可叫做命令行解释器,但要知道,shell 命令是外壳程序和命令行解释器的统称,我们具体使用的外壳程序或命令行解释器是bash指令,该指令是 /usr/bin 路径下的一个可执行程序,即,我们 centos 7 常用的具体的外壳程序或命令行解释器是bash指令,其次,sh指令也是一种具体的外壳程序或命令行解释器、


2、Linux权限的概念

Linux系统下有两种用户:超级用户(root)、普通用户、
超级用户:可以在Linux系统下做任何事情,不受限制、
普通用户:在Linux系统下做有限的事情、
超级用户的命令行提示符是"#",普通用户的命令行提示符是"$",如下所示:
命令: su [用户名]
功能: 切换用户,但不会改变路径、
        例如,要从 root 用户切换到普通用户 user,则使用 su user, 要从普通用户 user 切换到 root 用户则使用 su root(root可以省略),此时系统会提示输入 root 用户的密码、
//1、超级用户
[root@hjmlcc ~]# whoami
root
[root@hjmlcc ~]# pwd
/root
[root@hjmlcc ~]# 

//2、普通用户
[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ 

        root 用户只能有一个,而普通用户则可以有多个,在Windows系统下,以管理员身份运行就类似于Linux系统中的 root 用户,在Linux系统下,root用户拥有最高的权限,而普通用户最典型的特征就是,其权限受管控,受约束、

[HJM@hjmlcc ~]$ whoami  //此行中的~代表的是家目录,若是root用户,家目录就是/root,若是普通用户
//家目录就是/home/HJM,以普通用户HJM为例、
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM              //注意:指令su代表切换用户,-代表是root用户,su -代表的就是将当前用户切换
                       //到root用户,此指令会切换用户到root用户,也会改变路径、
[HJM@hjmlcc ~]$ su -   //指令su -的作用就是将当前用户切换到root用户,若当前用户是普通用户,则需要
//在下面输入root用户的密码,即可切换到root用户,如下所示:
Password: 
Last login: Sat Oct  8 14:27:59 CST 2022 on pts/0
[root@hjmlcc ~]# pwd
/root  //会改变路径、
[root@hjmlcc ~]# su -  //若当前用户已经是root用户,若再执行su -指令,也会将当前用户切换到root用户
//并且也会改变路径到切换到的用户的家目录下、

//注意:最好不要把root用户的密码和普通用户的密码设置成一样的、

//注意:指令su root和指令su的作用是一样的,都是将当前用户切换到root用户,但是与指令su -不同的是,这
//两条指令只起到切换用户的作用,并不会改变路径到切换到的用户的家目录下、

[root@hjmlcc ~]# whoami
root
[root@hjmlcc ~]# pwd
/root
[root@hjmlcc ~]# su HJM  //把当前用户(root用户)切换到普通用户HJM,但是不会改变路径到普通用户
//HJM的家目录/home/HJM下、
[HJM@hjmlcc root]$ whoami
HJM
[HJM@hjmlcc root]$ pwd   //路径仍是/root,并没有发生改变、
/root
[HJM@hjmlcc root]$ ls    //由于此时使用的是普通用户HJM,但是路径仍是/root,所以任何指令都是不
//能执行的,因为权限不够,这就需要后期的sudo指令来提升权限,具体在后面再进行阐述、
ls: cannot open directory .: Permission denied
[HJM@hjmlcc root]$ mkdir lcchjm
mkdir: cannot create directory ‘lcchjm’: Permission denied
[HJM@hjmlcc root]$ 



[root@hjmlcc ~]# whoami
root
[root@hjmlcc ~]# pwd
/root
[root@hjmlcc ~]# cd ..
[root@hjmlcc /]# pwd
/
[root@hjmlcc /]# ls
bin   data  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
boot  dev   home  lib64  media       opt  root  sbin  sys  usr
[root@hjmlcc /]# cd home
[root@hjmlcc home]# pwd
/home
[root@hjmlcc home]# ls
hjm  HJM
[root@hjmlcc home]# cd HJM
[root@hjmlcc HJM]# pwd
/home/HJM
[root@hjmlcc HJM]# ls
code  hjm  lcc  LCC  lcc.c
[root@hjmlcc HJM]# touch HJM.c
[root@hjmlcc HJM]# ls
code  hjm  HJM.c  lcc  LCC  lcc.c
[root@hjmlcc HJM]# 

//此时可以使用root用户在普通用户HJM的家目录(/home/HJM)下执行指令,这是因为,root用户的权限不受
//任何限制、

//注意:当进行用户切换时,不管该过程中会不会改变路径,exit和ctrl+d,两个指令都会返回到切换用户之
//前的用户和之前的路径下、
[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ su hjm
Password:                     //不知道密码、
su: Authentication failure    //认证错误、
[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ su -
Password:   
Last login: Sat Oct  8 17:05:01 CST 2022 on pts/0
[root@hjmlcc ~]# whoami
root
[root@hjmlcc ~]# pwd
/root
[root@hjmlcc ~]# su hjm
[hjm@hjmlcc root]$ whoami
hjm
[hjm@hjmlcc root]$ pwd
/root
[hjm@hjmlcc root]$ ls
ls: cannot open directory .: Permission denied
[hjm@hjmlcc root]$ cd ~
[hjm@hjmlcc ~]$ whoami
hjm
[hjm@hjmlcc ~]$ pwd
/home/hjm
[hjm@hjmlcc ~]$ ls
[hjm@hjmlcc ~]$ touch lcc.c
[hjm@hjmlcc ~]$ ls
lcc.c
[hjm@hjmlcc ~]$ 
//由此可知,root用户的权限十分大,不受任何限制、
[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ su  //将当前普通用户HJM切换到root用户,但是路径不变,仍是/home/HJM
Password: 
[root@hjmlcc HJM]# whoami
root
[root@hjmlcc HJM]# pwd
/home/HJM
[root@hjmlcc HJM]# exit  
//此时由于在刚才的su指令之前还存在一个普通用户HJM和其对应的路径/home/HJM,所以
//此处的指令exit的作用是返回到su指令之前的普通用户HJM以及对应的路径/home/HJM下、
exit
[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ exit
//而在su指令之前存在的普通用户HJM和其对应的路径/home/HJM,再往前就不存在用户和该用户对应的
//路径了,所以,此处的指令exit的作用就是退出su指令之前存在的普通用户HJM,还要知道,ctrl+d的
//原理和指令exit的原理是一样的、
logout

Connection closed.

Disconnected from remote host(新建会话) at 17:17:54.

Type `help' to learn how to use Xshell prompt.
[C:\~]$ 

3、Linux权限管理

[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM        //ll指令和ls -l指令的作用是一样的,具体的实现原理在后期阐述环境变量时再说、
[HJM@hjmlcc ~]$ ls
code  hjm  HJM.c  lcc  LCC  lcc.c
[HJM@hjmlcc ~]$ ll
total 16         //下面全是文件的属性,其中,目录也算文件,属于目录文件、
drwxrwxr-x 3 HJM  HJM  4096 Oct  8 15:24 code
drwxrwxr-x 2 HJM  HJM  4096 Oct  6 17:32 hjm
-rw-r--r-- 1 root root    0 Oct  8 16:39 HJM.c
drwxr-xr-x 2 root root 4096 Oct  8 15:42 lcc
drwxrwxr-x 3 HJM  HJM  4096 Oct  6 19:47 LCC
-rw-r--r-- 1 root root    0 Oct  8 15:58 lcc.c
[HJM@hjmlcc ~]$ ls -l
total 16         //下面全是文件的属性,其中,目录也算文件,属于目录文件、
drwxrwxr-x 3 HJM  HJM  4096 Oct  8 15:24 code
drwxrwxr-x 2 HJM  HJM  4096 Oct  6 17:32 hjm
-rw-r--r-- 1 root root    0 Oct  8 16:39 HJM.c
drwxr-xr-x 2 root root 4096 Oct  8 15:42 lcc
drwxrwxr-x 3 HJM  HJM  4096 Oct  6 19:47 LCC
-rw-r--r-- 1 root root    0 Oct  8 15:58 lcc.c
[HJM@hjmlcc ~]$ touch lcc.txt
[HJM@hjmlcc ~]$ nano lcc.txt
[HJM@hjmlcc ~]$ cat lcc.txt
xxxx    //文件的内容、
[HJM@hjmlcc ~]$ 

[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ ls
lcc.c
[HJM@hjmlcc ~]$ cat lcc.c
#include<stdio.h>
int main()
{
    printf("Hello,lcc\n");
    return 0;
}
[HJM@hjmlcc ~]$ gcc lcc.c  
[HJM@hjmlcc ~]$ ls
a.out  lcc.c
[HJM@hjmlcc ~]$ mv a.out a.exe
[HJM@hjmlcc ~]$ ls
a.exe  lcc.c
[HJM@hjmlcc ~]$ ./a.exe
Hello,lcc
[HJM@hjmlcc ~]$ mv a.exe a.txt
[HJM@hjmlcc ~]$ ls
a.txt  lcc.c
[HJM@hjmlcc ~]$ ./a.txt
Hello,lcc
[HJM@hjmlcc ~]$         //注意:虽然这里a.exe和a.txt都可以,但我们最好还是使用a.out、

//在Linux系统下,不是以文件名的后缀来区分文件类型的、
[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ ls
lcc.c
[HJM@hjmlcc ~]$ ll  //或ls -l
total 4
-rw-rw-r-- 1 HJM HJM 74 Oct  8 18:04 lcc.c
//gcc lcc.c是可以成功的,lcc.c是用来存放c语言代码的普通源文件,由于linux系统下不以文件后缀作为
//区分文件类型的标准,经过下述指令,所以对于普通文件lcc.txt来说,仍会被linux系统看做是存放c语言代
//码的源文件、
[HJM@hjmlcc ~]$ mv lcc.c lcc.txt
[HJM@hjmlcc ~]$ ls
lcc.txt
[HJM@hjmlcc ~]$ ll  //或ls -l
total 4
-rw-rw-r-- 1 HJM HJM 74 Oct  8 18:04 lcc.txt
[HJM@hjmlcc ~]$ gcc lcc.txt
//不是说Linux系统不以文件的后缀来区分文件类型吗,那么这里为什么会报错呢?
//答:gcc不是Linux系统,Linux系统中的确不以文件的后缀来区分文件类型,但是gcc不是Linux系统,gcc只
//是在Linux系统上部署的一个编译器软件,所以gcc是会根据文件的后缀来区分文件类型的,除了gcc,还有
//其他的在Linux系统上的软件,也有可能会根据文件的后缀来区分文件的类型,是软件自己的特殊需求导
//致的,此处的普通文件lcc.txt在gcc眼里并不是存放c语言代码的源文件,而是认为它是一个普通文本文件,
//所以在linux系统下,要想使得gcc认为某一个普通文件是存放c语言代码的源文件,则该普通文件的后缀必
//须是.c才可以、

//拓展:
//g++也不是Linux系统,Linux系统中的确不以文件的后缀来区分文件类型,但是g++不是Linux系统,g++只
//是在Linux系统上部署的一个编译器软件,所以g++是会根据文件的后缀来区分文件类型的,除了g++,还有
//其他的在Linux系统上的软件,也有可能会根据文件的后缀来区分文件的类型,是软件自己的特殊需求导
//致的,此处的普通文件lcc.txt在g++眼里并不是存放c++语言代码的源文件,而是认为它是一个普通文本
//文件,所以在linux系统下,要想使得g++认为某一个普通文件是存放c++代码的源文件,则该普通文件的后
//缀必须是.cpp才可以、

lcc.txt: file not recognized: File format not recognized
collect2: error: ld returned 1 exit status  //当前不能识别lcc.txt普通文件、
[HJM@hjmlcc ~]$ 

        操作系统是一款软件,也是一种层状结构,目前而言,可以理解为,操作系统间接管理硬件,本质上操作系统是通过软件的方式来管理硬件的,在Linux系统中,一般来说,私密文件和系统本身的一些配置文件(防止用户做误删操作),通常以 . 开头,将其隐藏起来、

[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ mkfifo pipe  //创建管道文件,在后期的进程和通信中会阐述管道文件的作用、
[HJM@hjmlcc ~]$ ls
lcc.c  pipe
[HJM@hjmlcc ~]$ ll
total 4
-rw-rw-r-- 1 HJM HJM 74 Oct  8 18:04 lcc.c
prw-rw-r-- 1 HJM HJM  0 Oct  9 15:15 pipe   //prw-rw-r-- 1,以p开头、
[HJM@hjmlcc ~]$ 

[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        989M     0  989M   0% /dev
tmpfs          1000M   24K 1000M   1% /dev/shm
tmpfs          1000M  540K  999M   1% /run
tmpfs          1000M     0 1000M   0% /sys/fs/cgroup
/dev/vda1        40G  4.8G   33G  13% /
tmpfs           200M     0  200M   0% /run/user/0
tmpfs           200M     0  200M   0% /run/user/1002
[HJM@hjmlcc ~]$ ls /dev/vda1
/dev/vda1
[HJM@hjmlcc ~]$ ls /dev/vda1 -l
brw-rw---- 1 root disk 253, 1 Jul 28 11:13 /dev/vda1   //  /dev/vda1 就是磁盘,以b开头,一般把磁盘叫做块设备、
[HJM@hjmlcc ~]$ 
//在后期讲文件系统和数据库时,会对磁盘和文件系统做详细的介绍、

Linux系统上的权限,都是对文件的权限、

什么是权限:

1、约束人的(对人进行分类),不同的人具有不同的权限、

2、需要对应的事物具有特定的属性,比如文件应该具有的属性有:r,w,执行(x),这些属性只是用来约束普通用户(普通用户之间互相约束)的,对root用户不起任何作用、

权限 = 人 + 事物属性 ,权限的概念以及操作都是围绕着人和文件属性进行展开的、

3.1、文件访问者的分类(人)

在Linux系统中,人分三类:

文件和文件目录的所有者(拥有者)或文件的拥有者:owner

文件和文件目录的所有者(拥有者)所在的整个组(包括拥有者自身)或文件的所属组:grouper
文件和文件目录的其它用户或文件的其他用户:others 

3.2、文件类型和文件权限属性(事物属性)

    Linux系统中,文件的权限属性主要分为:r,w,x(可执行),原本是4个,目前只谈这三个,其中,连接数会在后期讲解基础 IO 时再进行具体阐述、
Linux系统下常见的文件类型补充:
 
l:软链接(类似Windows的快捷方式)、
b:块设备文件(例如硬盘、光驱,最典型的就是磁盘)、
c:字符设备文件(例如屏幕等串口设备)、
s:套接口文件、
基本权限:
1、
        读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限、
2、
        写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限、
3、
        执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限、
4、
        "—"表示不具有该项权限、

文件权限的修改方法:


1、方法一:

[HJM@hjmlcc ~]$ whoami
HJM      
             
//由指令whoami可得,当前正在使用的用户是普通用户HJM,而对于普通文件lcc.c而言,该普通文件的拥有者
//是普通用户HJM,并且该普通文件的拥有者,即普通用户HJM所在的所属组的组名也是HJM,其次,由于该所属
//组中只有普通用户HJM一个成员,此时系统默认该所属组的组名和普通用户HJM同名,当然,我们也可以对该
//所属组的组名进行重命名,对于普通文件lcc.c而言,拥有者,即普通用户HJM也在该普通文件的所属组里,
//但要注意的是,此时对于普通用户HJM(普通文件的拥有者)仍要按照拥有者的权限来做,而对于该普通文件
//lcc.c的所属组里除了该普通文件lcc.c的拥有者(普通用户HJM)之外的所有的普通用户对该普通文件
//lcc.c的权限一律要按照该普通文件lcc.c的所属组的权限来做,其次,我们也可以向普通文件lcc.c的所属
//组里添加其他的普通用户,并且此时还可以修改所属组的组名,具体修改的操作在后期进行阐述、

[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ ls
code  lcc.c
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
-rw-rw-r-- 1 HJM HJM   74 Oct  8 18:04 lcc.c  //普通文件lcc.c的拥有者和所属组都是HJM,其中,拥有者具有的权限是rw-,所属组具有的权限是rw-,其他用户具有的权限是r--、
[HJM@hjmlcc ~]$ ./lcc.c    //执行普通文件lcc.c、
-bash: ./lcc.c: Permission denied  //普通文件lcc.c的拥有者不具有可执行的权限,所以此时会报权限不够、
[HJM@hjmlcc ~]$ cat lcc.c  
#include<stdio.h>
int main()
{
    printf("Hello,lcc\n");
    return 0;
}
[HJM@hjmlcc ~]$ echo "hello,lcc" > lcc.c
[HJM@hjmlcc ~]$ cat lcc.c
hello,lcc
[HJM@hjmlcc ~]$ chmod u-r lcc.c  //u代表文件的拥有者,-代表减去,r代表可读,chmod指令代表修改
//权限,即:使得普通文件lcc.c的拥有者失去可读的权限、
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
--w-rw-r-- 1 HJM HJM   10 Oct  9 18:15 lcc.c
[HJM@hjmlcc ~]$ chmod g-r lcc.c  //g代表文件的所属组,-代表减去,r代表可读,chmod指令代表修改
//权限,即:使得普通文件lcc.c的所属组失去可读的权限、
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
--w--w-r-- 1 HJM HJM   10 Oct  9 18:15 lcc.c
[HJM@hjmlcc ~]$ chmod o-r lcc.c  //o代表文件的其他用户,-代表减去,r代表可读,chmod指令代表修改
//权限,即:使得普通文件lcc.c的其他用户失去可读的权限、
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
--w--w---- 1 HJM HJM   10 Oct  9 18:15 lcc.c
[HJM@hjmlcc ~]$ chmod u+xr lcc.c  //u代表文件的拥有者,+代表增加,r代表可读,x代表可执行,chmod指令代表修改权限,即:使得普通文件lcc.c的拥有者增加可读和可执行的权限,此处可以写成最好u+rx、
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
-rwx-w---- 1 HJM HJM   10 Oct  9 18:15 lcc.c
[HJM@hjmlcc ~]$ ./lcc.c   //此处的./代表是当前目录,代表运行可执行程序,但是lcc.c普通文件并不
//是可执行程序,要想验证linux系统下不以文件的后缀来区分文件类型,在此处必须要保证./后面跟的是一
//个可执行程序(普通文件)才可以,然后通过重命名(主要是重命名后缀)的方式去验证linux系统下不以文件
//的后缀来区分文件类型,而此时的普通文件lcc.c并不是一个可执行程序,所以会报错,但该错误并不是由权
//限造成的、
./lcc.c: line 1: hello,lcc: command not found
[HJM@hjmlcc ~]$ chmod g+r lcc.c
[HJM@hjmlcc ~]$ ll
total 20
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
-rwxrw---- 1 HJM HJM   75 Oct  9 18:46 lcc.c
[HJM@hjmlcc ~]$ chmod o+rwx lcc.c
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
-rwxrw-rwx 1 HJM HJM   75 Oct  9 18:46 lcc.c
[HJM@hjmlcc ~]$ chmod u-wx,g-w,o-rwx lcc.c    //wx和rwx两者中的顺序是可以任意组合的、
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
-r--r----- 1 HJM HJM   75 Oct  9 18:46 lcc.c
[HJM@hjmlcc ~]$ chmod u+rwx,g+rwx,o+rwx lcc.c
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
-rwxrwxrwx 1 HJM HJM   75 Oct  9 18:46 lcc.c
[HJM@hjmlcc ~]$ chmod u-rwx,g-rwx,o-rwx lcc.c
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
---------- 1 HJM HJM   75 Oct  9 18:46 lcc.c
[HJM@hjmlcc ~]$ chmod u+r,o+r lcc.c
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code     //文件的权限是用来约束普通用户的,对root用户
                                                 //不起任何作用、
-r-----r-- 1 HJM HJM   75 Oct  9 18:46 lcc.c
[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
-r-----r-- 1 HJM HJM   75 Oct  9 18:46 lcc.c
//此时,普通文件lcc.c的拥有者是HJM,所属组也是HJM,所以对于该普通文件lcc.c而言,root用户就是文件
//的其他用户、
[HJM@hjmlcc ~]$ su
Password: 
[root@hjmlcc HJM]# ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
-r-----r-- 1 HJM HJM   75 Oct  9 18:46 lcc.c
[root@hjmlcc HJM]# whoami
root
[root@hjmlcc HJM]# pwd
/home/HJM
[root@hjmlcc HJM]# cat lcc.c   //可读、
#include<stdio.h>
int main()
{
    printf("Hello,lcc\n");
    return 0;
}

[root@hjmlcc HJM]# echo "hello" >> lcc.c
//此时,普通文件lcc.c的拥有者和所属组都是HJM,那么对于普通文件lcc.c而言,root用户就是其他用户,
//而其他用户的权限是可读,不可写,不可执行,但是此处发现能够写,这是为什么呢?
//由此可知,文件的权限是用来约束普通用户的,对root用户不起任何作用、
[root@hjmlcc HJM]# cat lcc.c 
#include<stdio.h>
int main()
{
    printf("Hello,lcc\n");
    return 0;
}

hello
[root@hjmlcc HJM]# 


//如果某一个文件的拥有者和所属组都是root用户,那么该文件的权限是否能够约束root用户呢,答案是不能
//这就是超级用户root、

2、方法二:

[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ ls
code  lcc.c
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
-rwx---r-- 1 HJM HJM   75 Oct  9 21:14 lcc.c
[HJM@hjmlcc ~]$ chmod 777 lcc.c

//注意:777分别是三个八进制的数字,转换成三个对应的二进制数字为:111 111 111,即每一组111分别对应
//着普通文件lcc.c的拥有者,所属组,其他用户对普通文件lcc.c的权限,只以普通文件lcc.c的拥有者对于普
//通文件lcc.c的权限为例,111,第一个1代表的是普通文件lcc.c的拥有者对于普通文件lcc.c具有可读的权
//限,第二个和第三个1,分别代表着普通文件lcc.c的拥有者对普通文件lcc.c具有可写,可执行的权限,即普
//通文件lcc.c的拥有者对于普通文件lcc.c具有可读,可写,可执行的权限,同样,普通文件lcc.c的所属组和
//其他用户对于普通文件lcc.c的权限可以类比来看、

[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
-rwxrwxrwx 1 HJM HJM   75 Oct  9 21:14 lcc.c
[HJM@hjmlcc ~]$ chmod 000 lcc.c  //000分别是三个八进制的数字,转换成三个对应的二进制数
                                 //字为:000 000 000 
//将普通文件lcc.c的拥有者,所属组,其他用户对于普通文件lcc.c的权限均更改为:不可读,不可写,不可执行、
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
---------- 1 HJM HJM   75 Oct  9 21:14 lcc.c
[HJM@hjmlcc ~]$ 

文件拥有者和所属组的修改方法:

[HJM@hjmlcc home]$ pwd
/home
[HJM@hjmlcc home]$ ls
hjm  HJM
[HJM@hjmlcc home]$ cd HJM
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
---------- 1 HJM HJM   75 Oct  9 21:14 lcc.c
[HJM@hjmlcc ~]$ chown root lcc.c //将普通文件lcc.c的拥有者改为root用户、
chown: changing ownership of ‘lcc.c’: Operation not permitted  //失败,没有权限、
[HJM@hjmlcc ~]$ chown hjm lcc.c  //将普通文件lcc.c的拥有者改为普通用户hjm、
chown: changing ownership of ‘lcc.c’: Operation not permitted  //失败,没有权限、
//当前在使用的是普通用户的情况下,若想改变某一个文件的拥有者(改变到普通用户hjm,或改变到root用户),必须要经过root用户的允许才可以,具体有下面两种解决方法:

//针对上述失败,下面有两种解决方法:
//方法一:
//注意:sodu指令是短暂的提升权限,以root的身份去执行该chown指令,以root身份去执行该指令是因为
//root用户具有最高权限,想做什么就作什么,但是目前而言,我们的Linux系统在使用sudo指令时会报错,
//具体的解决方法在后期讲完vim之后再进行阐述,报错的原因是,目前的普通用户HJM还未被添加到信任
//列表中、
[HJM@hjmlcc ~]$ sudo chown hjm lcc.c
[sudo] password for HJM: //当普通用户HJM被添加到信任列表中后,此时当执行sudo指令以root身份去
//执行chown指令时,不需要再输入root用户的密码,只需要输入普通用户HJM的密码即可,因为现在的root
//用户是信任普通用户HJM的,除此之外,我们目前执行sudo指令报错的原因也是因为目前root用户未把普通
//用户HJM添加到信任列表中,信任列表在Linux系统中是一个配置文件,信任列表只能由root用户来操作,在
//root用户作为当前用户时,执行指令:cat /etc/sudoers 来操作、
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
---------- 1 hjm HJM   75 Oct  9 21:14 lcc.c
[HJM@hjmlcc ~]$ sudo chown root lcc.c
//由于上面的代码中已经输入了普通用户HJM的密码,即,前面进行了sudo指令的第一次认证,大概在10分钟
//左右,当再次使用sudo指令时,就不需要再输入HJM(已添加进信任列表中)的密码了、
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
---------- 1 root HJM   75 Oct  9 21:14 lcc.c
[HJM@hjmlcc ~]$  

//方法二:
[HJM@hjmlcc ~]$ su  //切换到root用户,但是不改变路径、
Password: 
[root@hjmlcc HJM]# whoami
root
[root@hjmlcc HJM]# pwd
/home/HJM
[root@hjmlcc HJM]# ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
---------- 1 HJM HJM   75 Oct  9 21:14 lcc.c
[root@hjmlcc HJM]# chown hjm lcc.c //将普通文件lcc.c的拥有者改为普通用户hjm,但要注意的是,此
//时我们使用的用户是root用户,root用户权限最高,root用户想让普通文件lcc.c的拥有者从普通用户HJM
//改为普通用户hjm,是可以直接操作的,不会报 chown: changing ownership of ‘lcc.c’: Operation not permitted 权限错误、
[root@hjmlcc HJM]# ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
---------- 1 hjm HJM   75 Oct  9 21:14 lcc.c
[root@hjmlcc HJM]# 
//方法一:
[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
---------- 1 hjm HJM   75 Oct  9 21:14 lcc.c
[HJM@hjmlcc ~]$ chgrp hjm lcc.c //将普通文件lcc.c的所属组改为hjm,注意,普通用户hjm也会自成一组、
chgrp: changing group of ‘lcc.c’: Operation not permitted //失败,权限不够、
[HJM@hjmlcc ~]$ su
Password: 
[root@hjmlcc HJM]# whoami
root
[root@hjmlcc HJM]# pwd
/home/HJM
[root@hjmlcc HJM]# ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
---------- 1 hjm HJM   75 Oct  9 21:14 lcc.c
[root@hjmlcc HJM]# chgrp hjm lcc.c
[root@hjmlcc HJM]# ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
---------- 1 hjm hjm   75 Oct  9 21:14 lcc.c
//此时,普通用户HJM对于普通文件lcc.c而言就是该普通文件lcc.c的其他用户、
[root@hjmlcc HJM]#  


//方法二:
[HJM@hjmlcc ~]$ whoami 
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
---------- 1 hjm hjm   75 Oct  9 21:14 lcc.c
[HJM@hjmlcc ~]$ sudo chgrp HJM lcc.c
//由于上面的代码中已经输入了普通用户HJM的密码,即,前面进行了sudo指令的第一次认证,大概在10分钟
//左右,当再次使用sudo指令时,就不需要再输入HJM(已添加进信任列表中)的密码了、
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct  9 18:01 code
---------- 1 hjm HJM   75 Oct  9 21:14 lcc.c
[HJM@hjmlcc ~]$ 
[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct 13 11:25 code
-r-------- 1 HJM HJM   77 Oct 13 11:02 lcc.c
[HJM@hjmlcc ~]$ chmod u+w,g+r,o+r lcc.c
//对于普通文件lcc.c而言,所有者是普通用户HJM,并且当前用户是普通用户HJM,即也是普通文件lcc.c的所有
//者,故在当前用户HJM下,可以随意更改普通文件lcc.c的所有者,所属组以及其他用户对普通文件lcc.c的权限
//并且不会报权限错误、
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct 13 11:25 code
-rw-r--r-- 1 HJM HJM   77 Oct 13 11:02 lcc.c
[HJM@hjmlcc ~]$ su
Password: 
[root@hjmlcc HJM]# ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct 13 11:25 code
-rw-r--r-- 1 HJM HJM   77 Oct 13 11:02 lcc.c
[root@hjmlcc HJM]# chmod u-r lcc.c
//注意:此时当前用户是root用户,而对于普通文件lcc.c而言,所有者是普通用户HJM,所属组中也只存在普通
//用户HJM,所以此时,对于普通文件lcc.c而言,root用户就是其他用户,但此时root用户并不是普通文件lcc
//.c的所有者,所以按理说,此时的当前用户(root用户)是没有办法更改普通文件lcc.c的所有者,所属组以及
//其他用户对普通文件lcc.c权限的,但此时却发现,是可以操作的,这是因为,root用户具有最高权限(同下)
//,本来是没有权限(此处所指的权限并不是普通文件lcc.c的所有者,所属组以及其他用户对普通文件
//lcc.c的权限),做到的,但是通过测试发现,是可以做到的,这就说明root用户会忽视这一权限(同前)限制、
[root@hjmlcc HJM]# ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct 13 11:25 code
--w-r--r-- 1 HJM HJM   77 Oct 13 11:02 lcc.c
[root@hjmlcc HJM]# 
 
[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct 13 11:25 code
--w-r--r-- 1 hjm HJM   77 Oct 13 11:02 lcc.c
[HJM@hjmlcc ~]$ chmod u+r lcc.c
//当前用户是普通用户HJM,但是对于普通文件lcc.c而言,普通用户hjm是所有者,故当前用户,即普通用户HJM,
//并不是普通文件lcc.c的所有者,并且当前用户也不是root用户,所以,当前用户(普通用户HJM)是没有办法
//修改普通文件lcc.c的所有者,所属组以及其他用户对普通文件lcc.c的权限的,此时会报错,说是权限不够,
//注意这个权限并不是指普通文件lcc.c的所有者,所属组以及其他用户对普通文件lcc.c的权限、
chmod: changing permissions of ‘lcc.c’: Operation not permitted
[HJM@hjmlcc ~]$ 

//总结:对某一个文件而言,如果当前用户不是该文件的所有者,也不是root用户,那么在当前用户下,是不能修改
//该文件的所有者,所属组以及其他用户对该文件权限的,但此时可以通过指令sudo或者切换到root用户,或者
//将当前用户切换为该文件的所有者时,再修改该文件的所有者,所属组以及其他用户对该文件的权限,就不存在
//任何限制了、
[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct 13 11:25 code
--w-r--r-- 1 hjm HJM   77 Oct 13 11:02 lcc.c
[HJM@hjmlcc ~]$ su 
Password: 
[root@hjmlcc HJM]# whoami
root
[root@hjmlcc HJM]# pwd
/home/HJM
[root@hjmlcc HJM]# ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct 13 11:25 code
--w-r--r-- 1 hjm HJM   77 Oct 13 11:02 lcc.c
[root@hjmlcc HJM]# chown root:root lcc.c
//通过上述一条指令就可以直接将普通文件lcc.c的所属组和拥有者全部改成root用户、
[root@hjmlcc HJM]# ll
total 8
drwxrwxr-x 2 HJM  HJM  4096 Oct 13 11:25 code
--w-r--r-- 1 root root   77 Oct 13 11:02 lcc.c
[root@hjmlcc HJM]# chown HJM:HJM lcc.c
//通过上述一条指令就可以直接将普通文件lcc.c的所属组和拥有者全部改成普通用户HJM、
[root@hjmlcc HJM]# ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct 13 11:25 code
--w-r--r-- 1 HJM HJM   77 Oct 13 11:02 lcc.c
[root@hjmlcc HJM]# 

//注意:某一个文件的创建者和拥有者并不一定是同一个人、
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct 13 11:25 code
--w-r--r-- 1 HJM HJM   77 Oct 13 11:02 lcc.c
[HJM@hjmlcc ~]$ chmod a=r lcc.c  //a代表的是all,即指该普通文件lcc.c的拥有者,所属组和其他用户,即指所有的意思、
//此时是将普通文件lcc.c的拥有者,所属组和其他用户对该普通文件lcc.c的权限都只设置为可读的权限、
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct 13 11:25 code
-r--r--r-- 1 HJM HJM   77 Oct 13 11:02 lcc.c
[HJM@hjmlcc ~]$ chmod -r lcc.c
//将普通文件lcc.c的所有者,所属组和其他用户对该普通文件lcc.c的可读权限全部去掉、
[HJM@hjmlcc ~]$ ll
total 8
drwxrwxr-x 2 HJM HJM 4096 Oct 13 11:25 code
---------- 1 HJM HJM   77 Oct 13 11:02 lcc.c
[HJM@hjmlcc ~]$ 


文件权限值的表示方法:

方法一:

字符表示方法:


方法二:

八进制数值表示方法:

文件访问权限的相关设置方法:

指令:chmod               功能:设置文件的访问权限             格式:chmod [参数] 权限 文件名

常用选项:   R:递归修改目录文件的权限、
说明: 只有文件的拥有者和root用户才可以改变文件的权限、
用户表示符 + / - = 权限字符:
+: 向权限范围增加权限代号所表示的权限、
- : 向权限范围取消权限代号所表示的权限、
=: 向权限范围赋予权限代号所表示的权限、
用户符号:   u:拥有者    g:所属组    o:其它用户    a:所有用户
chown
功能: 修改文件或目录的拥有者
格式: chown [参数] 用户名 文件名
实例:
# chown user1 f1
# chown -R user1 filegroup1
chgrp
功能: 修改文件或目录的所属组、
格式: chgrp [参数] 用户组名 文件名、
常用选项: -R 递归修改文件或目录的所属组、
[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ ll
total 4
drwxrwxr-x 2 HJM HJM 4096 Oct 13 11:25 code
[HJM@hjmlcc ~]$ chmod u-x code
//目录文件code的拥有者是普通用户HJM,所属组中也只有普通用户HJM一个,此时当前用户是普通用户HJM,也是
//该目录文件code的所有者,那么此时可以直接修改目录文件code的所有者,所属组和其他用户对目录文件
//code的权限,由上述指令可知,如果想进入目录文件code中,和可执行权限x有关、
[HJM@hjmlcc ~]$ ll
total 4
drw-rwxr-x 2 HJM HJM 4096 Oct 13 11:25 code
[HJM@hjmlcc ~]$ cd code
bash: cd: code: Permission denied //进入目录文件code的权限不够、
[HJM@hjmlcc ~]$ chmod u+x code
[HJM@hjmlcc ~]$ ll
total 4
drwxrwxr-x 2 HJM HJM 4096 Oct 13 11:25 code
[HJM@hjmlcc ~]$ cd code
[HJM@hjmlcc code]$ ll
total 0
---x------ 1 HJM HJM 0 Oct 13 11:25 hj.c
[HJM@hjmlcc code]$ cd ..
[HJM@hjmlcc ~]$ ll
total 4
drwxrwxr-x 2 HJM HJM 4096 Oct 13 11:25 code
[HJM@hjmlcc ~]$ chmod u-r code
[HJM@hjmlcc ~]$ ll
total 4
d-wxrwxr-x 2 HJM HJM 4096 Oct 13 11:25 code
[HJM@hjmlcc ~]$ cd code  //进入目录文件code的权限足够、
[HJM@hjmlcc code]$ ls  //此时进入目录文件code的权限足够,但进去目录文件code后,查看该目录文件code中的内容的权限不够,由此可知,进入目录文件code后,再查看目录文件code中的内容(一般指查看该目录文件code中有哪些普通文件还有哪些目录文件)的权限和可读权限r有关,其次,目录俗称目录文件,也是文件,而在Linux系统中,一切皆文件,文件=文件内容+文件属性,此处所指的目录文件的内容主要指的就是存放在目录文件code中的部分文件(普通和目录)的"属性"(其实并不能准确的用属性来说,但目前只需要当做属性来看即可),包括部分文件(普通和目录)的文件名(属性)、
//在后期讲解ext系列文件系统,分区,磁盘布局时,再讲解在Linux系统下创建一个文件,到底都做了什么、

ls: cannot open directory .: Permission denied
[HJM@hjmlcc code]$ touch hjm.c //进入目录文件code后,再创建一个普通文件hjm.c的权限足够、
[HJM@hjmlcc code]$ ls
ls: cannot open directory .: Permission denied
[HJM@hjmlcc code]$ cd ..
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ ll
total 4
d-wxrwxr-x 2 HJM HJM 4096 Oct 15 17:19 code
[HJM@hjmlcc ~]$ chmod u-w code
[HJM@hjmlcc ~]$ ll
total 4
d--xrwxr-x 2 HJM HJM 4096 Oct 15 17:19 code
[HJM@hjmlcc ~]$ cd code  //进入目录文件code的权限足够、
[HJM@hjmlcc code]$ touch Hjm.c //进入目录文件code后,再创建一个普通文件Hjm.c的权限不够、
touch: cannot touch ‘Hjm.c’: Permission denied
//由此可知,进入目录文件code后,再创建普通文件或目录文件的权限和可写权限w有关,即,当进入目录文件
//code后,若想改变该目录文件code中的内容的权限是和可写权限w有关系的、
[HJM@hjmlcc code]$ 


//虽然我们在Linux系统下是通过路径来寻找某一个文件的,但如果我们没有某一个目录文件的可读权限,但
//是却知道该目录文件下某一个文件的文件名,并且该文件是具有可读权限的,那么此时是不可以直接读取该
//目录文件下的某一个文件的,但是经过实际操作确是可以的,这一点要记住,按道理来说是不可以的,因为如
//果想拿到该目录文件中的某一个文件的文件名,则需要先能够访问该目录文件中的内容,实际上在Linux系
//统中,某一个文件的文件名在系统中并不存在任何价值,只是用来给路人看的,Linux系统是使用编号来标识
//一个文件的,而不是通过文件的文件名来标识文件,即文件编号,路人是看不到的,上述所谓的可以操作的原
//因可能是目录文件下某一个文件的文件名和它的文件编号之间存在对应的映射关系,这个映射关系可能被
//Linux系统缓存了,所以才导致上述测试是可以的,但按理说应该是不可以的,我们也要按照不可以来记住即
//可、


拓展:

        当使用 mdkir 指令新建目录文件时,此时该新建的目录文件的所有者,所属组和其他用户对该新建目录文件的权限(最终)默认为:drwxrwxr-x(d775),而当使用指令 touch 新建普通文件时,此时该新建的普通文件的所有者,所属组和其他用户对该新建普通文件的权限(最终)默认为:-rw-rw-r--(-664),当然,不同的Linux系统可能会存在差异,具体原因如下:

1、

        按理说,当使用 mdkir 指令新建目录文件时,此时该新建的目录文件的所有者,所属组和其他用户对该新建目录文件的权限(起始权限)默认为:drwxrwxrwx(d777),但是由于Linux系统中存在一个默认的权限掩码,可使用指令umask来查看,为:0002,最左边的0可以忽略不管,它和其他权限位有关,目前可以暂时理解为最左边的0代表该0后面都是八进制数字,则后面的002为八进制数字,转换为二进制即为:000 000 010 ,所谓权限掩码即指,凡是在权限掩码中出现的权限都不应该在最终权限中出现,已知新建目录文件的起始权限默认为777,且我们要在777中把权限掩码中出现的权限"去掉",所以就需要在新建目录文件的起始权限中将在权限掩码中出现的权限"去掉"(具体操作见下面的紫色公式),已知新建目录文件的起始权限默认为777,转为二进制为:111 111 111,而在权限掩码中出现过的权限为002,转为二进制则为000 000 010,所以,需要在新建目录文件的起始权限默认值111 111 111 中将从右往左的第二个权限"去掉",则新建目录文件的默认权限(最终)即为:111 111 101,这就是新建目录文件的最终权限、

2、

        按理说,当使用指令 touch 新建普通文件时,此时该新建的普通文件的所有者,所属组和其他用户对该新建普通文件的权限(起始权限)默认为:-rw-rw-rw-(-666),具体原因同上!


指令:umask   
功能: 查看或修改文件掩码(权限掩码)、
新建普通文件默认起始权限为: 0 666                     0代表八进制数字、
新建目录文件默认起始权限为: 0 777
        但实际上你所新创建的普通文件和目录文件,看到的最终权限往往不是上面这个值,原因就是新创建普通文件或目录文件的时候还要受到 umask 的影响,假设默认权限掩码是umask,则实际创建的出来的普通文件或目录文件的最终权限是: 
最终权限 = 起始权限 & (~umask) ,其中起始权限就是mask,即有:
最终权限 = mask & (~umask)  、
格式: umask 权限值
说明: 将现有的存取权限(起始权限)"去掉"权限掩码后,即可产生新建立普通文件或目录文件时的预设(最终)权限,超级用户root默认权限掩码值为 0 022,普通用户默认权限掩码值为 0 002、
        怎么样理解凡是在权限掩码中出现的权限都不应该在最终权限中出现,是使用减法吗?,答案:不是使用减法,具体原因如上所示、
实例:
# umask 755
# umask //查看
# umask 044//设置


[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ ll
total 4
-r--rw---- 1 LCC LCC 2 Oct 15 20:37 lcc.c
[HJM@hjmlcc ~]$ umask 000  //将umask设置为000(八进制数字)、
[HJM@hjmlcc ~]$ umask
0000                       //第一个0代表该0后面是三个八进制数字、
[HJM@hjmlcc ~]$ umask 111  //将umask设置为111(八进制数字)、
[HJM@hjmlcc ~]$ umask
0111                       //第一个0代表该0后面是三个八进制数字、
[HJM@hjmlcc ~]$ 

普通用户之间的切换,只需要知道密码即可:

[HJM@hjmlcc home]$ whoami
HJM
[HJM@hjmlcc home]$ pwd
/home
[HJM@hjmlcc home]$ ll
total 8
drwx------ 5 HJM HJM 4096 Oct 15 17:06 HJM
drwx------ 4 LCC LCC 4096 Oct 15 19:04 LCC
[HJM@hjmlcc home]$ cd HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ su - LCC
Password:  //654321
Last login: Sat Oct 15 19:04:04 CST 2022 on pts/0
[LCC@hjmlcc ~]$ pwd
/home/LCC
[LCC@hjmlcc ~]$ whoami
LCC
[LCC@hjmlcc ~]$ su - HJM
Password:  //123456
Last login: Sat Oct 15 19:05:51 CST 2022 on pts/0
[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ 

拓展:

以下情况,均不考虑root用户:

1、

        如果某一个文件(以普通文件为例)的所有者是普通用户HJM,且该普通用户HJM自成一组,即,文件的所属组的组名也叫HJM,如果此时把文件的所有者改为普通用户LCC的话,那么该文件的原所有者,即普通用户HJM将变成当前文件所属组中的成员,即,变成了除了现在的文件的所有者普通用户LCC之外的在该文件的所属组中的其他普通用户、

2、

        如果某一个文件(以普通文件为例)的所有者是普通用户HJM,且该普通用户HJM自成一组,即,文件的所属组的组名也叫HJM,如果此时把文件的所有者改为普通用户LCC,且把文件的所属组的组名也改为LCC,即普通用户LCC自成一组,那么此时,文件的原所有者,即普通用户HJM就变成了其他用户,此时,现在文件的所属组中只有普通用户LCC,不存在其他的普通用户,若在改变后的文件的所属组中还存在其他普通用户,则他们对文件的权限需要按照中间三个字符进行、

3、   

        如果某一个文件(以普通文件为例)的所有者是普通用户HJM,且该普通用户HJM自成一组,即,文件的所属组的组名也叫HJM,如果此时只把文件的所属组的组名改为LCC,那么此时,文件的原所有者普通用户HJM仍是现在文件的所有者,这种情况就和第一种情况类似,只是文件的所属组的组名发生了变化,与第一种情况比较没什么区别,此时,普通用户LCC还是文件的其他用户,则普通用户LCC对文件的权限仍按照后三个字符进行、

3.3、粘滞位

[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用户删除、
二、 该公共的目录(目录文件)的所有者删除、
三、 该文件(目录文件或普通文件)的所有者删除、

        在Linux系统中,一些情况下,可以存在有一些公共的目录(目录文件),该目录的所有者是root用户,所属组的组名也是root,即root用户自成一组,当然如果愿意的话,该目录的所有者也可以是某一个普通用户,所属组的组名也可以更改为某一个普通用户的用户名,即,该某一个普通用户自成一组,当然也可以不自成一组,所属组的组名也可以不更改为该某一个普通用户的用户名,但目前而言,我们只考虑该某一个普通用户自成一组的情况,除此之外,在此处我们也只考虑该目录的所有者是root用户,所属组的组名也是root,即root用户自成一组的情况,该目录可以让该目录的其他用户都能进入该目录,并且让该目录的其他用户对该目录均可进行可读可写的权限,由于此处我们只考虑该目录的所有者是root用户,所属组的组名也是root,即root用户自成一组的情况,故,可以理解为:该目录可以让该目录的其他用户(所有的普通用户)都能进入该目录,并且让该目录的其他用户(所有的普通用户)对该目录均可进行可读可写的权限,此时对于所有的普通用户而言,均可以把该普通用户的临时文件(包括目录文件和普通文件)都存放在这个目录中、

在Linux系统中,是存在一些像上述那样所谓的公共目录(目录文件)的,如下所示:

[root@hjmlcc ~]# whoami
root
[root@hjmlcc ~]# pwd
/root
[root@hjmlcc ~]# ls /tmp -dl
drwxrwxrwt. 8 root root 4096 Oct 16 11:52 /tmp
//上述tmp目录(目录文件)的所有者是root用户,所属组的组名也是root,即root用户自成一组、
[root@hjmlcc ~]# 
//注意,tmp目录(目录文件)的其他用户对该tmp目录(目录文件)的权限为:rwt,其中,t代表粘滞位,此时也具有
//权限x的功能,具体后面再进行阐述、

在Linux系统中,我们可以创建一些像上述那样所谓的公共目录(目录文件)的,如下所示:

//新建会话[1]、
[HJM@hjmlcc ~]$ whoami
HJM
[HJM@hjmlcc ~]$ pwd
/home/HJM
[HJM@hjmlcc ~]$ ls
code
[HJM@hjmlcc ~]$ cd code
[HJM@hjmlcc code]$ ls
[HJM@hjmlcc code]$ su
Password: 
[root@hjmlcc code]# whoami
root
[root@hjmlcc code]# pwd
/home/HJM/code
[root@hjmlcc code]# ls
[root@hjmlcc ~]# mkdir all
[root@hjmlcc ~]# ll
total 4
drwxr-xr-x 2 root root 4096 Oct 16 12:15 all
//上述all公共目录(目录文件)的所有者是root用户,所属组的组名也是root,即root用户自成一组、
[root@hjmlcc ~]# chmod 777 all
[root@hjmlcc ~]# ll
total 4
drwxrwxrwx 2 root root 4096 Oct 16 12:15 all
[root@hjmlcc ~]# 


//新建会话[0]、
[HJM@hjmlcc code]$ whoami
HJM
[HJM@hjmlcc code]$ pwd
/home/HJM/code
[HJM@hjmlcc code]$ umask
0002
[HJM@hjmlcc code]$ ls
all
[HJM@hjmlcc code]$ cd all
[HJM@hjmlcc all]$ ls
[HJM@hjmlcc all]$ touch test.c
[HJM@hjmlcc all]$ ll
total 0
-rw-rw-r-- 1 HJM HJM 0 Oct 16 12:34 test.c
[HJM@hjmlcc all]$ rm test.c
[HJM@hjmlcc all]$ ll
total 0
[HJM@hjmlcc all]$ touch test.txt
[HJM@hjmlcc all]$ ll
total 0
-rw-rw-r-- 1 HJM HJM 0 Oct 16 12:35 test.txt
[HJM@hjmlcc all]$ echo "lcc" > test.txt
[HJM@hjmlcc all]$ cat test.txt
lcc
[HJM@hjmlcc all]$ rm test.txt
[HJM@hjmlcc all]$ ls
[HJM@hjmlcc all]$ ll
total 0
[HJM@hjmlcc all]$ 
 

//新建会话[0]、
[HJM@hjmlcc all]$ whoami
HJM
[HJM@hjmlcc all]$ pwd
/home/HJM/code/all
[HJM@hjmlcc all]$ ll
total 0
[HJM@hjmlcc all]$ touch hjm.txt
[HJM@hjmlcc all]$ ll
total 0
-rw-rw-r-- 1 HJM HJM 0 Oct 16 12:38 hjm.txt
[HJM@hjmlcc all]$ chmod 660 hjm.txt
[HJM@hjmlcc all]$ ll
total 0
-rw-rw---- 1 HJM HJM 0 Oct 16 12:38 hjm.txt
[HJM@hjmlcc all]$ 


//新建会话[1]、
[root@hjmlcc code]# su LCC
[LCC@hjmlcc code]$ ll
total 4
drwxrwxrwx 2 root root 4096 Oct 16 12:36 all
[LCC@hjmlcc code]$ whoami
LCC
[LCC@hjmlcc code]$ pwd
/home/HJM/code
[LCC@hjmlcc code]$ ll
total 4
drwxrwxrwx 2 root root 4096 Oct 16 12:38 all
[LCC@hjmlcc code]$ cd all
[LCC@hjmlcc all]$ ll
total 0
-rw-rw---- 1 HJM HJM 0 Oct 16 12:38 hjm.txt
[LCC@hjmlcc all]$ touch lcc.txt
[LCC@hjmlcc all]$ ll
total 0
-rw-rw---- 1 HJM HJM 0 Oct 16 12:38 hjm.txt
-rw-rw-r-- 1 LCC LCC 0 Oct 16 12:41 lcc.txt
[LCC@hjmlcc all]$ chmod o-r lcc.txt
[LCC@hjmlcc all]$ ll
total 0
-rw-rw---- 1 HJM HJM 0 Oct 16 12:38 hjm.txt
-rw-rw---- 1 LCC LCC 0 Oct 16 12:41 lcc.txt
[LCC@hjmlcc all]$ cat lcc.txt
[LCC@hjmlcc all]$ cat hjm.txt
cat: hjm.txt: Permission denied
[LCC@hjmlcc all]$ echo "hjm" > hjm.txt
bash: hjm.txt: Permission denied
[LCC@hjmlcc all]$ 


//新建会话[0]、
[HJM@hjmlcc all]$ ll
total 0
-rw-rw---- 1 HJM HJM 0 Oct 16 12:38 hjm.txt
-rw-rw---- 1 LCC LCC 0 Oct 16 12:41 lcc.txt
[HJM@hjmlcc all]$ cat lcc.txt
cat: lcc.txt: Permission denied
[HJM@hjmlcc all]$ echo "lcc" > lcc.txt
-bash: lcc.txt: Permission denied
[HJM@hjmlcc all]$ rm -f lcc.txt
[HJM@hjmlcc all]$ ll
total 0
-rw-rw---- 1 HJM HJM 0 Oct 16 12:38 hjm.txt
//此时,当前用户是普通用户HJM,但是可以将普通文件lcc.txt删除,尽管普通文件lcc.txt的所有者不是普
//通用户HJM,此处也是可以删除的,即,在Linux系统中的某一个公共目录(目录文件)下,如果该公共目录(目
//录文件)的所有者是root用户,且所属组的组名也是root,即root用户自成一组,那么对于该公共目录(目录
//文件)的其他用户均为普通用户,当该公共目录(目录文件)的其他用户(普通用户)进入该公共目录(目录
//文件)中时,当前的普通用户,是可以删除掉该公共目录(目录文件)中的某一个不是以当前普通用户为拥
//有者的文件,所以此处就引出了粘滞位的概念,如果在Linux系统中的某一个公共目录(目录文件)下,若想
//当前普通用户不可以删除掉该公共目录(目录文件)中的某一个不是以当前普通用户,而是一个以其他的一
//个普通用户为拥有者的文件,此时就可以使用粘滞位,所谓粘滞位就是给该共享的公共目录(目录文件)添
//加粘滞位、
//如果当前普通用户HJM具有公共目录(目录文件)的可执行权限后,只要当前普通用户HJM再具有公共目录
//(目录文件)的写权限,那么就可以删除掉该公共目录(目录文件)中的某一个不是以当前普通用户HJM为拥
//有者的文件,为了解决这个不科学的问题,从而引出了粘滞位的概念、

//沾滞位的作用:在设置了沾滞位的目录(目录文件)下,其它用户可以创建文件(包括普通文件和目录文件
//等等所有的文件),但是只能删除自己(以当前用户为所有者)的文件(所有文件),不可以删除别人(以非当
//前用户为所有者的)的文件(所有文件)、

[HJM@hjmlcc all]$ 


//新建会话[1]、
[LCC@hjmlcc all]$ pwd
/home/HJM/code/all
[LCC@hjmlcc all]$ ll
total 0
-rw-rw---- 1 HJM HJM 0 Oct 16 12:38 hjm.txt
[LCC@hjmlcc all]$ su
Password: 
[root@hjmlcc all]# pwd
/home/HJM/code/all
[root@hjmlcc all]# cd ..
[root@hjmlcc code]# ll
total 4
drwxrwxrwx 2 root root 4096 Oct 16 12:45 all
[root@hjmlcc code]# chmod +t all  //给该共享的公共目录all(目录文件)添加粘滞位,t就是粘滞位、
[root@hjmlcc code]# ll            
//由于此时的公共目录all(目录文件)的拥有者是root用户,但如果当前用户是普通用户LCC的话,是没办法
//直接执行chmod指令的,首先,可以将普通用户LCC切换到root用户,就可以了,其次,就是执行指令:
//sudo chmod +t all,也是可以的,但在此处我们选前前一种方法即可、
//粘滞位是给目录添加的(主要是给共享的公共的目录(目录文件)添加的),不能给普通文件添加粘滞位、
total 4
drwxrwxrwt 2 root root 4096 Oct 16 12:45 all
[root@hjmlcc code]# su LCC
[LCC@hjmlcc code]$ ll
total 4
drwxrwxrwt 2 root root 4096 Oct 16 12:45 all
[LCC@hjmlcc code]$ cd all
[LCC@hjmlcc all]$ ls
hjm.txt
[LCC@hjmlcc all]$ touch lcc.txt
[LCC@hjmlcc all]$ echo "lcc" > lcc.txt
[LCC@hjmlcc all]$ cat lcc.txt
lcc
[LCC@hjmlcc all]$ 


//新建会话[0]、
[HJM@hjmlcc all]$ ll
total 4
-rw-rw---- 1 HJM HJM 0 Oct 16 12:38 hjm.txt
-rw-rw-r-- 1 LCC LCC 4 Oct 16 13:07 lcc.txt
[HJM@hjmlcc all]$ cat lcc.txt
lcc
[HJM@hjmlcc all]$ rm lcc.txt
rm: remove write-protected regular file ‘lcc.txt’? y
rm: cannot remove ‘lcc.txt’: Operation not permitted  //此时删除不掉了、
[HJM@hjmlcc all]$ 


//新建会话[1]、
[LCC@hjmlcc all]$ ll
total 4
-rw-rw---- 1 HJM HJM 0 Oct 16 12:38 hjm.txt
-rw-rw-r-- 1 LCC LCC 4 Oct 16 13:07 lcc.txt
[LCC@hjmlcc all]$ rm hjm.txt
rm: remove write-protected regular empty file ‘hjm.txt’? y 
rm: cannot remove ‘hjm.txt’: Operation not permitted   //此时也删除不掉、
[LCC@hjmlcc all]$ rm lcc.txt  //但是可以删除以当前普通用户LCC为拥有者的普通文件lcc.txt、
[LCC@hjmlcc all]$ ll
total 0
-rw-rw---- 1 HJM HJM 0 Oct 16 12:38 hjm.txt
[LCC@hjmlcc all]$ ll
total 0
-rw-rw---- 1 HJM HJM 0 Oct 16 12:38 hjm.txt
[LCC@hjmlcc all]$ su
Password: 
[root@hjmlcc all]# ll
total 0
-rw-rw---- 1 HJM HJM 0 Oct 16 12:38 hjm.txt
[root@hjmlcc all]# whoami
root
[root@hjmlcc all]# rm -f hjm.txt   //粘滞位对root用户而言不起作用、
[root@hjmlcc all]# ll
total 0
[root@hjmlcc all]# 
[HJM@hjmlcc code]$ whoami
HJM
[HJM@hjmlcc code]$ pwd
/home/HJM/code
[HJM@hjmlcc code]$ ls
[HJM@hjmlcc code]$ touch hjm.c
[HJM@hjmlcc code]$ ls
hjm.c
[HJM@hjmlcc code]$ su LCC
Password: 
[LCC@hjmlcc code]$ ls
hjm.c
[LCC@hjmlcc code]$ rm hjm.c
rm: remove write-protected regular empty file ‘hjm.c’? y
rm: cannot remove ‘hjm.c’: Permission denied
//此时的普通文件hjm.c的拥有者是普通用户HJM,正常情况下,若想删除普通文件hjm.c的话,有三种方法:
//1.将当前普通用户LCC切换到root用户再进行删除、
//2.使用指令:sudo rm hjm.c ,也可以删除、
//3.将当前普通用户LCC切换到普通用户HJM,即切换到普通文件hjm.c的拥有者,然后再进行删除、
//否则,如上所示的指令,是不可以删除普通文件hjm.c的,会报权限不够,该权限并不是指普通文件hjm.c的
//拥有者,所属组和其他用户对该普通文件hjm.c的权限、
[LCC@hjmlcc code]$ ll
total 0
-rw-rw-r-- 1 HJM HJM 0 Oct 16 13:56 hjm.c
[LCC@hjmlcc code]$ 

4、file指令

功能说明: 辨识文件类型中的具体类型、
语法: file [选项] 文件或目录... 
常用选项:
-c :详细显示指令执行过程,便于排错或分析程序执行的情形、
-z :尝试去解读压缩文件的内容、
[HJM@hjmlcc code]$ whoami
HJM
[HJM@hjmlcc code]$ pwd
/home/HJM/code
[HJM@hjmlcc code]$ ls
hjm.c  mmcc
[HJM@hjmlcc code]$ cat hjm.c
#include<stdio.h>
int main()
{
  printf("%d\n",10);
  return 0;
}
[HJM@hjmlcc code]$ ls
hjm.c  mmcc
[HJM@hjmlcc code]$ nano lcc.c
[HJM@hjmlcc code]$ cat lcc.c
#include<stdio.h>
int main()
{
  printf("%d\n",20);
  return 0;
}
[HJM@hjmlcc code]$ gcc lcc.c
[HJM@hjmlcc code]$ gcc hjm.c
[HJM@hjmlcc code]$ ll
total 24
-rwxrwxr-x 1 HJM HJM 8360 Oct 16 14:10 a.out
-rw-rw-r-- 1 HJM HJM   66 Oct 16 14:08 hjm.c
-rw-rw-r-- 1 HJM HJM   66 Oct 16 14:09 lcc.c
drwxrwxr-x 2 HJM HJM 4096 Oct 16 14:06 mmcc
[HJM@hjmlcc code]$ 


[HJM@hjmlcc code]$ ll
total 24
-rwxrwxr-x 1 HJM HJM 8360 Oct 16 14:10 a.out
-rw-rw-r-- 1 HJM HJM   66 Oct 16 14:08 hjm.c
-rw-rw-r-- 1 HJM HJM   66 Oct 16 14:09 lcc.c
drwxrwxr-x 2 HJM HJM 4096 Oct 16 14:06 mmcc
[HJM@hjmlcc code]$ file lcc.c  //file指令可以更加详细的标识出文件类型中具体哪种类型、
lcc.c: C source, ASCII text    //C语言代码,ASCII文本、
[HJM@hjmlcc code]$ file a.out
//当前的普通文件(粗略)a.out是一个64位的可执行程序(详细)、
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=448d360fa31cd50cc94143d306a68b8a72013779, not stripped
[HJM@hjmlcc code]$ file mmcc
mmcc: directory     //目录文件、
[HJM@hjmlcc code]$ 

//在Linux系统下,可以通过file指令对文件的文件类型做更细致的区分、

拓展:

使用 sudo 指令分配权限:
1、修改/etc/sudoers 文件分配文件、
# chmod 740 /etc/sudoers
# vi /etc/sudoer
格式: 接受权限的用户登陆的主机 = (执行命令的用户)命令、
2、使用 sudo 指令 调用授权的命令、
$sudo –u 用户名 命令
实例:
$sudo -u root /usr/sbin/useradd u2

目录(目录文件)的权限:

1、可执行权限: 如果目录没有可执行权限,则无法cd到目录中、
2、可读权限: 如果目录没有可读权限,则无法用ls等命令查看目录中的文件内容、
3、可写权限: 若目录没有可写权限,则无法在目录中创建文件,也无法在目录中删除文件、

关于目录(目录文件)权限的总结:

1、
        目录的可执行权限x是表示你可否在目录下执行命令,若目录不具有x可执行权限,就没办法cd进入该目录中,从而更不用说在该目录中执行命令了、
2、
        如果目录没有x可执行权限,则无法在目录中执行任何命令,因为无法cd进入目录,即使目录仍然有r可读权限,这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件、
3、
        而如果目录具有x权限,但没有r权限,则用户可以执行命令,可以cd进入目录,但由于没有目录的读权限,所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档、
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐