您的位置:首页 > 运维架构 > Linux

linux文件权限与属性的更改

2012-08-23 10:51 483 查看
本文目录索引:

1、文件与目录的默认权限与隐藏权限
(1)文件默认权限 --umask
(2)文件特殊权限
 SUID--set UID
SGID --Set GID
SBIT --Sticky Bit
SUID/SGID/SBIT 权限配置
(3)文件隐藏属性
配置文件隐藏属性 --chattr 
显示文件隐藏属性 --lsattr

2、更改文件权限(chmod) 
改变文件权限的数字类型 
更改文件权限的符号类型
3、linux权限的意义 
对文件而言 
对目录而言 
权限与命令间的关系
4、更改文件的属性 
           改变所属群组(chgrp)
改变文件拥有者(chown)
更改文件属性的意义 

文件与目录的默认权限与隐藏权限

1、文件默认权限 --umask

umask 就是指定 『目前使用者在创建文件或目录时候的权限默认值』





查阅的方式有两种,一种可以直接输入 umask ,就可以看到数字型态的权限配置分数, 一种则是加入 -S (Symbolic) 这个选项,就会以符号类型的方式来显示出权限了! 奇怪的是,怎么 umask 会有四组数字啊?不是只有三组吗?是没错啦,第一组是特殊权限用的。

在默认权限的属性上,目录与文件是不一样的。从第六章我们知道 x 权限对於目录是非常重要的! 但是一般文件的创建则不应该有运行的权限,因为一般文件通常是用在於数据的记录嘛!当然不需要运行的权限了。 因此,默认的情况如下:

若使用者创建为『文件』则默认『没有可运行( x )权限』,亦即只有 rw 这两个项目,也就是最大为 666 分,默认权限如下:
-rw-rw-rw-

若使用者创建为『目录』,则由於 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,默认权限如下:
drwxrwxrwx

要注意的是,umask 的权限配置分数指的是『该默认值需要减掉的权限!』

root用户:umask 为 022 ,user 并没有被拿掉任何权限,不过 group 与 others 的权限被拿掉了 2 (也就是 w 这个权限)。所以如果 umask 订定为 022 ,那新建的数据只有使用者自己具有 w 的权限, 同群组的人只有 r 这个可读的权限而已,并无法修改喔!

创建文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
创建目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x

一般身份使用者: umask 为 002 ,亦即保留同群组的写入权力!

创建文件时:(-rw-rw-rw-) - (-------w-) ==> -rw-rw--r--
创建目录时:(drwxrwxrwx) - (d------w-) ==> drwxrwxr-x





例题:
假设你的 umask 为 003 ,请问该 umask 情况下,创建的文件与目录权限为?
答:
umask 为 003 ,所以拿掉的权限为 --------wx,因此:

文件: (-rw-rw-rw-) - (--------wx) = -rw-rw-r--

目录: (drwxrwxrwx) - (--------wx) = drwxrwxr--




2、文件特殊权限

SUID 是表示当一个文件具有suid权限时,且该文件的所有者为a时,其他用户b也可取得与a一样的权限,它一般只对文件有效,对目录无效。

SGID,当你将一个a目录置为sgid权限时候,其他人对于a目录有读取,执行和写入的权限时,别人在此目录中创建的任何文件和目录的所属组都为a目录的所属组..但所属主还是自己,对文件与目录都有效。

SBIT 全称Sticky Bit.但是它只对目录有效,对文件却是无效的,它的作用就是让你不能随便删掉别人的资料。

(1) SUID--set UID

我们的 Linux 系统中,所有帐号的密码都记录在 /etc/shadow 这个文件里面,这个文件的权限为:『-r-------- 1 root root』,意思是这个文件仅有root可读且仅有root可以强制写入而已。
既然这个文件仅有 root 可以修改,那么鸟哥的 vbird 这个一般帐号使用者能否自行修改自己的密码呢? 你可以使用你自己的帐号输入『passwd』这个命令来看看,嘿嘿!一般使用者当然可以修改自己的密码了!

