关于linux文件权限

0 views
Skip to first unread message

孙路

unread,
Mar 8, 2010, 1:48:05 AM3/8/10
to mylinu...@googlegroups.com
还可以通过使用- R选项连同子目录下的文件一起设置:
chmod -R 664 /usr/local/home/dave/*
这样就可以一次将/ u s r / l o c a l / h o m e / d a v e目录下的所有文件连同各个子目录下的文件的权限
全部设置为文件属主和同组用户可读和写,其他用户只读。使用- R选项一定要谨慎,只有在
需要改变目录树下全部文件权限时才可以使用。
1.4.5 可以选择使用符号模式或绝对模式
上面的例子中既有绝对模式的,也有符号模式的,我们可以从中看出,如果使用该命令
的符号模式,可以设置或取消个别权限位,而在绝对模式中则不然。我个人倾向于使用符号
模式,因为它比绝对模式方便快捷。
1.5 目录
还记得在前面介绍c h m o d命令时讲过,目录的权限位和文件有所不同。现在我们来看看其
中的区别。目录的读权限位意味着可以列出其中的内容。写权限位意味着可以在该目录中创
建文件,如果不希望其他用户在你的目录中创建文件,可以取消相应的写权限位。执行权限
位则意味着搜索和访问该目录(见表1 - 5、表1 - 6)。
表1-5 目录权限
r w x
可以列出该目录中的文件可以在该目录中创建或删除文件可以搜索或进入该目录
表1-6 目录权限举例
权限文件属主同组用户其他用户
drwx rwx r- x ( 7 7 5 ) 读、写、执行读、写、执行读、执行
drwx r-x r- - ( 7 5 4 ) 读、写、执行读、执行读
drwx r-x r- x ( 7 5 5 ) 读、写、执行读、执行读、执行
如果把同组用户或其他用户针对某一目录的权限设置为- - x,那么他们将无法列出该目录
中的文件。如果该目录中有一个执行位置位的脚本或程序,只要用户知道它的路径和文件名,
仍然可以执行它。用户不能够进入该目录并不妨碍他的执行。
目录的权限将会覆盖该目录中文件的权限。例如,如果目录d o c s具有如下的权限:
而其中的文件p a y的权限为:
那么a d m i n组的用户将无法编辑该文件,因为它所属的目录不具有这样的权限。
该文件对任何用户都可读,但由于它所在的目录并未给a d m i n组的用户赋予执行权限,所
以该组的用户都将无法访问该目录,他们将会得到“访问受限”的错误消息。
1.6 suid/guid
我们在前面曾经提到过s u i d和g u i d。这种权限位近年来成为一个棘手的问题。很多系统供
应商不允许实现这一位,或者即使它被置位,也完全忽略它的存在,因为它会带来安全性风
险。那么人们为何如此大惊小怪呢?
s u i d意味着如果某个用户对属于自己的s h e l l脚本设置了这种权限,那么其他用户在执行这
一脚本时也会具有其属主的相应权限。于是,如果根用户的某一个脚本设置了这样的权限,
那么其他普通用户在执行它的期间也同样具有根用户的权限。同样的原则也适用于g u i d,执
行相应脚本的用户将具有该文件所属用户组中用户的权限。
1.6.1 为什么要使用suid/guid
为什么要使用这种类型的脚本?这里有一个很好的例子。我管理着几个大型的数据库系
统,而对它们进行备份需要有系统管理权限。我写了几个脚本,并设置了它们的g u i d,这样
我指定的一些用户只要执行这些脚本就能够完成相应的工作,而无须以数据库管理员的身份
登录,以免不小心破坏了数据库服务器。通过执行这些脚本,他们可以完成数据库备份及其
他管理任务,但是在这些脚本运行结束之后,他们就又回复到他们作为普通用户的权限。
有相当一些U N I X命令也设置了s u i d和g u i d。如果想找出这些命令,可以进入/ b i n或/ s b i n目
录,执行下面的命令:
$ ls -l | grep '^...s'
上面的命令是用来查找s u i d文件的;
$ ls -l | grep '^...s..s'
上面的命令是用来查找s u i d和g u i d的。
现在我们明白了什么是s u i d,可是如何设置它呢?下面就来介绍这个问题。如果希望设置
s u i d,那么就将相应的权限位之前的那一位设置为4;如果希望设置g u i d,那么就将相应的权限
位之前的那一位设置为2;如果希望两者都置位,那么将相应的权限位之前的那一位设置为4+2。
一旦设置了这一位,一个s将出现在x的位置上。记住:在设置s u i d或g u i d的同时,相应的
执行权限位必须要被设置。例如,如果希望设置g u i d,那么必须要让该用户组具有执行权限。
如果想要对文件l o g i n设置s u i d,它当前所具有的权限为rwx rw- r-- (741),需要在使用
c h m o d命令时在该权限数字的前面加上一个4,即chmod 4741,这将使该文件的权限变为r w s
rw- r - -。
$ chmod 4741 logit
1.6.2 设置suid/guid的例子
下面给出几个例子:
表1-7 设置s u i d / g u i d
命令结果含义
chmod 4755 rws r-x r- x 文文件被设置了s u i d,文件属主具有读、写和执行的权限,所有其
他用户具有读和执行的权限
chmod 6711 rws --s --s 文文件被设置了s u i d和g u i d,文件属主具有读、写和执行的权限,
所有其他用户具有执行的权限
chmod 4764 rws rw- r- - 文文件被设置了s u i d,文件属主具有读、写和执行的权限,同组用
户具有读和执行的权限,其他用户具有读权限
还可以使用符号方式来设置s u i d / g u i d。如果某个文件具有这样的权限: rwx r-x r- x,那么
可以这样设置其s u i d:
chmod u+s <filename>
于是该文件的权限将变为: rws r-x r-x
在查找设置了s u i d的文件时,没准会看到具有这样权限的文件:rwS r-x r- x,其中S为大写。
它表示相应的执行权限位并未被设置,这是一种没有什么用处的s u i d设置,可以忽略它的存在。
注意,c h m o d命令不进行必要的完整性检查,可以给某一个没用的文件赋予任何权限,但
chmod 命令并不会对所设置的权限组合做什么检查。因此,不要看到一个文件具有执行权限,
就认为它一定是一个程序或脚本。
1.7 chown和chgrp
当你创建一个文件时,你就是该文件的属主。一旦你拥有某个文件,就可以改变它的所
有权,把它的所有权交给另外一个/ e t c / p a s s w d文件中存在的合法用户。可以使用用户名或用
户I D号来完成这一操作。在改变一个文件的所有权时,相应的s u i d也将被清除,这是出于安
全性的考虑。只有文件的属主和系统管理员可以改变文件的所有权。一旦将文件的所有权交
给另外一个用户,就无法再重新收回它的所有权。如果真的需要这样做,那么就只有求助于
系统管理员了。
c h o w n命令的一般形式为:
chmod -R -h owner file
- R选项意味着对所有子目录下的文件也都进行同样的操作。- h选项意味着在改变符号链
接文件的属主时不影响该链接所指向的目标文件。
1.7.1 chown举例
这里给出几个例子:
文件p r o j e c t的所有权现在由用户l o u i s e交给了用户p a u l i n e。
1.7.2 chgrp举例
c h g r p命令和c h o w n命令的格式差不多,下面给出一个例子。
用户p a u l i n e现在把该文件所属的组由a d m i n变为s y b a d m i n(系统中的另外一个用户组)。
1.7.3 找出你所属于的用户组
如果你希望知道自己属于哪些用户组,可以用如下的命令:
或者可以使用i d命令:
1.7.4 找出其他用户所属于的组
为了找出其他用户所属于的组,可以用如下的命令:
上面的命令告诉我们用户m a t t y属于s y b a d m i n、a p p s g e n和p o s t用户组。
1.8 umask
当最初登录到系统中时, u m a s k命令确定了你创建文件的缺省模式。这一命令实际上和
c h m o d命令正好相反。你的系统管理员必须要为你设置一个合理的u m a s k值,以确保你创建的
文件具有所希望的缺省权限,防止其他非同组用户对你的文件具有写权限。
在已经登录之后,可以按照个人的偏好使用u m a s k命令来改变文件创建的缺省权限。相应
的改变直到退出该s h e l l或使用另外的u m a s k命令之前一直有效。
一般来说,u m a s k命令是在/ e t c / p r o f i l e文件中设置的,每个用户在登录时都会引用这个文
件,所以如果希望改变所有用户的u m a s k,可以在该文件中加入相应的条目。如果希望永久性
地设置自己的u m a s k值,那么就把它放在自己$ H O M E目录下的. p r o f i l e或. b a s h p r o f i l e文件中。
1.8.1 如何计算umask值
u m a s k命令允许你设定文件创建时的缺省模式,对应每一类用户(文件属主、同组用户、
其他用户)存在一个相应的u m a s k值中的数字。对于文件来说,这一数字的最大值分别是6。系
统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用c h m o d命令增加这一
权限。目录则允许设置执行权限,这样针对目录来说, u m a s k中各个数字最大可以到7。
该命令的一般形式为:
umask nnn
其中n n n为u m a s k置0 0 0 - 7 7 7。
让我们来看一些例子。
计算出你的u m a s k值:
可以有几种计算u m a s k值的方法,通过设置u m a s k值,可以为新创建的文件和目录设置缺
省权限。表1 - 8列出了与权限位相对应的u m a s k值。
在计算u m a s k值时,可以针对各类用户分别在这张表中按照所需要的文件/目录创建缺省
权限查找对应的u m a s k值。
例如,u m a s k值002 所对应的文件和目录创建缺省权限分别为6 6 4和7 7 5。
还有另外一种计算u m a s k值的方法。我们只要记住u m a s k是从权限中“拿走”相应的位即
可。
表1-8 umask值与权限
u m a s k 文件目录
0 6 7
1 6 6
2 4 5
3 4 4
4 2 3
5 2 2
6 0 1
7 0 0
例如,对于u m a s k值0 0 2,相应的文件和目录缺省创建权限是什么呢?
第一步,我们首先写下具有全部权限的模式,即7 7 7 (所有用户都具有读、写和执行权限)。
第二步,在下面一行按照u m a s k值写下相应的位,在本例中是0 0 2。
第三步,在接下来的一行中记下上面两行中没有匹配的位。这就是目录的缺省创建权限。
稍加练习就能够记住这种方法。
第四步,对于文件来说,在创建时不能具有文件权限,只要拿掉相应的执行权限比特即
可。
这就是上面的例子,其中u m a s k值为0 0 2:
1) 文件的最大权限rwx rwx rwx (777)
2) umask值为0 0 2 - - - - - - -w-
3) 目录权限rwx rwx r-x (775) 这就是目录创建缺省权限
4) 文件权限rw- rw- r-- (664) 这就是文件创建缺省权限
下面是另外一个例子,假设这次u m a s k值为0 2 2:
1) 文件的最大权限rwx rwx rwx (777)
2 ) u m a s k值为0 2 2 - - - -w- -w-
3) 目录权限rwx r-x r-x (755) 这就是目录创建缺省权限
4) 文件权限rw- r-- r-- (644) 这就是文件创建缺省权限
1.8.2 常用的umask值
表1 - 9列出了一些u m a s k值及它们所对应的目录和文件权限。
表1-9 常用的u m a s k值及对应的文件和目录权限
u m a s k值目录文件
0 2 2 7 5 5 6 4 4
0 2 7 7 5 0 6 4 0
0 0 2 7 7 5 6 6 4
0 0 6 7 7 1 6 6 0
0 0 7 7 7 0 6 6 0
如果想知道当前的umask 值,可以使用u m a s k命令:
第1章文件安全与权限11
下载
如果想要改变u m a s k值,只要使用u m a s k命令设置一个新的值即可:
$ umask 002
确认一下系统是否已经接受了新的u m a s k值:
在使用u m a s k命令之前一定要弄清楚到底希望具有什么样的文件/目录创建缺省权限。否
则可能会得到一些非常奇怪的结果;例如,如果将u m a s k值设置为6 0 0,那么所创建的文件/目
录的缺省权限就是0 6 6!
1.9 符号链接
存在两种不同类型的链接,软链接和硬链接,这里我们只讨论软链接。软链接实际上就
是一个指向文件的指针。你将会发现这种软链接使用起来非常方便。
1.9.1 使用软链接来保存文件的多个映像
下面我们就解释一下符号链接是怎么回事。比方说在/ u s r / l o c a l / a d m i n / s a l e s目录下有一个
含有销售信息的文件,销售部门的每一个人都想看这份文件。你可以在每一位用户的$ H O M E
目录下建立一个指向该文件的链接,而不是在每个目录下拷贝一份。这样当需要更改这一文
件时,只需改变一个源文件即可。每个销售$ H O M E目录中的链接可以起任何名字,不必和源
文件一致。
如果有很多子目录,而进入这些目录很费时间,在这种情况下链接也非常有用。可以针
对$ H O M E目录下的一个很深的子目录创建一个链接。还有,比如在安装一个应用程序时,它
的日志被保存到/ u s r / o p t / a p p / l o g目录下,如果想把它保存在另外一个你认为更方便目录下,可
以建立一个指向该目录的链接。
该命令的一般形式为:
ln [-s] source_path target_path
其中的路径可以是目录也可以是文件。让我们来看几个例子。
1.9.2 符号链接举例
假如系统中有4 0个销售和管理用户,销售用户使用一个销售应用程序,而管理用户使用一个
 
管理应用程序。我作为系统管理员该怎么做呢?首先删除它们各自$ H O M E目录下的所
有. p r o f i l e文件。然后在/ u s r / l o c a l / m e n u s /目录下创建两个p r o f i l e文件,一个是s a l e s . p r o f i l e,一
个是a d m i n . p r o f i l e,它们分别为销售和管理人员提供了所需的环境,并引导他们进入相应的应
用程序。现在我在所有销售人员的$ H O M E目录下分别创建一个指向s a l e s . p r o f i l e的链接,在所
有管理人员的$ H O M E目录下分别创建一个指向a d m i n . p r o f i l e文件的链接。注意,不必在上面
命令格式中的t a rg e t p a t h端创建相应文件,如果不存在这样一个文件, l n命令会自动创建该文
件。下面就是我对销售人员m a t t y所做的操作。
(你所看到的可能会与此稍有差别)。
这就是我所要做的全部工作;对于管理人员也是如此。而且如果需要作任何修改的话,
只要改变销售和管理人员的p r o f i l e文件即可,而不必对4 0个用户逐一进行修改。
下面是另外一个例子。我所管理的系统中有一个网络监视器,它将日志写在/ u s r / o p t /
m o n i t o r / r e g s t a r目录下,但其他所有的日志都保存在/ v a r / a d m / l o g s目录下,这样只需在该目录
下建立一个指向原有文件的链接就可以在一个地方看所有的日志了,而不必花费很多时间分
别进入各个相应的目录。下面就是所用的链接命令:
$ ln -s /usr/opt/monitor/regstar/reg.log /var/adm/logs/monitor.log
如果链接太多的话,可以删掉一些,不过切记不要删除源文件。
不管是否在同一个文件系统中,都可以创建链接。在创建链接的时候,不要忘记在原有
目录设置执行权限。链接一旦创建,链接目录将具有权限7 7 7或rwx rwx rwx,但是实际的原
有文件的权限并未改变。
在新安装的系统上,通常要进行这样的操作,在/ v a r目录中创建一个指向/ t m p目录的链接,
因为有些应用程序认为存在/ v a r / t m p目录(然而它实际上并不存在),有些应用程序在该目录中
保存一些临时文件。为了使所有的临时文件都放在一个地方,可以使用l n命令在/ v a r目录下建
立一个指向/ t m p目录的链接。
现在如果我在/ v a r目录中列文件,就能够看到刚才建立的链接:


-------------------------------------------------------------=====================================------------------------

分析结果如下:

程序 目录
setuid(s) setuid会让用户获得文件属主的执行权限 无意义
setgid(s) setgid会让用户获得文件属组的执行权限 此目录所有用户都能进入,同时新建的文件/目录会继承目录属组
sticky(T) 无意义 用户不能删除其它用户在/test目录下的文件,用户指权限位的其它用户
setuid(S) 除了用户所有者外,所有用户都能执行此程序,而所有者则不能执行 此目录除了用户所有者不能进入,其它用户都能进入,同时新建的文件/目录会继承目录属组
setgid(S) 除了所属组里的用户外,所有的用户都能执行 此目录除了所属组里的用户外,所有用户都能进入此目录,同时新建的文件/目录会继承目录属组
sticky(T) 无意义 用户不能进入和写入,用户指权限位的其它用户



测试1)程序文件的执行权限位为setuid(S)的分析
chmod 4655 passwd
-rwSr-xr-x  1 root root 86319 May 11 06:42 passwd
su - oracle
./passwd
Changing password for oracle.
Old Password:
New password:
Re-enter new password:
Password changed

su - root
chown oracle passwd
su - oracle
./passwd
-bash: ./passwd: Permission denied

note:
除了文件所有者,任何用户都可以执行passwd

===============================================
测试2)程序文件的执行权限位为setuid(s)的分析
chown root passwd
chmod 4755 passwd
ls -l
-rwsr-xr-x  1 root root 86319 May 11 06:42 passwd
su - oracle
./passwd
Changing password for oracle.
Old Password:
New password:
Re-enter new password:
Password changed
exit

chown oracle passwd
chmod 6755 passwd
ls -l
-rwsr-xr-x  1 oracle root 86319 May 11 06:42 passwd
su - oracle
./passwd
Changing password for oracle.
Old Password:
passwd: Authentication failure
注意:这里的验证失败是因为oracle用户没有写shadow的权限,这时其它用户(包括root用户在内)都不具有更改密码的权限
su -
./passwd
Changing password for root.
New password:
Bad password: too simple
Re-enter new password:
Canot lock password file: already locked
Error: Password NOT changed
passwd: Authentication token lock busy

note:
1)所有的用户都有执行文件的权限
2)所有用户都继承文件所有者对程序的权限,包括root用户

===================================================
测试3)程序文件的执行权限位为setgid(s)的分析
cp /bin/ls /tmp
chmod 2755 /tmp/ls
-rwxr-sr-x    1 root     root    67700 2009-05-12 11:05 /tmp/ls
mkdir /test
chmod 750 /test
su - oracle
cd /tmp/
./ls /test
Desktop  jizhao  linux-iscsi-3.4.3.2  pop  sql    vpn  webapps

note:
可以看到/test目录里面的文件,说明setgid对文件是有效的.

su -
chown root.oinstall /tmp/ls
chmod 2755 /tmp/ls
-rwxr-sr-x    1 root     oinstall    67700 2009-05-12 11:05 /tmp/ls
su - oracle
./ls /test
./ls: /test/: Permission denied

note:
关闭setgid,ls命令对/目录又不可读了.

=====================================================

测试4)程序的执行权限位为setgid(S)的分析

chmod 777 /test
ls -ld /test/
drwxrwxrwx    2 root     root         4096 2009-05-12 13:15 /test/

chmod 2745 /tmp/ls
ls -l /tmp/ls
-rwxr-Sr-x    1 root     oracle        67700 2009-05-12 11:05 /tmp/ls

su - oracle
cd /tmp/
./ls /test
-bash: ./ls: Permission denied

su - test
cd /tmp/
./ls /test
oracle    root

================================================

测试5)目录为setuid(S)和setgid(S)的分析
chmod 4455 /test/
chown oracle /test/
ls -ld aaa/
dr-Sr-xr-x    2 oracle     root         4096 2009-05-12 19:54 /test/
su - oracle
cd /test/
-bash: cd: /test/: Permission denied

切换到test用户测试执行权限
su - test
cd /test

切换到root用户
su -
chown root.oracle /test/
chmod 2545 /test
dr-xr-Sr-x    2 root     oracle         4096 2009-05-12 19:54 test/

切换到oracle用户测试执行权限
su - oracle
cd /test
-bash: cd: /test/: Permission denied

切换到test用户测试执行权限
su - test
cd /test


============================================


测试6)目录文件的执行权限位为setgid(s)的分析
mkdir /test
chown root /test
chmod 2755 /test
drwxrwsrwx    2 root     root         4096 2009-05-12 12:58 /test/

touch /test/root

su - oracle
touch /test/oracle
ls -l /test/
total 0
-rw-r--r--    1 oracle   root            0 May 12 13:10 oracle
-rw-r--r--    1 root     root            0 May 12 13:07 root
rm -f /test/*

note:setgid对目录有意义,其中oracle文件的用户属组已经是root,而不是oracle的属主

chmod 6755 /test
ls -ld /test/
drwsrwsrwx    2 root     root         4096 2009-05-12 13:15 /test/

su - oracle
touch /test/oracle
ls -l /test/
total 0
-rw-r--r--    1 oracle   root            0 May 12 13:15 oracle
-rw-r--r--    1 root     root            0 May 12 13:07 root
note:
setuid对目录没有意义,其中oracle文件的用户属主还是oracle,而不是root

==============================================



测试7)目录的执行权限位为sticky(t)的分析
mkdir /test
chmod 777 /test

切换到test用户下新建文件test
su - test
cd /test/
touch test

切换到oracle用户下新建文件oracle
su - oracle
cd /test
touch oracle
可以删除test用户的文件
rm -f test

切换到test用户下,可以对oracle用户文件写入
su - test
cd /test
cat > oracle
test data
CTRL+D


mkdir /test1
chmod 1777 /test1

切换到test用户下新建文件test
su - test1
cd /test1/
touch test

切换到oracle用户下新建文件oracle
su - oracle
cd /test
touch oracle
不可以删除test用户的文件
rm test
rm: remove write-protected regular empty file `test'? y
rm: cannot remove `test': Operation not permitted
切换到test用户下,不可以对oracle用户文件写入
su - test
cd /test
cat > oracle
-bash: oracle: Permission denied
CTRL+D


==========================================


测试8)目录的执行权限位为sticky(T)的分析

mkdir /test2
chmod 1776 /test2
drwxrwxrwT    2 root   root         4096 2009-05-13 16:16 /test2


su - oracle
cd /test2
-bash: cd: /test2: Permission denied


总结:
经过以上8个小测试,说明以下几点:
1)对于文件而言,setuid,setgid都对其有作用.setuid会让用户获得文件属主的执行权限,而setgid会让用户获得文件属组的执行权限.
例如上面的操作,passwd文件的owner是root,而有setuid的权限,这时oracle用户去执行passwd,就具有了root权限,可以读或写shadow
而相反的如果passwd文件的owner是oracle,即使是root用户也没有更改密码的权限了.
2)对于目录而言,setuid对其没有意义,setgid对其有意义,例如上面的操作,/test目录的属组是root,同时/test目录被设定了setgid,
用oracle用户在/test目录下touch一个文件aaa,aaa文件的属组就变成root,而不是oracle
3)对于文件而于,大写S权限,就是没有执行权限,而又授权了setuid和setgid,这时在权限位上就是大写S权限.
在setuid位产生S权限,例如:
-rwSr-xr-x  1 oracle root 86319 May 11 06:42 passwd
这时的passwd,除了用户所有者oracle之外,所有用户都能执行passwd,而oracle则不能执行passwd,root用户不受影响
在setgid位产生S权限,例如:
-rwxr-Sr-x    1 root     oracle        67700 2009-05-12 11:05 /tmp/ls
这时的ls,除了组oracle里的用户之外,所有的用户都能执行ls,而oracle则不能执行ls,root用户不受影响
4)对于目录而言,大写S权限,就是没有执行权限,而又授权了setuid和setgid,这时在权限位上就是大写S权限.
在setuid位产生S权限,例如:
dr-Sr-xr-x    2 oracle     root         4096 2009-05-12 19:54 /test/
此时/test目录除了oracle用户不能进入外,其它用户都能进入
在setgid位产生S权限,例如
dr-xr-Sr-x    2 root     oracle         4096 2009-05-12 19:54 /test/
此时/test目录除了oracle组里的用户外,所有用户都能进入/test目录
5)对于文件而言,sticky没有意义
6)对于目录而言,sticky位使得用户不能删除或修改其它用户的文件
例如:
drwxrwxrwt    2 root   root         4096 May 13 16:16 /test
这时oracle用户不能删除其它用户在/test目录下的文件
如果没有sticky权限,oracle用户就可以删除/test目录下的任何文件
7)对于目录而言,sticky大写的(S)位,对用户而言则不能进入和写入

============================================

不管是Linux新手还是高手,在使用它的时候不可避免都会遇到Linux权限问题。而这些问题也是初学者问得最多的问题,很多的脚本不能执行的原因就是因为没有设定正确的权限所致。这里我们来看看Linux下的根限到底是怎么一回事。
  当你新建一个文件时,它的最初的权限取决于你的umask值(将在后面说明)。权限可 以使用chmod命令或是chmod()系统调用来修改一个文件的权限模式。只有在文件所有者才能修改文件的权限模式。唯一例外的就是超级用户:超级用户 可以修改任何文件的权限。下面是chmod命令的格式:
chmod [-Rfh] [agou] [+-=] [rwxXstugol] filelist
Image00001
要修改哪些用户的特权:
字符 含义
a 修改所有用户的特权
g 修改组用户的特权
o 修改其它用户的特权
u 修改所有者的权限
执行什么操作:
字符 含义
- 删除当前的权限
= 替换当前的权限
+ 增加当前的权限
要修改哪一项权限:
字符 含义
r 读访问
w 写访问
x 执行访问
s SUID或是SGID
t 粘附位
  其中X是表示由BSD衍生出来的UNIX系统特有的选项,它的意思是:如果文件是一个目录,或有一些其它执行位已设置,那么就将文件设置为只可执行。而l则是由System V衍生出来的UNX系统特有的选项,它的意思是:允许对文件进行强制加锁。
-R选项表示chmod命令会递归执行。如果指定了一个目录filelist,那么目录的权限改变了,目录下所有文件的权限也都改变了。如果该目录包含子目录,那么这一地程会一直向下重复。
-f选项表示强制执行,chmod命令不会报告错误。通常在shell中比较有用。
  在某些系统中使用-h选项来改变chmod对符号链接的工作方式。如果指定了-h选项,而其中一个参数据为符号链接的话,那么chmod不会改变符号链接所指向的那个文件或目录的权限。
下图说明了命令的使用方法:
Image00002
计算机八进制的文件权限:
  chmod允许用户使用一个四位八进制数字来指定文件权限模式。用户可以通过将权限相加的方式来计算这一数值。下表说明了每个文件权限对应的八进制数。
八进制数 权限
4000 SUID
2000 SGID
1000 粘附位
0400 所有者可读
0200 所有者可写
0100 所有者可执行
0040 组成员可读
0020 组成员可写
0010 组成员可执行
0004 其它用户可读
0002 其它用户可写
001 其它用户可执行
  因此,一个文件权限如果为“-rwxr-x---”,那么其文件模式为0750,计算 过程为:0400+0200+0100+0040+0010=0750。例如常见的/tmp目录的权限就为1777,表示任何用户都可以在该目录下创建文 件,但是用户不能删除其它用户的文件。
umask
  umask是“用户文件创建模式掩码”的缩写,是一个四位的八进制数值。用来确定一个 新创建文件的权限。每个进程都从父进程那里继承了自己的umask。一般该命令会在.bashrc,.profile,.cshrc或是/etc /profile及/etc/bashrc中。
Image00003
  最常见的umask值是022,027以及077。022让文件所有者拥有对新建文件 的读写权限,但是其它人对此只读。例如:0666(默认的文件建立模式)+0022(umask)=0644。计算umask值最简单的方法是记 住:umask值中的2屏蔽了写权限,而7屏蔽了读,写及执行权限。
常用的umask设置:
umask 用户访问 组访问 其它
0000 所有 所有 所有
0002 所有 所有 读,执行
0007 所有 所有
0022 所有 读,执行 读,执行
0027 所有 读,执行
0077 所有
  下面的图片是显示新建文件后的权限,大家可以想想看它对应的mask应是多少。
Image00004 
粘附位:
  具有八进制值1000的位叫粘附位,是unix已经发展得不再需要的事物而又不能摆脱 其追随的例子.像unix在其上度过它的孩童期的PDP-11/70这样的小内存系统,需要一些程序持续地驻留在内存或交换设备上这个时候粘附位就十分重 要了.在今天由于有了25美圆的内存模块和快速磁盘驱动器,在可执行程序上的粘附位已经过时了,现代的内核已经悄然地忽略了它.
  如果在目录上设置了这个位,那么大多数版本的unix不允许删除或重新命名该目录中的文件,除非你是该目录的属主,该文件的属主或超级用户.在这个目录上拥有写入权限是不够的.这相约定是让像/tmp之类的目录变得多少有些隐私性和安全性的一种尝试.
  Solaris和HP-UX在处理粘附位目录的时候并不那么严格.如果对该目录有写入权限,即使不是属主,也能删除其中的文件.这实际上有许多意义,虽然对实际应用几乎没有什么影响。
SUID和SGID
  setuid和setgid的位值是04000和02000。这些位允许程序访问运它们的用户本来无权访问的文件和进程。当某个目录上设置 setgid位时,在这个目录中新创建的文件具有该目录的属组权而不是创建该文件的用户的默认属组。这项约定使得在几个用户之间(只要这些用户都属于同一 个组)共享一个目录中的文件变得更简单。在使用这些特性之前,请检查自己的系统,因为并不是所有版本的unix都支持这个特性,当然 BSD,REDHAT,HP-UX,SOLARIS都是支持的。对setgid位的这种解释跟它在可执行文件上设置时的含义没有什么关系,但不要混淆了这 两种意义。一些系统允许在非可执行的纯文本文件上设置setgid位,以在该文件被打开时请求特殊的锁定。有关它的详细说明可以参考:[url]http://www.linuxeden.com/html/unix/20071031/36892.html[/url]。在linux下,有关SUID最常用的一个命令就是ping,下面是关于它的图片,好好看看吧。
Image00005
  如果对windows比较熟悉的人应对“runas”这个命令不会陌生,我个人觉得SUID及SGID和它有点类似,不过比它要更先进一 点。runas允许非特权用户可以用管理员的用户来临时运行特殊的应用程序。不过这个命令在个人计算机上用得比较少,倒是在服务器上用得多一点。使用它在 一定的程度可以增加安全性。
Image00006
Image00007
  怎么样,有了一个相对直观的概念了吧,当然这里只是简单的列出这些,更深入的技术还需要过一步的学习和了解。


--
孙路
Reply all
Reply to author
Forward
0 new messages