小c学Linux(5)--文件访问权限

自从上一次学会如何下载应用程序后,我在电脑上面下载了好多好多有趣的东西。可是我发现有些文件我访问不了,系统提示我Permission denied,这又是怎么回事啊???还得问问小哥哥去!


linux哲学:一切皆文件。在文件系统中,一个文件名file_name对应着一个inode(hash过的索引节点),可以认为在系统中有一张文件名和inode节点的对应表,inode节点指向的地址就是这个文件所有的元数据信息,包括文件时间戳,权限,大小,类型,存放位置等信息,可用stat命令查看文件元信息,用ls -l 查看文件长信息

#以一个test文件为例
#显示文件元数据信息
stat /tmp/test_ping.sh
  文件:"/tmp/test_ping.sh"
  大小:109        块:8          IO 块:4096   普通文件
设备:fd00h/64768d Inode:8418595     硬链接:1
权限:(0755/-rwxr-xr-x)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:user_tmp_t:s0
最近访问:2018-03-22 16:41:52.936234785 +0800
最近更改:2018-03-22 16:41:48.118090411 +0800
最近改动:2018-03-22 16:41:48.119090441 +0800

#显示该目录长信息
ls -ld /tmp/test_ping.sh
-rwxr-xr-x. 1 docker docker 109 322 16:41 /tmp/test_ping.sh
#从左到右依次是
    -:文件类型                        二进制    八进制      
    rwx: 对应属主root的权限             111       7
    r-x: 对应属组root的权限             101       5
    r-x: 对应其他用户的权限              101       5
    1: 硬链接数
    root: 属主
    root: 属组
    109: 文件大小
    322 16:41: 最后一次修改时间
    test_ping.sh: 文件名

find命令