唔!有没有冲突啊!明明 /etc/shadow 就不能让 vbird 这个一般帐户去存取的,为什么 vbird 还能够修改这个文件内的密码呢?

这就是 SUID 的功能啦!藉由上述的功能说明,我们可以知道
1、vbird 对於 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 vbird 能运行 passwd;
2、passwd 的拥有者是 root 这个帐号;
3、vbird 运行 passwd 的过程中,会『暂时』获得 root 的权限;
4、/etc/shadow 就可以被 vbird 所运行的 passwd 所修改。
但如果 vbird 使用 cat 去读取 /etc/shadow 时,他能够读取吗?因为 cat 不具有 SUID 的权限,所以 vbird 运行 『cat /etc/shadow』 时,是不能读取 /etc/shadow 的。我们用一张示意图来说明如下:



图4.4.1、SUID程序运行的过程示意图

基本上SUID有这样的限制与功能(结合上面的例子说明):

1、SUID 权限仅对二进位程序(binary program)(passwd这个二进制可执行文件)有效;
2、命令使用用户(上面例子为vbird)对於该程序需要具有 x 的可运行权限(即passwd这个二进制文件对其他人(o)具有x权限);
3、命令使用用户将具有该程序拥有者 (owner) (上面的例子为root)的权限。
4、本权限仅在运行该程序的过程中有效 (run-time);

UID 仅可用在binary program 上, 不能够用在 shell script 上面!这是因为 shell script 只是将很多的 binary 运行档叫进来运行而已!所以 SUID 的权限部分,还是得要看 shell script 呼叫进来的程序的配置, 而不是 shell script 本身。当然,SUID 对於目录也是无效的。

(2)SGID --Set GID





与 SUID 不同的是,SGID 可以针对文件或目录来配置!

如果是对文件来说, SGID 有如下的功能:
1、SGID 对二进位程序有用;
2、程序运行者对於该程序来说,需具备 x 的权限;
3、运行者在运行的过程中将会获得该程序群组的支持!

如果是对目录来说, SGID 有如下的功能:
1、使用者若对於此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
2、使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
【用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。】

(3)SBIT --Sticky Bit

SBIT 目前只针对目录有效, SBIT 对於目录的作用是:
1、当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时;
2、当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件

当甲这个使用者于A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示甲使用者对该目录内任何人创建的目录或文件均可进行 "删除/更名/搬移" 等操作。 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。

(4)SUID/SGID/SBIT 权限配置

现在你应该已经知道数字型态更改权限的方式为『三个数字』的组合, 那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了!
4 为 SUID
2 为 SGID
1 为 SBIT
假设要将一个文件权限改为『-rwsr-xr-x』时,由於 s 在使用者权限中,所以是 SUID ,因此, 在原先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来配置!

数字法:









chmod u+s test(其中之前u=rwx,g=rwx,o=rwx)等同于chmod 4777 test等同于chmod u=rwxs test

如果chmod 4677 test,则test的权限为为u=rwS,g=rw,o=rw

SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t (前提是u、g、o之前都要有x权限),假如u之前没有x权限,如一个test1文件,其权限为u=rw,g=rwx,o=rwx,则执行chmod u+x test1之后其权限变为u=rwS(不是rws),g=rwx,o=rwx
【此时test1权限为u=rwS,g=rwx,o=rwx,执行chmod u+x test1之后test1权限变为u=rws,g=rws,o=rws】

符号法:

其中 SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t (前提:文件权限a+x)





取消SUID,SGID,SBIT可用u-s,g-s,o-t

3、文件隐藏属性

(1)配置文件隐藏属性 --chattr

不过要先强调的是,底下的chattr命令只能在Ext2/Ext3的文件系统上面生效, 其他的文件系统可能就无法支持这个命令了













(2)显示文件隐藏属性 --lsattr





