四、
文件权限
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
的时候,就会发生错误。注意,出现错误信
息后,要检查错误信息的内容。