清楚了文件的元数据信息,这里插曲find命令,find是一个强大的查找文件工具。
笔记:

 find [options] [查找路径] [查找条件] [处理动作exec]
    查找路径:默认则为当前目录
    查找条件:默认则表示指定目录下的所有文件
    处理动作:默认为显示

  查找条件:
     -name ”文件名称“:支持使用gloab(文件通配)
         *、?、[]、[^]
     -iname "文件名称":查找时不区分大小写
     -user UserName:根据属主查找
     -group GroupName:根据属组查找
     -uid UID:根据属主的UID查找
     -gid GID:根据属组的GID查找
     -nouser:查找没有属主的文件
     -nogroup:查找没有属主的文件

     组合条件:在要要查找的选项前面加
         -a:与。同时满足,可省略
         -o:或,一个满足
         -not,!非。取反
         非A,并且非B:非(A或B)
         -not( -user hadoop -0 iname ”*.txt“)
     -type: 根据文件类型查找
          f:普通文件
          d:目录
          b:块设备
          c:字符设备
          l:符号链接文件
          p:命令管道
          s:套接字

      -size:根据文件大小查找在单位内的
          -size [+|-]#unit
          例如 -size +2M,大于3MB
      常用单位k.M,G
      1M表示(0-1M)之间的所有的文件
      #:(#-1)<x<=#
      根据时间戳来查找:
       以天为单位(time):
         -atime [+|-]# 访问时间
         +#:表示(#+1)天之外被访问过
         -:表示#天内被访问过的
         无符号:表示短于(#+1)>x>=#天的时间段被访问过
     -ctime        改变时间
     -mtime        修改时间
       以分钟为单位(min)
           -amin:
           -mmin:
           -cmin:
      根据权限查找:
       -perm [+|-]MODE
          MODE:  精确匹配
          +MODE:任何一类用户的任何一位权限匹配即可,常用于查找某类用用户的某特定权限是否存在
          -MODE: 每类用户的指定要检查的权限位都匹配

          文件权限:644
          -perm 600:          -perm +222:是,查找用户有写权限
          -perm +002:否,不匹配,0表示不查看
          -perm -444,是

练习:
1.查找/var目录中属主为root且属组为mail的文件
 find /var/ -user root -group mail
2.查找/usr目录下不属于root、bin或hadoop的所有文件
find /usr/ -not -user root -not -user bin -not -user hadoop
3.查找/etc目录中最近一周内其内容修改过的,且不属于root或hadooop的文件
find /etc -mtime -7 -not -user root -not -user hadoop
4.查找当前系统上没有属组或属组,且最近一个月内被访问过的文件
find / \(-nouser -o -nogroup\) -atime -30
5.查找早/etc/目录下大于1M且类型为普通文件的所有文件
find /etc/ -type f -size +1M
6.查找/etc/目录所有用户都没有写权限的文件
find /etc/ -not -perm +222
 所有都没有;相反:任何一个有
 所有都有:相反:只要有一个没有
7.查找/etc/目录下至少一类没有写权限的文件
find /etc/ -perm -222
8.查找/etc/init.d目录下,所有用户都有执行权限其其他用户有写权限的文件
  find /etc/init.d/  -perm -111 -perm -002
  find /etc/init.d/  -perm -113

笔记来源:magedu马哥


文件属主属组

属组是什么个概念?它相当于数据库中的角色,我的理解就是把一个组当作一个用户的附加组,只要这个组对某个文件有什么权限,这个用户也就拥有这种权限。

#创建用户
useradd user_name

#创建组
groupadd group_name 

#修改文件属主和数组
chown user_name:group_name file_name

#添加附加组
usermod -a -G group_name user_name

小哥哥说:“之前我们就知道,文件有很多类型,普通文件f,目录文件d,块设备文件b,字符设备文件c,链接文件l,管道p,套接字文件s。我们这里以两个用户:docker,openstack为例。对于文件系统来说,当docker创建一个文件时,默认属主,基本属组都为docker,而文件的默认权限是根据系统的umask(一般是022)决定的,如果文件是目录,则其权限为777-022=755,是文件,则其权限为666-022=644,如果openstack想访问这个test_ping.sh文件,因为它不是属主,也不是其基本组的一员,只能以其他用户的身份访问这个文件,所以对于openstack来说它只有读r和执行x权限,没有写w权限。”


权限设置

#命令  chmod
三种方式:
    (1)chmod +x filename        所有用户的单个权限
    (2)chmod 777 filename       所有用户的具体权限
    (3)chmod u+x               单个用户的单个权限

然而,你还会发现这样的目录文件

drwxrwsr-t. 2 root cloud 43 320 17:56 /tmp/test

属组可执行位置为s,其他用户可执行位置为t,这是什么意思?


特殊权限

对于当使用g+s的目录来说,在其目录下创建的文件的属组和目录的属组一样

#SGID
chmod g+s /tmp/test     
#意味着/tmp/test目录下的文件不管是谁创建的,数组都是test的数组cloud

对于当使用o+t的目录来说,不能删除其他用户的文件,只能删除自己的

#SBIT (黏着位)
chmod o+s /tmp/test
#意味着/tmp/test目录下的文件只能让其属主自己删除,而其他人不能删除

对于当使用u+s的可执行文件来说,执行时的属主为文件的属主,而不是发起者。

#SUID
#可执行文件一般是进程,进程访问文件时的权限机制:
    1.进程的发起者是进程的属主
    2.进程的属组是属主的基本组和附加组
    所以,当发起者想以一个进程访问文件时,得看发起者是不是该文件的属主或发起者的属组是不是该文件的基本组和附加组
#而使用了u+s的可执行文件,其属主不是进程的发起者,而是该执行文件的属主,也就意味着不管发起者是谁,都能访问该文件属主能访问的文件

这三个特殊权限也可用八进制表示:111 – 7
连合前面的属主属组其他用户的对应,在设置文件权限时可以一并使用

chmod u+s file_name        #SUID
chmod g+s file_name        #SGID
chmod o+t file_name        #SBIT

chmod 1777 file_name       #SBIT+777
chmod 2777 file_name       #SGID+777
chmod 4777 file_name       #SUID+777
chmod 7777 file_name       #SUID+SGID+SBIT+777

ACL(Access Control Lists)

文件访问控制列表

用户权限管理始终是 Unix 系统管理中最重要的环节。大家对 Linux/Unix 的 UGO 权限管理方式一定不陌生,还有最常用的 chmod 命令。为了实现一些比较复杂的权限管理,往往不得不创建很多的组,并加以详细的记录和区分(很多时候就是管理员的噩梦)。可以针对某一个用户对某一文件指定一个权限,恐怕管理员都期待的功能。比如对某一个特定的文件,用户A可以读取,用户B所在的组可以修改,惟独用户B不可以……。于是就有了IEEE POSIX 1003.1e这个ACL的标准。所谓ACL,就是Access Control List,一个文件/目录的访问控制列表,可以针对任意指定的用户/组分配RWX权限。现在主流的商业Unix系统都支持ACL。FreeBSD也提供了对ACL的支持。Linux在这个方面也不会落后,从2.6版内核开始支持ACL。

ACL详细介绍


在linux系统中,root用户就是上帝,不管文件是啥权限,root都能想干什么干什么!!

原来如此啊!我这才发现,我自己是普通用户,并没有启动root,难怪有些系统配置的文件不让我打开!嘿嘿,我要启动root超级用户!


说明:纯属个人学习编造

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值