更改文件权限(chmod)

改变文件权限的数字类型:

文件的权限字符为:『-rwxrwxrwx』, 这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下: r:4 w:2 x:1

每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx---] 分数则是:

owner = rwx = 4+2+1 = 7

group = rwx = 4+2+1 = 7

others= --- = 0+0+0 = 0
而拥有此权限的文件的文件名为.bashrc,则变更它的权限如下:

chmod 770  .bashrc

变更权限的指令chmod的语法是这样的:

chmod [-R] xyz 文件或目录
选项与参数:
xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更

注意:常常,我们以vim编辑一个shell的文字批处理文件后,他的权限通常是 -rw-rw-r-- 也就是664。

更改文件权限的符号类型:
linux中的文件使用者与群组:u(user),g(group),o(others),a(all)

chmod

u

g

o

a

+(加入)

-(除去)

=(设定)

r

w

x

文件或目录

假如我们要『设定』一个文件的权限成为『-rwxr-xr-x』时,基本上就是:

user (u):具有可读、可写、可执行的权限;

group 与 others (g/o):具有可读与执行的权限。
所以就是:

[root@www ~]# chmod  u=rwx,go=rx  .bashrc
# 注意喔!那个 u=rwx,go=rx 是连在一起的,中间并没有任何空格!
[root@www ~]# ls -al .bashrc
-rwxr-xr-x  1 root root 395 Jul  4 11:45 .bashrc

那么假如是『 -rwxr-xr-- 』这样的权限呢?可以使用『 chmod u=rwx,g=rx,o=r filename 』来设定。此外,如果我不知道原先的文件属性,而我只想要增加.bashrc这个文件的每个人均可写入的权限, 那么我就可以使用:

[root@www ~]# ls -al .bashrc
-rwxr-xr-x  1 root root 395 Jul  4 11:45 .bashrc
[root@www ~]# chmod  a+w  .bashrc
[root@www ~]# ls -al .bashrc
-rwxrwxrwx  1 root root 395 Jul  4 11:45 .bashrc

而如果是要将权限去掉而不更动其他已存在的权限呢?例如要拿掉全部人的可执行权限,则:

[root@www ~]# chmod  a-x  .bashrc
[root@www ~]# ls -al .bashrc
-rw-rw-rw-  1 root root 395 Jul  4 11:45 .bashrc

知道 +, -, = 的不同点了吗?对啦! + 与 – 的状态下,只要是没有指定到的项目,则该权限『不会被变动』, 例如上面的例子中,由于仅以 – 拿掉 x 则其他两个保持当时的值不变!

linux权限的意义

对文件而言
r (read):可读取此一文件的实际内容,如读取文本文件的文字内容等;

w (write):可以编辑、新增或者是修改该文件的内容(但不含删除该文件);

x (execute):该文件具有可以被系统执行的权限。

对目录而言

r (read contents in directory):表示具有读取目录结构列表的权限,所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件名数据。 所以你就可以利用 ls 这个指令将该目录的内容列表显示出来!

w (modify contents of directory):这个可写入的权限对目录来说,是很了不起的! 因为他表示你具有异动该目录结构列表的权限,也就是底下这些权限:

建立新的文件与目录;

删除已经存在的文件与目录(不论该文件的权限为何!)

将已存在的文件或目录进行更名;

搬移该目录内的文件、目录位置。
x (access directory):目录只是记录文件名而已,总不能拿来执行吧?没错!目录不可以被执行,目录的x代表的是用户能否进入该目录成为工作目录的用途!

具体的例子如下:

例题:
有个目录的权限如下所示:
drwxr--r--  3  root  root  4096   Jun 25 08:35   .ssh

