文件权限说明(Linux)

  不管是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
  怎么样,有了一个相对直观的概念了吧,当然这里只是简单的列出这些,更深入的技术还需要过一步的学习和了解。
展开阅读全文

没有更多推荐了,返回首页