python读取linux⽂件权限_关于linux⽂件权限
⽂件与(或)⽬录是⽂件系统的具体表现形式,在Linux系统管理部分,⽂件与⽬录管理映射了Linux⽂件系统管理策略的重要⽅⾯。本⽂主要就Linux⽂件系统(⽂件或⽬录)的默认权限与隐藏权限展开论述,关于⽂件和⽬录的路径、权限、权限表⽰(和设置)⽅法等基本概念以及常规操作(移动、删除、复制、查看等)是学习本⽂的基础。
⼀. ⽂件系统的默认权限(umask)
当我们在系统中新建⼀个⽂件或⽬录时,系统会⾃动赋予该⽂件或⽬录⼀个初始访问权限(Value),我们称为默认权限,默认权限与⽂件系统的umask值有关。可以在终端下直接输⼊umask来查看当前系统的umask值。例如:
[root]#umask
0022
也许你会问为什么⾃⼰系统的umask值只有三位数?这⾥第⼀位是特殊权限位,我们暂且不考虑它,先看后⾯三位数就可以了。那么这个值具体是怎样运⽤的呢?其实umask本质是⼀个掩码,为此我们有必要先了解Linux⽂件系统权限的表⽰⽅法及⽂件与⽬录的约定权限。
1. ⽂件系统的权限表⽰⽅法有两种。
⼀是直接⽤r、w、x来代表⽂件的所有者(u)、⽤户组(g)、其他⽤户(o)对某⼀⽂件或⽬录的读、写、执⾏(x)权限,称为字符表⽰法,例如上⾯的
-rw-rw-rw-。⼆是⽤⼀组(三位)⼋进制数来间接表⽰⽂件或⽬录的权属,称为数字表⽰法,例如某⽂件的权限为755。
注:所谓数字表⽰法是指将读取(r),写⼊ (w) 和执⾏(x)
分別以4、2、l来代表,沒有授予的部份就表⽰值为0,然后再把所授予的权限相加⽽成。
2.
在不考虑umask的情况下,新建⼀个⽂件或⽬录的权限应该都是rwxrwxrwx,但为了提⾼安全性,会默认去除新建⽂件的可执⾏权限(x),⽽对于新建的⽬录,可执⾏位x与可否被允许进⼊该⽬录有关,因此Linux约定:
新建⽂件的权属是-rw-rw-rw-,权限值是666。
新建⽬录的权属是drwxrwxrwx,权限值是777。
那么,在给定系统umask的情况下,新建⽂件或⽬录的默认权限如下赋予:
新建⽂件的约定权限 - UMASK表⽰的权限 = ⽂件的默认权限
新建⽬录的约定权限 - UMASK 表⽰的权限 = ⽬录的默认权限
这⾥的减号(-)更确切地说是屏蔽的意思。
例如当前系统的UMASK值为002,或者表⽰为--- --- -w-。那么新建⼀个⽂件或⽬录的默认权限为:
新建⽂件的约定权限 - UMASK表⽰的权限 = ⽂件的默认权限
-rw-rw-rw-
-
--- --- -w-
= -rw-rw-r-
表⽰在约定权限的基础上屏蔽除所有者(u)、同组⽤户(g)之外其他⽤户(o)的可写权限。此时当你在系统
中新建⼀个⽂件时,该⽂件的默认权限就是-rw-rw-r-了,这样你就会理解为什么UMASK是⼀个掩码值了。我们再实际操作⼀下吧。
[root]#umask 002
[root]#umask
002
[root]#touch test1
[root]#ls -dl test1
-rw-rw-r-- 1 root root 0 Jun 17 21:27 test1
test1的约定权限是rw-rw-rw-,但经过umask屏蔽后,被赋予默认权限为rw-rw-r--。
同理对于新建⽬录的默认权限采⽤同样的规则。
新建⽬录的约定权限 - UMASK 表⽰的权属 = ⽬录的默认权限
rwxrwxrwx
-
--- ---
-w-
=
rwxrwxr-x
[root]#mkdir testdir
[root]#ls -dl testdir
drwxrwxr-x 2 root root 4096 Jun 17 21:30 testdir
以上只抛砖引⽟地概述UMASK的意义即简单的设定⽅法,需要注意的是,umask命令⽤来设置进程所创建的⽂件的读写权限,最保险的值是0077,即关闭创建⽂件的进程以外的所有进程的读写权限,表⽰为-rw---
----。在~/.bash_profile中,加上⼀⾏命令umask 0077可以保证每次启动Shell后, 进程的
umask权限都可以被正确设定。
⼆. ⽂件系统的隐藏权限:chattr,
lsattr
除了设置⽂件或⽬录的读(r)、写(w)、执⾏(x)权限外,对于某些有特殊要求的档案(如服务器⽇志)还可以追加隐藏权限的设定。这些隐藏权限包括:
Append only (a), compressed
(c), no dump (d), immutable (i), data journalling (j),secure
deletion (s), no tail-merging (t), undeletable (u), no atime
updates (A), synchronous directory updates (D), synchronous updates
(S), and top of directory hierarchy (T).
⼤部分属性在⽂件系统的安全管理⽅⾯起很重要的作⽤。关于以上属性的详细描述请兄弟们查阅chattr的在线帮助man,注意多数属性须要由root来施加。
1. 通过chattr设置档案的隐藏权限。
[root]#chattr --help
Usage: chattr [-RV] [-+=AacDdijsSu] [-v version]
参数或选项描述:
-R:递归处理,将指定⽬录下的所有⽂件及⼦⽬录⼀并处理。
-V:显⽰详细过程有版本编号。
-v:设定⽂件或⽬录版本(version)。
+ :在原有参数设定基础上,追加参数。
- :在原有参数设定基础上,移除参数。
= :更新为指定参数设定。
A:⽂件或⽬录的 atime (access time)不可被修改(modified),
可以有效预防例如⼿提电脑磁盘I/O错误的发⽣。
S:硬盘I/O同步选项,功能类似sync。
a:即append,设定该参数后,只能向⽂件中添加数据,⽽不能删除,多⽤于服务器⽇志⽂
件安全,只有root才能设定这个属性。
c:即compresse,设定⽂件是否经压缩后再存储。读取时需要经过⾃动解压操作。
d:即no dump,设定⽂件不能成为dump程序的备份⽬标。
i:设定⽂件不能被删除、改名、设定链接关系,同时不能写⼊或新增内容。i参数对于⽂件
系统的安全设置有很⼤帮助。
j:即journal,设定此参数使得当通过mount参数:data=ordered 或者 data=writeback
挂
载的⽂件系统,⽂件在写⼊时会先被记录(在journal中)。如果filesystem被设定参数为
data=journal,则该参数⾃动失效。
s:保密性地删除⽂件或⽬录,即硬盘空间被全部收回。
u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以⽤于undeletion.
各参数选项中常⽤到的是a和i。a选项强制只可添加不可删除,多⽤于⽇志系统的安全设定。⽽i是更为严格的安全设定,只有superuser
(root) 或具有CAP_LINUX_IMMUTABLE处理能⼒(标识)的进程能够施加该选项。我们来举⼀个例⼦:
[root]#touch chattr_test
[root]#chattr +i chattr_test
[root]#rm chattr_test
rm: remove write-protected regular empty file `chattr_test`?
y
rm: cannot remove `chattr_test`: Operation not
permitted
呵,此时连root本⾝都不能直接进⾏删除操作,必须先去除i设置后再删除。
chattr命令的在线帮助详细描述了各参数选项的适⽤范围及bug提⽰,使⽤时建议兄弟们仔细查阅。由于上述的这些属性是隐藏的,查看时需要使⽤lsattr命令,以下简述之。
lsattr命令格式:
[root]#lsattr [-RVadlv] []
参数或选项说明:
-R:递归列⽰⽬录及⽂件属性。
-V:显⽰程序版本号。
-a:显⽰所有⽂件属性,包括隐藏⽂件(.)、当时⽬录(./)及上层⽬录(../)。
-d:仅列⽰⽬录属性。
-l:(此参数⽬前没有任何作⽤)。
-v:显⽰⽂件或⽬录版本。
例:
[root]#chattr +aij
lsattr_test
[root]#lsattr
----ia---j--- ./lsattr_test
关于lsattr的⽤法,详情请参阅在线帮助man
三.档案的特殊权限:SUID/SGID/Sticky Bit
接下来将概要性地介绍SUID/SGID/Sticky
Bit等特殊权限及它们的设置⽅法,学习前需要掌握⽤户(组)ID、程序(process)、(⽂件系统权限的表⽰和设置⽅法)等知识。
前⾯提到的r(读)、w(写)、x(执⾏)是Linux⽂件系统的基本权限,三者规定了特定⽂件或⽬录的所有者(user)、所有者所属⽤户组(group)、其他(others)对⽂件系统的存取权限。例如:
[root]#ll apple
-rw-r--r-- 1 root 8083 0 Apr 1 20:46 apple
然⽽结合前⾯介绍的UMASK值(0022),说明还存在⼀些特殊的权限规范,这些权限包括SUID/SGID/Sticky
Bit,系统中就直接存在这样的例⼦:
[root]#ls -dl /tmp
drwxrwxrwt 342 root root 36864 Jun 14 22:13 /tmp
[root]$ll /usr/bin/passwd
-rwsr-xr-x 1 root root 27768 Jul 17 2006
/usr/bin/passwd
python怎么读取桌面上的文件1.Set UID
Linux为了提⾼本地⽤户账号信息的安全性,特别指定了/etc/shadow
(影⼦⽂件)以加密密码的⽅式来存储⽤户的账户信息,同时这个⽂件的默认权限是-r--------,限定只有superuser才能“强制”储存,其他
⽤户没有任何权限。可是你会发现,为什么我们可以以普通⽤户的⾝份修改我们⾃⼰的⽤户密码呢,毕竟更新密码就必然会写
⼊/etc/shadow⽂件的?
参照前⾯的例⼦(/usr/bin/passwd),我们认为当⽂件系统的“所有者权限组合”的可执⾏位(x)被s(即rws------)取代时,构成特殊权限规定Set
UID,简称SUID。
SUID表⽰当请求执⾏包含SUID特殊权限的程序时,能够暂时拥有该程序所有者(对程序)的存取权限。假设普通⽤户A通过passwd命令更新⾃⼰的密码,⽽/usr/bin/passwd的所有者是root
(root,root),也就是说,当A请求执⾏passwd命令时,实际上是暂时获得root(对/usr/bin/passwd)的执⾏权限,并进⼀步更
新/etc/shadow的内容。
需要注意的是,Linux规定SUID仅对系统中的⼆进制可执⾏⽂件设置有效,⽽且不可对Shell Script施加设置,毕竟Shell
脚本只是对⼆进制可执⾏⽂件的调度组合,最终也是要遵从binary file的权限设置。
2.Set GID
相对于SUID,当所有者所在的⽤户组(group)的权限组合中可执⾏位(x)被s所取代时(例如---rws---),便构成Set
GID的权限设置。SGID可以针对⼆进制⽂件或⽬录进⾏设置:
a.⼆进制可执⾏⽂件:则当请求执⾏该⽂件(程序)时,请求执⾏者所在的⽤户组(即effective
group)将暂时获得该程序(binary file)所属的⽤户组ID(group ID)的存取权限.
b.⽬录:假设⽬录A,此时在A⽬录下创建的⽂件或⼦⽬录所属的⽤户组ID,将⾃动被赋予A⽬录的组ID
SGID主要⽤于多⼈组成的项⽬开发上,⼀般⽐较少⽤到。
3. Sticky Bit
我们认为,当⽂件系统“其他(others)”的权限组合中可执⾏位(x)被t所取代时(例如------rwt),便构成Sticky
Bit的权限设置。SBIT顾名思义可以起到限制访问的作⽤,是容易理解⽽好⽤的设置,它只对⽬录有效。当对⼀个⽬录A施加了SBIT设定以后,并且使⽤
者对A⽬录有w和x权限时,则使⽤者在A⽬录下所创建的个⼈⽂档(含⽬录)只有使⽤者本⾝或root可以执⾏删除、更名、移动等操作(是否可读依实际权限
r⽽定)。
由前⾯所举的/tmp⽬录,我们做⼀下简单的测试:
[root]#ls -dl /tmp
drwxrwxrwt 342 root root 36864 Jun 14 22:13 /tmp
[root]#cd /tmp
[root]#touch orange
[root]#chmod 777 orange
(注意这⾥设置orange权限全开)
[root]#logout
(退出root,并以普通⽤户登录)
[console]$cd /tmp
[console]$rm orange
rm: cannot remove `orange': Operation not permitted
注意:SBIT⼀般仅针对⽬录施加有意义。
接下来再简单介绍以上⼏种特殊权限的设置⽅法。如果你已经掌握了⽤(⼋进制)数字来表⽰权限的规则,再结合chmod命令进⾏设置就很简单了。以下是SUID/SGID/Sticky
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论