四
四、文件权限
1、文件类型
Linux 广泛的被很多用户所接受,它强大的功能受到很多人喜欢,Linux 文件一般是用一些相关的应
用程序创建,比如图像工具、文档工具、归档工具... .... 或 cp 工具等。Linux 文件的删除方式是用 rm 命
令。
Linux 文件类型和 Linux 文件的文件名所代表的意义是两个不同的概念。我们通过一般应用程序而创建的
比如 file.txt、file.tar.gz ,这些文件虽然要用不同的程序来打开,但放在 Linux 文件类型中衡量的话,大
多是常规文件(也被称为普通文件)。
Linux 文件类型常见的有:普通文件、目录、字符设备文件、块设备文件、符号链接文件等;现在我们
进行一个简要的说明;
1 普通文件
1. [root@localhost ~]# ls -lh install.log
2. -rw-r--r-- 1 root root 53K 03-16 08:54 install.log
我 们用 ls -lh 来查看某个文件的属性,可以看到有类似 -rw-r--r-- ,值得注意的是第一个符号是 - ,
这样的文件在 Linux 中就是普通文件。这些文件一般是用一些相关的应用程序创建,比如图像工具、文
档工具、归档工具... .... 或 cp 工具等。这类文件的删除方式是用 rm 命令;
2 目录
1. [root@localhost ~]# ls -lh
2. 总计 14M
3. -rw-r--r-- 1 root root 2 03-27 02:00 fonts.scale
4. -rw-r--r-- 1 root root 53K 03-16 08:54 install.log
5. -rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm
6. drwxr-xr-x 2 1000 users 4.0K 04-04 23:30 mkuml-2004.07.17
7. drwxr-xr-x 2 root root 4.0K 04-19 10:53 mydir
8. drwxr-xr-x 2 root root 4.0K 03-17 04:25 Public
当 我们在某个目录下执行,看到有类似 drwxr-xr-x ,这样的文件就是目录,目录在 Linux 是一个比较
特殊的文件。注意它的第一个字符是 d。创建目录的命令可以用 mkdir 命令,或 cp 命令,cp 可以把一
个目录复制为另一个目录。删除用 rm 或 rmdir 命令。
3 字符设备或块设备文件如时您进入/dev 目录,列一下文件,会看到类似如下的;
1. [root@localhost ~]# ls -la /dev/tty
2. crw-rw-rw- 1 root tty 5, 0 04-19 08:29 /dev/tty
3. [root@localhost ~]# ls -la /dev/hda1
4. brw-r----- 1 root disk 3, 1 2006-04-19 /dev/hda1
我们看到/dev/tty 的属性是 crw-rw-rw- ,注意前面第一个字符是 c ,这表示字符设备文件。比如猫等
串口设备
我们看到 /dev/hda1 的属性是 brw-r----- ,注意前面的第一个字符是 b,这表示块设备,比如硬盘,光
驱等设备;
这个种类的文件,是用 mknode 来创建,用 rm 来删除。目前在最新的 Linux 发行版本中,我们一般不
用自己来创建设备文件。因为这些文件是和内核相关联的。
4 套接口文件
当我们启动 MySQL 服务器时,会产生一个 mysql.sock 的文件。
1. [root@localhost ~]# ls -lh /var/lib/mysql/mysql.sock
2. srwxrwxrwx 1 mysql mysql 0 04-19 11:12 /var/lib/mysql/mysql.sock
注意这个文件的属性的第一个字符是 s。我们了解一下就行了。
5 符号链接文件
1. [root@localhost ~]# ls -lh setup.log
2. lrwxrwxrwx 1 root root 11 04-19 11:18 setup.log -> install.log
当我们查看文件属性时,会看到有类似 lrwxrwxrwx,注意第一个字符是 l,这类文件是链接文件。是通过
ln -s 源文件名 新文件名。上面是一个例子,表示 setup.log 是 install.log 的软链接文件。怎么理解呢?
这和 Windows 操作系统中的快捷方式有点相似。
符号链接文件的创建方法举例;
1. [root@localhost ~]# ls -lh kernel-6.15-1.2025_FC5.i686.rpm
2. -rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm
3. [root@localhost ~]# ln -s kernel-6.15-1.2025_FC5.i686.rpm kernel.rpm
4. [root@localhost ~]# ls -lh kernel*
5. -rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm
6. lrwxrwxrwx 1 root root 33 04-19 11:27 kernel.rpm -> kernel-6.15-1.2025_FC5
2、文件权限
Linux 系统是一个典型的多用户系统,不同的用户处于不同的地位。为了保护系统的安全性,Linux
系统对不同用户访问同一文件的权限做了不同的规定。
对于一个 Linux 系统中的文件来说,它的权限可以分为三种:读的权限、写的权限和执行的权限,
分别用 r、w 和 x 表示。不同的用户具有不同的读、写和执行的权限。
对于一个文件来说,它都有一个特定的所有者,也就是对文件具有所有权的用户。同时,由于在
Linux 系统中,用户是按组分类的,一个用户属于一个或多个组。文件所有者以外的用户又可以分为文
件所有者的同组用户和其它用户。因此,Linux 系统按文件所有者、文件所有者同组用户和其它用户三
类规定不同的文件访问权限。
权限的概念
Linux 文件系统安全模型是通过给系统中的文件赋予两个属性来起作用的,这两个赋予每个文件的
属性称为所有者(ownership)和访问权限(access rights)。Linux 下的每一个文件必须严格地属于一个用户和
一个组。
下图是在我机器上的/root 目录下运行 ls -l 命令的情况。-rw-r--r--
这些符号用来描述文件的访问权限类别,也就是常说的文件权限。这些访问权限指导 Linux 根据文
件的用户和组所有权来处理所有访问文件的用户请求。总共有 10 种权限属性,因此一个权限列表总是
10 个字符的长度。它的格式遵循下列规则:
◆ 第 1 个字符表示一种特殊的文件类型。其中字符可为 d(表示该文件是一个目录)、b(表示该文件
是一个系统设备,使用块输入/输出与外界交互,通常为一个磁盘)、c(表示该文件是一个系统设备,使
用连续的字符输入/输出与外界交互,如串口和声音设备),“.”表示该文件是一个普通文件,没有特殊
属性。
◆ 2~4 个字符用来确定文件的用户(user)权限,5~7 个字符用来确定文件的组(group)权限,8~10
个字符用来确定文件的其它用户(other user,既不是文件所有者,也不是组成员的用户)的权限。其中,
2、5、8 个字符是用来控制文件的读权限的,该位字符为 r 表示允许用户、组成员或其它人可从该文件
中读取数据。短线“-”则表示不允许该成员读取数据。与此类似,3、6、9 位的字符控制文件的写权
限,该位若为 w 表示允许写,若为“-”表示不允许写。4、7、10 位的字符用来控制文件的制造权限,
该位若为 x 表示允许执行,若为“-”表示不允许执行。
任何列在/etc/passwd 文件中的用户都可以是一个文件的所有者,也称为该文件的用户。同样任何
列在/etc/group 文件中的组都可以是文件组的所有者,也简称为文件的组。
drwxrwxr-- 2 root root 4096 2 月 11 10:36 guo
因为 guo 的第 1 个位置的字符是 d,所以由此知道 guo 是一个目录。第 2 至 4 位置上的属性是 rwx,
表示用户 root 拥有权限列表显示 guo 中所有的文件、创建新文件或者删除 guo 中现有的文件,或者将
guo 作为当前工作目录。第 5 至 7 个位置上的权限是 rwx,表示 root 组的成员拥有和 root 一样的权限。
第 8 至 10 位上的权限仅是 r--,表示不是 root 的用户及不属于 root 组的成员只有对 guo 目录列表的权
限。这些用户不能创建或者删除 guo 中的文件、执行 junk 中的可执行文件,或者将 junk 作为他们的当
前工作目录。
-rwxr-xr-- 1 user admin 20480 11 月 11 09:23 Readme.txt
在该项中,第 1 个位置是短线“-”,表示该文件是一个普通文件,没有特殊属性。该文件对任何人
都可读,只对 user 可写,user 和 admin 的组成员可以执行该文件。
另外需要注意的是,当用户访问一个文件时,权限检查是从左到右的。假设上述的 readme.txt 文件
具有以下权限:
-r--rw-r--
那么即使 user 是属于 admin 组的一个成员,也不能对该文件进行写操作,因为已经被左边的写权
限设置拒绝了。
一般文件权限读(R),写(W),执行(X)权限比较简单。一般材料上面都
有介绍。这里介绍一下一些特殊的文件权限——SUID,SGID,Stick bit。
如果你检查一下/usr/bin/passwd 和/tmp/的文件权限你就会发现和普通的文件权限有少许不同,如下图所示:
这里就涉及到 SUID 和 Stick bit。
SUID 和 SGID
我们首先来谈一下 passwd 程序特殊的地方。大家都知道,Linux 把用户的密码信息存放
在/etc/shadow 里面,该文件属性如下:
可以看到 Shadow
的只有所有者可读写,所有者是 root,所以该文件对普通用户是不可读写的。但是普通用户调
用 passwd 程序是可以修改自己的密码的,这又是为什么呢?难道普通用户可以读写 shadow
文件?难道 Linux 有漏洞?当然不是啦。password 可以修改 shadow 文件的原因是他设置了
SUID 文件权限。
SUID 文件权限作用于可执行文件。一般的可执行文件在执行期的所有者是当前用户,比
如当前系统用户是 simon,simon 运行程序 a.out,a.out 执行期的所有者应该是 simon。但是
如果我们给可执行文件设置了 SUID 权限,则该程序的执行期所有者,就是该文件所有者。还
以 前面的 a.out 为例,假如 a.out 设置了 SUID,并且其所有者是 root,系统当前用户是 simon,
当 simon 运行 a.out 的时 候,a.out 在运行期的所有者就是 root,这时 a.out 可以存取只有 root
权限才能存取的资源,比如读写 shadow 文件。当 a.out 执行结束 的时候当前用户的权限又回
到了 simon 的权限了。
passwd 就是设置了 SUID 权限,并且 passwd 的所有者是 root,所以所有的用户都可以
执行他,在 passwd 运行期,程序获得临时的 root 权限,这时其可以存取 shadow 文件。当 passwd
运行完成,当前用户又回到普通权限。
同理,设置程序的 SGID,可以使程序运行期可以临时获得所有者组的权限。在团队开发
的时候,这个文件权限比较有用,一般系统用 SUID 比较多。
SGID 可以用于目录,当目录设置了 SGID 之后,在该目录下面建立的所有文件和目录都
具有和该目录相同的用户组。
Stick bit(粘贴位)
对程序,该权限告诉系统在程序完成后在内存中保存一份运行程序的备份,如该程序常
用,可为系统节省点时间,不用每次从磁盘加载到内存。Linux 当前对文件没有实现这个功能,
一些其他的 UNIX 系统实现了这个功能。
Stick bit 可以作用于目录,在设置了粘贴位的目录下面的文件和目录,只有所有者和 root
可以删除他。现在我们可以回头去看看/tmp/目录的情况,这个目录 设置了粘贴位。所以说,
并且所有人都可以对该目录读写执行(777),这样意味着所有人都可以在/tmp/下面创建临时目录。因为设置 Stick bit 只有所有者和 root 才能删除目录。这样普通用户只能删除属于自己
的文件,而不能删除其他人的文件。如下图所示:
设置 SUID,SGID,Stick bit
前面介绍过 SUID 与 SGID 的功能,那么,如何打开文件使其成为具有 SUID 与 SGID 的
权限呢?这就需要使用数字更改权限了。现在应该知道,使用数字 更改权限的方式为“3 个数
字”的组合,那么,如果在这 3 个数字之前再加上一个数字,最前面的数字就表示这几个属性
了(注:通常我们使用 chmod xyz filename 的方式来设置 filename 的属性时,则是假设没有
SUID、SGID 及 Sticky bit)。
4 为 SUID
2 为 SGID
1 为 Sticky bit
假设要将一个文件属性改为“-rwsr-xr-x”,由于 s 在用户权限中,所以是 SUID,因此,在
原先的 755 之前还要加上 4,也就是使用“chmod 4755 filename”来设置。
SUID 也可以用“chmod u+s filename”来设置,“chmod u-s filename”来取消 SUID 设
置;同样,SGID 可以用“chmod g+s filename”,“chmod g-s filename”来取消 SGID 设置。
一般来说,使用过 Linux 的同学都知道,Linux 文件的权限有 rwx,所有者、所有组、其它用户的 rwx 权限
是彼此独立的。为此,经常会听到如果某个 web 文件需要被修改的话,需要加上 777 的权限,这就是让所有
用户可写。
但仔细一想,这样的权限未免有些想得比较天真,没有考滤特殊情况。例如/tmp 目录默认权限是 777,
而且有些文件也是允许所有用户访问修改的,那么是不 是任何一个用户都可以将这些删除呢?再如
/etc/shadow 保存的是用户密码文件,默认情况下它的权限是 640,那么只有 shadow 的 owner(root)才能修
改它,按照常规理解,这是不可理解的,因为每个用户都可能修改密码,也就是会修改这个文件。
为了把这些情况解释清楚,需要引入 Linux 特殊文件权限的概念。Linux 特殊文件权限有三个玩意:
sticky bit、SGID、SUID,以下一一道来。
sticky bit
sticky bit 只对目录有效,使目录下的文件,只有文件拥有者才能删除(如果他不属于 owner,仅属于
group 或者 other,就算他有 w 权限,也不能删除文件)。
加 sticky bit 的方法:
chmod o+t /tmp 或者chmod 1777 /tmp
查看是否加了 sticky bit,用 ls -l,可以看到有类似这样的权限:“-rwxrwxrwt”,t 就代表已经加
上了 sticky bit,而且生效了,如果显示的是“-rwxrwxrwT”,说明也已经加上了 sticky bit,但没有生
效(因为本来 other 就没有写的权限)。
看看/tmp 目录的权限,就是 drwxrwxrwt 吧
SGID(The Set GroupID )
加上 SGID 的文件,表示运行这个程序时,是临时以这个文件的拥有组的身份运行的;加上 SGID 的文件
夹,表示在这个目录下创建的文件属于目录所有的组,而不是创建人所在的组,在这个目录下创建的目录继
承本目录的 SGID。
加 SGID 的方法:
chmod g+s /tmp 或
chmod 2777 /tmp
查看是否加了 SGID,用 ls -l,可以看到类似这样的权限“drwxrwsrwx”,s 就代表已经加上了 SGID,
而且生效,如果显示“drwxrwSrwx”,说明已经加上了 SGID,但没有生效(因为本来 group 就没有执行的
权限)。
SUID(The Set UserID)
SUID 与 SGID 是一样的,惟一不同的是,运行时是以这个文件的拥有者身份来运行。
加 SUID 的方法:
chmod o+s /tmp 或
chmod 4777 /tmp
同样的,加了 SUID 的文件权限有这类似这两种:“drwsrwxrwx”、“drwSrwxrwx”。
看看 passwd 命令的权限:ll /usr/bin/passwd,是"-rwsr-x-rx",终于知道为什么执行 passwd 时,可
以修改/etc/shadow 文件了吧
SUID:置于 u 的 x 位,原位置有执行权限,就置为 s,没有了为 S .
SGID:置于 g 的 x 位,原位置有执行权限,就置为 s,没有了为 S .
STICKY:粘滞位,置于 o 的 x 位,原位置有执行权限,就置为 t ,否则为 T .3、超级权限控制
在 Linux 操作系统中,root 的权限是最高的,也被称为超级权限的拥有者。普通用户无法执行的操作,root 用户都能完
成,所以也被称之为超级管理用户。
在系统中,每个文件、目录和进程,都归属于某一个用户,没有用户许可其它普通用户是无法操作的,但对 root 除外。root
用户的特权性还表现在 root 可以超越任何用户和用户组来对文件或目录进行读取、修改或删除(在系统正常的许可范围内);
对可执行程序的执行、终止;对硬件设备的添加、创建和移除等;也可以对文件和目录进行属主和权限进行修改,以适合系
统管理的需要(因为 root 是系统中权限最高的特权用户);
3.1、对超级用户和普通用户的理解
3.1.1、什么是超级用户;
在所有 Linux 系统中,系统都是通过 UID 来区分用户权限级别的,而 UID 为 0 的用户被系统约定为是具有超级权限。超级用
户具有在系统约定的最高权限满园内操作,所以说超级用户可以完成系统管理的所有工具;我们可以通过/etc/passwd 来查得
UID 为 0 的用户是 root,而且只有 root 对应的 UID 为 0,从这一点来看,root 用户在系统中是无可替代的至高地位和无限制
权限。root 用户在系统中就是超级用户;
3.1.2、理解 UID 和用户的对应关系
当系统默认安装时,系统用户和 UID 是一对一的对关系,也就是说一个 UID 对应一个用户。我们知道用户身份是通过 UID 来
确认的,我们在 《用户(user)和用户组(group)配置文件详解》中的 UID 的解说中有谈到“UID 是确认用户权限的标识,
用户登录系统所处的角色是通过 UID 来实现的,而非用户名;把几个用户共用一个 UID 是危险的,比如我们把普通用户的
UID 改为 0,和 root 共用一个 UID ,这事实上就造成了系统管理权限的混乱。如果我们想用 root 权限,可以通过 su 或 sudo
来实现;切不可随意让一个用户和 root 分享同一个 UID ;”
在系统中,能不能让 UID 和用户是一对多的关系?是可以的,比如我们可以把一个 UID 为0这个值分配给几个用户共同使用,
这就是 UID 和用户的一对多的关系。但这样做的确有点危险;相同 UID 的用户具有相同的身份和权限。比如我们在系统中把
beinan 这个普通用户的 UID 改为 0 后,事实上这个普通用户就具有了超级权限,他的能力和权限和 root 用户一样;用户 beinan
所有的操作都将被标识为 root 的操作,因为 beinan 的 UID 为 0,而 UID 为 0 的用户是 root ,是不是有点扰口?也可以理解为
UID 为 0 的用户就是 root ,root 用户的 UID 就是 0;
UID 和用户的一对一的对应关系 ,只是要求管理员进行系统管理时,所要坚守的准则,因为系统安全还是第一位的。所以我
们还是把超级权限保留给 root 这唯一的用户是最好的选择;
如果我们不把 UID 的 0 值的分享给其它用户使用,只有 root 用户是唯一拥有 UID=0 的话,root 用户就是唯一的超级权限用户;
3.1.3、普通用户和伪装用户
与超级用户相对的就是普通用户和虚拟(也被称为伪装用户),普通和伪装用户都是受限用户;但为了完成特定的任务,普
通用户和伪装用户也是必须的;Linux 是一个多用户、多任务的操作系统,多用户主要体现在用户的角色的多样性,不同的用
户所分配的权限也不同;这也是 Linux 系统比 Windows 系统更为安全的本质所在,即使是现在最新版本的 Windows 2003 ,
也无法抹去其单用户系统的烙印;
3.2. 超级用户(权限)在系统管理中的作用
超级权限用户(UID 为 0 的用户)到底在系统管理中起什么作用呢?主要表现在以下两点;
3.2.1、对任何文件、目录或进程进行操作;
但值得注意的是这种操作是在系统最高许可范围内的操作;有些操作就是具有超级权限的 root 也无法完成;
比如/proc 目录,/proc 是用来反应系统运行的实时状态信息的,因此即便是 root 也无能为力;它的权限如下[root@localhost ~]# pwd
/root
[root@localhost ~]# cd /
[root@localhost /]# ls -ld /proc/
dr-xr-xr-x 134 root root 0 2005-10-27 /proc/
就是这个目录,只能是读和执行权限,但绝对没有写权限的;就是我们把/proc 目录的写权限打开给 root,root 用户也是不能
进行写操作;
[root@localhost ~]# chmod 755 /proc
[root@localhost /]# ls -ld /proc/
drwxr-xr-x 134 root root 0 2005-10-27 /proc/
[root@localhost /]# cd /proc/
[root@localhost proc]# mkdir testdir
mkdir: 无法创建目录‘testdir’: 没有那个文件或目录
3.2.2、对于涉及系统全局的系统管理;
硬件管理、文件系统理解、用户管理以及涉及到的系统全局配置等等......如果您执行某个命令或工具时,提示您无权限,大多
是需要超级权限来完成;
比如用 adduser 来添加用户,这个只能用通过超级权限的用户来完成;
3.2.3、超级权限的不可替代性;
由于超级权限在系统管理中的不可缺少的重要作用,为了完成系统管理任务,我们必须用到超级权限;在一般情况下,为了
系统安全,对于一般常规级别的应用,不需要 root 用户来操作完成,root 用户只是被用来管理和维护系统之用;比如系统日
志的查看、清理,用户的添加和删除......
在不涉及系统管理的工作的环境下,普通用户足可以完成,比如编写一个文件,听听音乐;用 gimp 处理一个图片等...... 基
于普通应用程序的调用,大多普通用户就可以完成;
当我们以普通权限的用户登录系统时,有些系统配置及系统管理必须通过超级权限用户完成,比如对系统日志的管理,添加
和删除用户。而如何才能不直接以 root 登录,却能从普通用户切换到 root 用户下才能进行操作系统管理需要的工作,这就涉
及到超级权限管理的问题;
获取超级权限的过程,就是切换普通用户身份到超级用户身份的过程;这个过程主要是通过 su 和 sudo 来解决;
3.3、使用 su 命令临时切换用户身份;
3.3.1、su 的适用条件和威力
su 命令就是切换用户的工具,怎么理解呢?比如我们以普通用户 beinan 登录的,但要添加用户任务,执行 useradd ,beinan
用户没有这个权限,而这个权限恰恰由 root 所拥有。解决办法无法有两个,一是退出 beinan 用户,重新以 root 用户登录,
但这种办法并不是最好的;二是我们没有必要退出 beinan 用户,可以用 su 来切换到 root 下进行添加用户的工作,等任务完
成后再退出 root。我们可以看到当然通过 su 切换是一种比较好的办法;
通过 su 可以在用户之间切换,如果超级权限用户 root 向普通或虚拟用户切换不需要密码,什么是权力?这就是!而普通用户
切换到其它任何用户都需要密码验证;
3.3.2、su 的用法:
su [OPTION 选项参数] [用户]
-, -l, --login 登录并改变到所切换的用户环境;-c, --commmand=COMMAND 执行一个命令,然后退出所切换到的用户环境;
至于更详细的,请参看 man su ;
3.3.3、su 的范例:
su 在不加任何参数,默认为切换到 root 用户,但没有转到 root 用户家目录下,也就是说这时虽然是切换为 root 用户了,但
并没有改变 root 登录环境;用户默认的登录环境,可以在/etc/passwd 中查得到,包括家目录,SHELL 定义等;
[beinan@localhost ~]$ su
Password:
[root@localhost beinan]# pwd
/home/beinan
su 加参数 - ,表示默认切换到 root 用户,并且改变到 root 用户的环境;
[beinan@localhost ~]$ pwd
/home/beinan
[beinan@localhost ~]$ su -
Password:
[root@localhost ~]# pwd
/root
su 参数 - 用户名
[beinan@localhost ~]$ su - root 注:这个和 su - 是一样的功能;
Password:
[root@localhost ~]# pwd
/root
[beinan@localhost ~]$ su - linuxsir 注:这是切换到 linuxsir 用户
Password: 注:在这里输入密码;
[linuxsir@localhost ~]$ pwd 注:查看用户当前所处的位置;
/home/linuxsir
[linuxsir@localhost ~]$ id 注:查看用户的 UID 和 GID 信息,主要是看是否切换过来了;
uid=505(linuxsir) gid=502(linuxsir) groups=0(root),500(beinan),502(linuxsir)
[linuxsir@localhost ~]$
[beinan@localhost ~]$ su - -c ls 注:这是 su 的参数组合,表示切换到 root 用户,并且改变到 root 环境,然后列出
root 家目录的文件,然后退出 root 用户;
Password: 注:在这里输入 root 的密码;
anaconda-ks.cfg Desktop install.log install.log.syslog testgroup testgroupbeinan testgrouproot
[beinan@localhost ~]$ pwd 注:查看当前用户所处的位置;
/home/beinan
[beinan@localhost ~]$ id 注:查看当前用户信息;
uid=500(beinan) gid=500(beinan) groups=500(beinan)
3.3.4、su 的优缺点;
su 的确为管理带来方便,通过切换到 root 下,能完成所有系统管理工具,只要把 root 的密码交给任何一个普通用户,他都
能切换到 root 来完成所有的系统管理工作;
但通过 su 切换到 root 后,也有不安全因素;比如系统有 10 个用户,而且都参与管理。如果这 10 个用户都涉及到超级权限
的运用,做为管理员如果想让其它用户通过 su 来切换到超级权限的 root,必须把 root 权限密码都告诉这 10 个用户;如果这10 个用户都有 root 权限,通过 root 权限可以做任何事,这在一定程度上就对系统的安全造成了威协;想想 Windows 吧,简
直就是恶梦;
“没有不安全的系统,只有不安全的人”,我们绝对不能保证这 10 个用户都能按正常操作流程来管理系统,其中任何一人对系
统操作的重大失误,都可能导致系统崩溃或数据损失;
所以 su 工具在多人参与的系统管理中,并不是最好的选择,su 只适用于一两个人参与管理的系统,毕竟 su 并不能让普通用
户受限的使用;
超级用户 root 密码应该掌握在少数用户手中,这绝对是真理!所以集权而治的存在还是有一定道理的;
3.4、sudo 授权许可使用的su,也是受限制的su
3.4.1. sudo 的适用条件;
由于 su 对切换到超级权限用户 root 后,权限的无限制性,所以 su 并不能担任多个管理员所管理的系统。如果用 su 来切换
到超级用户来管理系统,也不能明确哪些工作是由哪个管理员进行的操作。特别是对于服务器的管理有多人参与管理时,最
好是针对每个管理员的技术特长和管理范围,并且有针对性的下放给权限,并且约定其使用哪些工具来完成与其相关的工作,
这时我们就有必要用到 sudo。
通过 sudo,我们能把某些超级权限有针对性的下放,并且不需要普通用户知道 root 密码,所以 sudo 相对于权限无限制性的
su 来说,还是比较安全的,所以 sudo 也能被称为受限制的 su ;另外 sudo 是需要授权许可的,所以也被称为授权许可的
su;
sudo 执行命令的流程是当前用户切换到 root(或其它指定切换到的用户),然后以 root(或其它指定的切换到的用户)身份
执行命令,执行完成后,直接退回到当前用户;而这些的前提是要通过 sudo 的配置文件/etc/sudoers 来进行授权;
3.4.2、从编写 sudo 配置文件/etc/sudoers 开始;
sudo 的配置文件是/etc/sudoers ,我们可以用他的专用编辑工具 visodu ,此工具的好处是在添加规则不太准确时,保存退
出时会提示给我们错误信息;配置好后,可以用切换到您授权的用户下,通过 sudo -l 来查看哪些命令是可以执行或禁止的;
/etc/sudoers 文件中每行算一个规则,前面带有#号可以当作是说明的内容,并不执行;如果规则很长,一行列不下时,可以
用号来续行,这样看来一个规则也可以拥有多个行;
/etc/sudoers 的规则可分为两类;一类是别名定义,另一类是授权规则;别名定义并不是必须的,但授权规则是必须的;
3.4.3、/etc/sudoers 配置文件中别名规则
别名规则定义格式如下:
Alias_Type NAME = item1, item2, ...
或
Alias_Type NAME = item1, item2, item3 : NAME = item4, item5
别名类型(Alias_Type):别名类型包括如下四种
Host_Alias 定义主机别名;
User_Alias 用户别名,别名成员可以是用户,用户组(前面要加%号)
Runas_Alias 用来定义 runas 别名,这个别名指定的是“目的用户”,即 sudo 允许切换至的用户;
Cmnd_Alias 定义命令别名;
NAME 就是别名了,NMAE 的命名是包含大写字母、下划线以及数字,但必须以一个大写字母开头,比如 SYNADM、SYN_ADM
或 SYNAD0 是合法的,sYNAMDA 或 1SYNAD 是不合法的;item 按中文翻译是项目,在这里我们可以译成成员,如果一个别名下有多个成员,成员与成员之间,通过半角,号分隔;成员
在必须是有效并事实存在的。什么是有效的呢?比如主机名,可以通过 w 查看用户的主机名(或 ip 地址),如果您只是本地
机操作,只通过 hostname 命令就能查看;用户名当然是在系统中存在的,在/etc/paswd 中必须存在;对于定义命令别名,
成员也必须在系统中事实存在的文件名(需要绝对路径);
item 成员受别名类型 Host_Alias、User_Alias、Runas_Alias、Cmnd_Alias 制约,定义什么类型的别名,就要有什么类型的
成员相配。我们用 Host_Alias 定义主机别名时,成员必须是与主机相关相关联,比如是主机名(包括远程登录的主机名)、
ip 地址(单个或整段)、掩码等;当用户登录时,可以通过 w 命令来查看登录用户主机信息;用 User_Alias 和 Runas_Alias
定义时,必须要用系统用户做为成员;用 Cmnd_Alias 定义执行命令的别名时,必须是系统存在的文件,文件名可以用通配
符表示,配置 Cmnd_Alias 时命令需要绝对路径;
其中 Runas_Alias 和 User_Alias 有点相似,但与 User_Alias 绝对不是同一个概念,Runas_Alias 定义的是某个系统用户
可以 sudo 切换身份到 Runas_Alias 下的成员;我们在授权规则中以实例进行解说;
别名规则是每行算一个规则,如果一个别名规则一行容不下时,可以通过来续行;同一类型别名的定义,一次也可以定义几
个别名,他们中间用:号分隔,
Host_Alias HT01=localhost,st05,st04,10,0,0,4,255.255.255.0,192.168.1.0/24 注:定义主机别名 HT01,通过=号列
出成员
Host_Alias HT02=st09,st10 注:主机别名 HT02,有两个成员;
Host_Alias HT01=localhost,st05,st04,10,0,0,4,255.255.255.0,192.168.1.0/24:HT02=st09,st10 注:上面的两条对
主机的定义,可以通过一条来实现,别名之间用:号分割;
注:我们通过 Host_Alias 定义主机别名时,项目可以是主机名、可以是单个 ip(整段 ip 地址也可以),也可以是网络掩码;
如果是主机名,必须是多台机器的网络中,而且这些机器得能通过主机名相互通信访问才有效。那什么才算是通过主机名相
互通信或访问呢?比如 ping 主机名,或通过远程访问主机名来访问。在我们局域网中,如果让计算机通过主机名访问通信,
必须设置/etc/hosts,/etc/resolv.conf ,还要有 DNS 做解析,否则相互之间无法通过主机名访问;在设置主机别名时,如果
项目是中某个项目是主机名的话,可以通过 hostname 命令来查看本地主机的主机名,通过 w 命令查来看登录主机是来源,
通过来源来确认其它客户机的主机名或 ip 地址;对于主机别名的定义,看上去有点复杂,其实是很简单。
如果您不明白 Host_Alias 是怎么回事,也可以不用设置主机别名,在定义授权规则时通过 ALL 来匹配所有可能出现的主机情
况。如果您把主机方面的知识弄的更明白,的确需要多多学习。
User_Alias SYSAD=beinan,linuxsir,bnnnb,lanhaitun 注:定义用户别名,下有四个成员;要在系统中确实在存在的;
User_Alias NETAD=beinan,bnnb 注:定义用户别名 NETAD ,我想让这个别名下的用户来管理网络,所以取了 NETAD 的
别名;
User_Alias WEBMASTER=linuxsir 注:定义用户别名 WEBMASTER,我想用这个别名下的用户来管理网站;
User_Alias SYSAD=beinan,linuxsir,bnnnb,lanhaitun:NETAD=beinan,bnnb:WEBMASTER=linuxsir 注:上面三行的别名
定义,可以通过这一行来实现,请看前面的说明,是不是符合?
Cmnd_Alias USERMAG=/usr/sbin/adduser,/usr/sbin/userdel,/usr/bin/passwd [A-Za-z]*,/bin/chown,/bin/chmod
注意:命令别名下的成员必须是文件或目录的绝对路径;
Cmnd_Alias DISKMAG=/sbin/fdisk,/sbin/parted
Cmnd_Alias NETMAG=/sbin/ifconfig,/etc/init.d/network
Cmnd_Alias KILL = /usr/bin/kill
Cmnd_Alias PWMAG = /usr/sbin/reboot,/usr/sbin/halt
Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh,
/usr/local/bin/tcsh, /usr/bin/rsh,
/usr/local/bin/zsh
注:这行定义命令别名有点长,可以通过 号断行;Cmnd_Alias SU = /usr/bin/su,/bin,/sbin,/usr/sbin,/usr/bin
在上面的例子中,有 KILL 和 PWMAG 的命令别名定义,我们可以合并为一行来写,也就是等价行;
Cmnd_Alias KILL = /usr/bin/kill:PWMAG = /usr/sbin/reboot,/usr/sbin/halt 注:这一行就代表了 KILL 和 PWMAG
命令别名,把 KILL 和 PWMAG 的别名定义合并在一行写也是可以的;
Runas_Alias OP = root, operator
Runas_Alias DBADM=mysql:OP = root, operator 注:这行是上面两行的等价行;至于怎么理解 Runas_Alias ,我们必须
得通过授权规则的实例来理解;
3.4.4、/etc/sudoers 中的授权规则:
授权规则是分配权限的执行规则,我们前面所讲到的定义别名主要是为了更方便的授权引用别名;如果系统中只有几个用户,
其实下放权限比较有限的话,可以不用定义别名,而是针对系统用户直接直接授权,所以在授权规则中别名并不是必须的;
授权规则并不是无章可寻,我们只说基础一点的,比较简单的写法,如果您想详细了解授权规则写法的,请参看 man sudoers
授权用户 主机=命令动作
这三个要素缺一不可,但在动作之前也可以指定切换到特定用户下,在这里指定切换的用户要用( )号括起来,如果不需要密
码直接运行命令的,应该加 NOPASSWD:参数,但这些可以省略;举例说明;
实例一:
beinan ALL=/bin/chown,/bin/chmod
如果我们在/etc/sudoers 中添加这一行,表示 beinan 可以在任何可能出现的主机名的系统中,可以切换到 root 用户下执行
/bin/chown 和/bin/chmod 命令,通过 sudo -l 来查看 beinan 在这台主机上允许和禁止运行的命令;
值得注意的是,在这里省略了指定切换到哪个用户下执行/bin/shown 和/bin/chmod 命令;在省略的情况下默认为是切换到 root
用户下执行;同时也省略了是不是需要 beinan 用户输入验证密码,如果省略了,默认为是需要验证密码。
为了更详细的说明这些,我们可以构造一个更复杂一点的公式;
授权用户 主机=[(切换到哪些用户或用户组)] [是否需要密码验证] 命令 1,[(切换到哪些用户或用户组)] [是否需要密码验证]
[命令 2],[(切换到哪些用户或用户组)] [是否需要密码验证] [命令 3]......
注解:
凡是[ ]中的内容,是可以省略;命令与命令之间用,号分隔;通过本文的例子,可以对照着看哪些是省略了,哪些地方需要有
空格;
在[(切换到哪些用户或用户组)] ,如果省略,则默认为 root 用户;如果是 ALL ,则代表能切换到所有用户;注意要切换到的
目的用户必须用()号括起来,比如(ALL)、(beinan)
实例二:
beinan ALL=(root) /bin/chown, /bin/chmod
如果我们把第一个实例中的那行去掉,换成这行;表示的是 beinan 可以在任何可能出现的主机名的主机中,可以切换到 root
下执行 /bin/chown ,可以切换到任何用户招执行/bin/chmod 命令,通过 sudo -l 来查看 beinan 在这台主机上允许和禁止运
行的命令;
实例三:
beinan ALL=(root) NOPASSWD: /bin/chown,/bin/chmod 如果换成这个例子呢?表示的是 beinan 可以在任何可能出现的主机名的主机中,可以切换到 root 下执行 /bin/chown ,不需
要输入 beinan 用户的密码;并且可以切换到任何用户下执行/bin/chmod 命令,但执行 chmod 时需要 beinan 输入自己的密
码;通过 sudo -l 来查看 beinan 在这台主机上允许和禁止运行的命令;
关于一个命令动作是不是需要密码,我们可以发现在系统在默认的情况下是需要用户密码的,除非特加指出不需要用户需要
输入自己密码,所以要在执行动作之前加入 NOPASSWD: 参数;
有可能有的弟兄对系统管理的命令不太懂,不知道其用法,这样就影响了他对 sudoers 定义的理解,下面我们再举一个最简
单,最有说服务力的例子;
实例四:
比如我们想用 beinan 普通用户通过 more /etc/shadow 文件的内容时,可能会出现下面的情况;
[beinan@localhost ~]$ more /etc/shadow
/etc/shadow: 权限不够
这时我们可以用 sudo more /etc/shadow 来读取文件的内容;就就需要在/etc/soduers 中给 beinan 授权;
于是我们就可以先 su 到 root 用户下通过 visudo 来改/etc/sudoers ;(比如我们是以 beinan 用户登录系统的)
[beinan@localhost ~]$ su
Password: 注:在这里输入 root 密码
下面运行 visodu;
[root@localhost beinan]# visudo 注:运行 visudo 来改 /etc/sudoers
加入如下一行,退出保存;退出保存,在这里要会用 vi,visudo 也是用的 vi 编辑器;至于 vi 的用法不多说了;
beinan ALL=/bin/more 表示 beinan 可以切换到 root 下执行 more 来查看文件;
退回到 beinan 用户下,用 exit 命令;
[root@localhost beinan]# exit
exit
[beinan@localhost ~]$
查看 beinan 的通过 sudo 能执行哪些命令?
[beinan@localhost ~]$ sudo -l
Password: 注:在这里输入 beinan 用户的密码
User beinan may run the following commands on this host: 注:在这里清晰的说明在本台主机上,beinan 用户可以以
root 权限运行 more ;在 root 权限下的 more ,可以查看任何文本文件的内容的;
(root) /bin/more
最后,我们看看是不是 beinan 用户有能力看到/etc/shadow 文件的内容;
[beinan@localhost ~]$ sudo more /etc/shadow
beinan 不但能看到 /etc/shadow 文件的内容,还能看到只有 root 权限下才能看到的其它文件的内容,比如;
[beinan@localhost ~]$ sudo more /etc/gshadow
对于 beinan 用户查看和读取所有系统文件中,我只想把/etc/shadow 的内容可以让他查看;可以加入下面的一行;
beinan ALL=/bin/more /etc/shadow
题外话:有的弟兄会说,我通过 su 切换到 root 用户就能看到所有想看的内容了,哈哈,对啊。但咱们现在不是在讲述 sudo
的用法吗?如果主机上有多个用户并且不知道 root 用户的密码,但又想查看某些他们看不到的文件,这时就需要管理员授权
了;这就是 sudo 的好处;
实例五:练习用户组在/etc/sudoers 中写法;如果用户组出现在/etc/sudoers 中,前面要加%号,比如%beinan ,中间不能有空格;
%beinan ALL=/usr/sbin/*,/sbin/*
如果我们在 /etc/sudoers 中加上如上一行,表示 beinan 用户组下的所有成员,在所有可能的出现的主机名下,都能切换到
root 用户下运行 /usr/sbin 和/sbin 目录下的所有命令;
实例六:练习取消某类程序的执行;
取消程序某类程序的执行,要在命令动作前面加上!号; 在本例中也出现了通配符的*的用法;
beinan ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk 注:把这行规则加入到/etc/sudoers 中;但您得有 beinan 这个用
户组,并且 beinan 也是这个组中的才行;
本规则表示 beinan 用户在所有可能存在的主机名的主机上运行/usr/sbin 和/sbin 下所有的程序,但 fdisk 程序除外;
[beinan@localhost ~]$ sudo -l
Password: 注:在这里输入 beinan 用户的密码;
User beinan may run the following commands on this host:
(root) /usr/sbin/*
(root) /sbin/*
(root) !/sbin/fdisk
[beinan@localhost ~]$ sudo /sbin/fdisk -l
Sorry, user beinan is not allowed to execute '/sbin/fdisk -l' as root on localhost.
注:不能切换到 root 用户下运行 fdisk 程序;
实例七:别名的运用的实践;
假如我们就一台主机 localhost,能通过 hostname 来查看,我们在这里就不定义主机别名了,用 ALL 来匹配所有可能出现的
主机名;并且有 beinan、linuxsir、lanhaitun 用户;主要是通过小例子能更好理解;sudo 虽然简单好用,但能把说的明白的
确是件难事;最好的办法是多看例子和 man soduers ;
User_Alias SYSADER=beinan,linuxsir,%beinan
User_Alias DISKADER=lanhaitun
Runas_Alias OP=root
Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd
root
Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk 注:定义命令别名 DSKCMD,下有成员 parted 和 fdisk ;
SYSADER ALL= SYDCMD,DSKCMD
DISKADER ALL=(OP) DSKCMD
注解:
第一行:定义用户别名 SYSADER 下有成员 beinan、linuxsir 和 beinan 用户组下的成员,用户组前面必须加%号;
第二行:定义用户别名 DISKADER ,成员有 lanhaitun
第三行:定义 Runas 用户,也就是目标用户的别名为 OP,下有成员 root
第四行:定义 SYSCMD 命令别名,成员之间用,号分隔,最后的!/usr/bin/passwd root 表示不能通过 passwd 来更改 root 密
码;第五行:定义命令别名 DSKCMD,下有成员 parted 和 fdisk ;
第六行: 表示授权 SYSADER 下的所有成员,在所有可能存在的主机名的主机下运行或禁止 SYDCMD 和 DSKCMD 下定义
的命令。更为明确遥说,beinan、linuxsir 和 beinan 用户组下的成员能以 root 身份运行 chown 、chmod 、adduser、passwd,
但不能更改 root 的密码;也可以以 root 身份运行 parted 和 fdisk ,本条规则的等价规则是;
beinan,linuxsir,%beinan ALL=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd
[A-Za-z]*,!/usr/bin/passwd root,/sbin/parted,/sbin/fdisk
第七行:表示授权 DISKADER 下的所有成员,能以 OP 的身份,来运行 DSKCMD ,不需要密码;更为明确的说 lanhaitun
能以 root 身份运行 parted 和 fdisk 命令;其等价规则是:
lanhaitun ALL=(root) /sbin/parted,/sbin/fdisk
可能有的弟兄会说我想不输入用户的密码就能切换到root并运行SYDCMD和DSKCMD 下的命令,那应该把把NOPASSWD:
加在哪里为好?理解下面的例子吧,能明白的;
SYSADER ALL= NOPASSWD: SYDCMD, NOPASSWD: DSKCMD
3.4.5、/etc/sudoers 中其它的未尽事项;
在授权规则中,还有 NOEXEC:和 EXEC 的用法,自己查 man sudoers 了解;还有关于在规则中通配符的用法,也是需要了
解的。这些内容不多说了,毕竟只是一个入门性的文档。soduers 配置文件要多简单就有多简单,要多难就有多难,就看自己
的应用了。
3.4.6、sudo 的用法;
我们在前面讲的/etc/sudoers 的规则写法,最终的目的是让用户通过 sudo 读取配置文件中的规则来实现匹配和授权,以便替
换身份来进行命令操作,进而完成在其权限下不可完成的任务;
我们只说最简单的用法;更为详细的请参考 man sudo
sudo [参数选项] 命令
-l 列出用户在主机上可用的和被禁止的命令;一般配置好/etc/sudoers 后,要用这个命令来查看和测试是不是配置正确的;
-v 验证用户的时间戳;如果用户运行 sudo 后,输入用户的密码后,在短时间内可以不用输入口令来直接进行 sudo 操作;
用-v 可以跟踪最新的时间戳;
-u 指定以以某个用户执行特定操作;
-k 删除时间戳,下一个 sudo 命令要求用求提供密码;
举列:
首先我们通过 visudo 来改/etc/sudoers 文件,加入下面一行;
beinan,linuxsir,%beinan ALL=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd
[A-Za-z]*,!/usr/bin/passwd root,/sbin/parted,/sbin/fdisk
然后列出 beinan 用户在主机上通过 sudo 可以切换用户所能用的命令或被禁止用的命令;
[beinan@localhost ~]$ sudo -l 注:列出用户在主机上能通过切换用户的可用的或被禁止的命令;
Password: 注:在这里输入您的用户密码;
User beinan may run the following commands on this host:
(root) /bin/chown 注:可以切换到 root 下用 chown 命令;
(root) /bin/chmod 注:可以切换到 root 下用 chmod 命令;
(root) /usr/sbin/adduser 注:可以切换到 root 下用 adduser 命令;
(root) /usr/bin/passwd [A-Za-z]* 注:可以切换到 root 下用 passwd 命令;(root) !/usr/bin/passwd root 注:可以切换到 root 下,但不能执行 passwd root 来更改 root 密码;
(root) /sbin/parted 注:可以切换到 root 下执行 parted ;
(root) /sbin/fdisk 注:可以切换到 root 下执行 fdisk ;
通过上面的 sudo -l 列出可用命令后,我想通过 chown 命令来改变/opt 目录的属主为 beinan ;
[beinan@localhost ~]$ ls -ld /opt 注:查看/opt 的属主;
drwxr-xr-x 26 root root 4096 10 月 27 10:09 /opt 注:得到的答案是归属 root 用户和 root 用户组;
[beinan@localhost ~]$ sudo chown beinan:beinan /opt 注:通过 chown 来改变属主为 beinan 用户和 beinan 用户组;
[beinan@localhost ~]$ ls -ld /opt 注:查看/opt 属主是不是已经改变了;
drwxr-xr-x 26 beinan beinan 4096 10 月 27 10:09 /opt
我们通过上面的例子发现 beinan 用户能切换到 root 后执行改变用户口令的 passwd 命令;但上面的 sudo -l 输出又明文写着
不能更改 root 的口令;也就是说除了 root 的口令,beinan 用户不能更改外,其它用户的口令都能更改。下面我们来测试;
对于一个普通用户来说,除了更改自身的口令以外,他不能更改其它用户的口令。但如果换到 root 身份执行命令,则可以更
改其它用户的口令;
比如在系统中有 linuxsir 这个用户, 我们想尝试更改这个用户的口令,
[beinan@localhost ~]$ passwd linuxsir 注:不通过 sudo 直接运行 passwd 来更改 linuxsir 用户的口令;
passwd: Only root can specify a user name. 注:失败,提示仅能通过 root 来更改;
[beinan@localhost ~]$ sudo passwd linuxsir 注:我们通过/etc/sudoers 的定义,让 beinan 切换到 root 下执行 passwd
命令来改变 linuxsir 的口令;
Changing password for user linuxsir.
New UNIX password: 注:输入新口令;
Retype new UNIX password: 注:再输入一次;
passwd: all authentication tokens updated successfully. 注:改变成功;
后记:
本文是用户管理的文档的重要组成部份,我计划在明天开始写用户管理控制工具,比如 useradd、userdel、usermod ,也就
是管理用户的工具介绍;当然我还会写用户查询工具等与用户管理相关的
4、权限命令
4.1、chmod
文件或者目录的用户能够使用 chmod 命令修改文件的权限。Chmod 命令有两种方式:一种是字符方
式,使用字符来修改文件的权限;另外一种是数字方式,使用 3 个数字的组合来修改文件的权限。
使用方式 : chmod [-cfvR] [--help] [--version] mode file...
说明 : Linux/Unix 的档案调用权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以借以控制档
案如何被他人所调用。
参数 :
mode : 权限设定字串,格式如下 : [ugoa...][[+-=][rwxX]...][,...],其中
u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表
示这三者皆是。
+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定
过为可执行。
-c : 若该档案权限确实已经更改,才显示其更改动作-f : 若该档案权限无法被更改也不要显示错误讯息
-v : 显示权限变更的详细资料
-R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)
--help : 显示辅助说明
--version : 显示版本
范例 :
将档案 file1.txt 设为所有人皆可读取 : chmod ugo+r file1.txt
将档案 file1.txt 设为所有人皆可读取 : chmod a+r file1.txt
将档案 file1.txt 与 file2.txt 设为该档案拥有者,与其所属同一个群体者可写入,但其他以外的人则不
可写入 : chmod ug+w,o-w file1.txt file2.txt
将 ex1.py 设定为只有该档案拥有者可以执行 : chmod u+x ex1.py
将目前目录下的所有档案与子目录皆设为任何人可读取 : chmod -R a+r *
数字方式的基本语法是:chmod nnn 文件
其中第 1、2、3 个 n 分别表示用户、组成员和所有其它用户。各个位置上的 n 要么是一个 0,或者是一
个由赋予权限的相关值相加得到的单个阿拉伯数字之和。这些数字的意义如表 1 所示。
值 表示的意义
4 表示文件或者目录的读权限
2 表示文件或者目录的写权限
1 表示文件或者目录的执行权限
很显然,当使用数字方式时,这 3 个数字必须为 0 至 7 中的一个。
若要 rwx 属性则 4+2+1=7;
若要 rw-属性则 4+2=6;
若要 r-x 属性则 4+1=7。
范例:
chmod a=rwx file 和 chmod 777 file 效果相同
chmod ug=rwx,o=x file 和 chmod 771 file 效果相同
若用 chmod 4755 filename 可使此程序具有 root 的权限
4.2、umask
很显然,系统中各种文件的权限设置对特定用户的数据安全有很大影响。但是要求用户逐一明确设
置系统中每个文件的权限也是不现实的,为此,需要使用 umask 命令,该命令可以为用户账号中新文
件的创建进行缺省设置。系统管理员必须要为你设置一个合理的 u m a s k 值,以确保你创建的文件具有
所希望的缺省权限,防止其他非同组用户对你的文件具有写权限。具体来说,umask 是用来设置权限掩
码的,权限掩码由 3 个数字组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时默认的权限。
语 法:umask [-S][权限掩码]
补充说明:umask 可用来设定[权限掩码]。[权限掩码]是由 3 个八进制的数字所组成,将现有的存
取权限减掉权限掩码后,即可产生建立文件时预设的权限。
参 数:
-S 以文字的方式来表示权限掩码。
登录之后,可以按照个人的偏好使用 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 文件中。
如何计算 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 值,可以为新创建的文
件和目录设置缺省权限。
例如,对于 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) 这就是文件创建缺省权限
系统默认的 umask 码是 0022 也就是:目录 755(rwx,rx,rx) ,文件:644(rw,r,r) 。
umask 码的换算
0022 + 0755 = 0777 对应默认目录权限 反之 0777 - 0755 = 0022
0022 + 0644 +0111 = 0777 对应默认文件权限 反之 0777 - 0111 - 0644 = 0022
哈哈~~ 简单吧!假如我们要将默认目录权限设置为 744 那么对应的 umask 是 0777 - 0744 =
0033 ,然后执行 umask 0033 命令就将 umask 码改成 0033 了。
下面是另外一个例子,假设这次 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) 这就是文件创建缺省权限
下面是常用的 u m a s k 值及对应的文件和目录权限
umask 值目录文件
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 命令:如果想要改变 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!除非你有特殊需要,否则没有必要去管
他,系统默认的值“022”umask 是用的掩码,至于掩码的概念,从基础学吧,这里不说了。linux 中的文件/目录许可是用 4 位八进制数表示的。其中第一个八进制数用来表示特殊许可设置,
第二个数字用来设置文件所有者的许可,第三个数字用来设置组许可,第四个数字用来设置所有人的许
可。
例如,root 的权限为 777,若权限掩码设为 022,那么两都相减后可得 755。下面是在我的系统更
改 umask 的一些情况:
[root@linuxserver root]# umask
022
上述命令显示表示我的系统的 umask 值为 022。
[root@linuxserver root]# umask -S
u=rwx,g=rx,o=rx
当 umask 值为 022 时,默认情况下各用户的权限。注意这里的参数“S”是大写。
[root@linuxserver root]# umask 177
[root@linuxserver root]# umask -S
u=rw,g=,o=
上述两行命令把 umask 值改为 177,结果只有文件所有者具有读写文件的权限,其它用户不能访问
该文件。这显然是一种非常安全的状态。
4.3、chown
chown 命令用途更改与文件关联的所有者或组。
语法 chown[ -f ] [ -h] [ -R ] Owner [ :Group ] { File ... | Directory ... }
描述 chown 命令将 File 参数指定的文件的所有者更改为 Owner 参数指定的用户。Owner 参数的值可
以是可在 /etc/passwd 文件中找到的用户标识或登录名。还可以选择性地指定组。Group 参数的值可以是可
在 /etc/group 文件中找到的组标识或组名。
只有 root 用户可以更改文件的所有者。只在您是 root 用户或拥有该文件的情况下才可以更改文件的
组。如果拥有文件但不是 root 用户,则只可以将组更改为您是其成员的组。
虽然 -H、-L 和 -P 标志是互斥的,指定不止一个也不认为是错误。指定的最后一个标志确定命令拟稿
将演示的操作。
参数:
-f 禁止除用法消息之外的所有错误消息。
-h 更改遇到的符号链接的所有权,而非符号链接指向的文件或目录的所有权。 当遇到符号链接而您未
指定 -h 标志时,chown 命令更改链接指向的文件或目录的所有权,而非链接本身的所有权。如果指定
-R 标志,chown 命令递归地降序指定的目录。-H 如果指定了 -R 选项,并且引用类型目录的文件的符
号链接在命令行上指定,chown 变量会更改由符号引用的目录的用户标识(和组标识,如果已指定)
和所有在该目录下的文件层次结构中的所有文件。
-L 如果指定了 -R 选项,并且引用类型目录的文件的符号在命令行上指定或在遍历文件层次结构期间遇
到,chown 命令会更改由符号链接引用的目录的用户标识(和组标识,如果已指定)和在该目录之下
的文件层次结构中的所有文件。
-P 如果指定了 -R 选项并且符号链接在命令行上指定或者在遍历文件层次结构期间遇到,则如果系统
支持该操作,则 chown 命令会更改符号链接的所有者标识(和组标识,如果已指定)。chown 命令不
会执行至文件层次结构的任何其它部分的符号链接。
-R 递归地降序目录,更改每个文件的所有权。当遇到符号链接并且链接指向目录时,更改该目录的所
有权,但不进一步遍历目录。不过 -h、-H、-L or -P 标志也未指定,则当遇到符号链接并且该链接指向
到目录时,该目录的组所有权更改但不会进一步遍历目录。 安全性访问控制:此程序应该作为“可信计
算基”中的正常用户程序安装。退出状态该命令返回以下出口值:0 命令执行成功并已执行所有请求的
更改。 >0 发生错误。示例:
要更改文件 program.c 的所有者: chown jim program.cprogram.c 的用户访问权限现在应用到 jim。作
为所有者,jim 可以使用 chmod 命令允许或拒绝其他用户访问 program.c。
要将目录 /tmp/src 中所有文件的所有者和组更改为用户 john 和组 build: chown -R john:build
/tmp/src 文件
将档案 file1.txt 的拥有者设为 users 群体的使用者 jessie :
chown jessie:users file1.txt
将目前目录下的所有档案与子目录的拥有者皆设为 users 群体的使用者 lamport :
chmod -R lamport:users *
4.4、chgrp
功能说明:变更文件或目录的所属群组。
语 法:chgrp [-cfhRv][--help][--version][所属群组][文件或目录...] 或 chgrp [-cfhRv][--help][--reference=<参
考文件或目录>][--version][文件或目录...]
补充说明:在 UNIX 系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理。您可以使用 chgrp 指
令去变更文件与目录的所属群组,设置方式采用群组名称或群组识别码皆可。
参 数:
-c 或--changes 效果类似"-v"参数,但仅回报更改的部分。
-f 或--quiet 或--silent 不显示错误信息。
-h 或--no-dereference 只对符号连接的文件作修改,而不更动其他任何相关文件。
-R 或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理。
-v 或--verbose 显示指令执行过程。
--help 在线帮助。
--reference=<参考文件或目录> 把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相
同。
--version 显示版本信息。
范例:
[root@linux ~]# chgrp users install.log
[root@linux ~]#ls –l
-rw-r--r-- 1 root users 28490 Jun 25 08:53 install.log
[root@linux ~]#chgrp testing install.log
chgrp:invalid group name ‘testing’ <==出现错误信息~找不到这个用户组名~
发现了吗?文件的用户组被改成了 users 了,但要改成 testing 的时候,就会发生错误。注意,出现错误信
息后,要检查错误信息的内容。