系统有个账号名称为vbird,这个账号并没有支持root群组,请问vbird对这个目录有何权限?是否可切换到此目录中?
答:
vbird对此目录仅具有r的权限,因此vbird可以查询此目录下的文件名列表。因为vbird不具有x的权限, 因此vbird并不能切换到此目录内!(相当重要的概念!)
例题:
假设有个账号名称为dmtsai,他的家目录在/home/dmtsai/,dmtsai对此目录具有[rwx]的权限。 若在此目录下有个名为the_root.data的文件,该文件的权限如下:
-rwx------ 1 root  root  4365 Sep 19 23:20  the_root.data

请问dmtsai对此文件的权限为何?可否删除此文件?
答:
如上所示,由于dmtsai对此文件来说是『others』的身份,因此这个文件他无法读、无法编辑也无法执行, 也就是说,他无法变动这个文件的内容就是了。

但是由于这个文件在他的家目录下, 他在此目录下具有rwx的完整权限,因此对于the_root.data这个『档名』来说,他是能够『删除』的! 结论就是,dmtsai这个用户能够删除the_root.data这个文件!




更改文件的属性

改变所属群组(chgrp)

假设你是以root的身份登入Linux系统的,那么在你的家目录内有一个install.log的文件, 如何将该文件的群组改变一下呢?假设你已经知道在/etc/group里面已经存在一个名为users的群组, 但是testing这个群组名字就不存在/etc/group当中了,此时改变群组成为users与testing分别会有什么现象发生呢?

[root@www ~]# chgrp [-R] dirname/filename ...
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件、目录
都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。
范例:
[root@www ~]# chgrp users install.log
[root@www ~]# ls -l
-rw-r--r--  1 root users 68495 Jun 25 08:53 install.log
[root@www ~]# chgrp testing install.log
chgrp: invalid group name `testing' <== 发生错误讯息啰~找不到这个群组名~

注意:要被改变的组名必须要在/etc/group文件内存在才行,否则就会显示错误!

改变文件拥有者(chown)
chown的用途还满多的,他还可以顺便直接修改群组的名称呢!此外,如果要连目录下的所有次目录或文件同时更改文件拥有者的话,直接加上 -R 的选项即可!我们来看看语法与范例:

[root@www ~]# chown [-R] 账号名称 文件或目录
[root@www ~]# chown [-R] 账号名称:组名 文件或目录
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都变更

范例:将install.log的拥有者改为bin这个账号:
[root@www ~]# chown bin install.log
[root@www ~]# ls -l
-rw-r--r--  1 bin  users 68495 Jun 25 08:53 install.log

范例:将install.log的拥有者与群组改回为root:
[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r--r--  1 root root 68495 Jun 25 08:53 install.log

注意:用户必须是已经存在系统中的账号,也就是在/etc/passwd 这个文件中有纪录的用户名称才能改变。

更改文件属性的意义

知道如何改变文件的群组与拥有者了,那么什么时候要使用chown或chgrp呢?或许你会觉得奇怪吧? 是的,确实有时候需要变更文件的拥有者的,最常见的例子就是在复制文件给你之外的其他人时, 我们使用最简单的cp指令来说明好了:

[root@www ~]# cp 来源文件 目标文件

假设你今天要将.bashrc这个文件拷贝成为.bashrc_test档名,且是要给bin这个人,你可以这样做:

[root@www ~]# cp .bashrc .bashrc_test
[root@www ~]# ls -al .bashrc*
-rw-r--r--  1 root root 395 Jul  4 11:45 .bashrc
-rw-r--r--  1 root root 395 Jul 13 11:31 .bashrc_test  <==新文件的属性没变

由于复制行为(cp)会复制执行者的属性与权限,所以!怎么办?.bashrc_test还是属于root所拥有, 如此一来,即使你将文件拿给bin这个使用者了,那他仍然无法修改的(看属性/权限就知道了吧), 所以你就必须要将这个文件的拥有者与群组修改一下啰!

本文内容出自:http://vbird.dic.ksu.edu.tw/linux_basic/0220filemanager_4.php

http://vbird.dic.ksu.edu.tw/linux_basic/0210filepermission_2.php#filepermission_ch
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: