linux文件所有权转移,管理Linux文件权限和所有权 (1)

为了最有效地利用本系列中的文章,您应该具有基本的 Linux 知识,并需要准备一个 Linux 系统,用于练习本文介绍的命令。有时候不同版本的程序输出格式不同,因此您所得到的结果未必总是与这里所示的清单和图相同。

用户和组

现在,您了解了 Linux 是一个多用户的系统,每个用户属于一个主要 组,也可能是附加组。也可以作为一个用户登录,然后使用 su 或者 sudo -s 命令变为另一个用户。Linux 的文件所有权和访问授权是与用户 id 和组密切相关的,所以我们要复习一下基本的用户和组信息。

我是谁?

如果没有切换到其他用户,您的 id 就是登录时的。如果切换到其他用户,在本文的大多数例子中,您的提示中就会包括您的用户 id。如果您的提示没有包括用户 id,可以使用 whoami 命令来检查您当前有效的 id。清单 1 显示了一些例子,说明了提示字符串(来自 PS1 环境变量)与本文中的其他例子不同。在提示字符串中包含您的 id 是一个有用的功能。

清单 1. 决定有效的用户 id

/home/ian$ whoami

tom

/home/ian$ exit

exit

$ whoami

ian

我在什么组中?

类似的,您可以使用 groups 命令找出您在什么组中。使用 id 命令,您可以找出用户和组信息。添加一个用户 id 参数到 groups 或者 id 来查看该用户 id 的信息,而并非当前用户 id。查看 清单 2 中的示例。请注意,没有用户 id,id 命令也会显示 SELinux 上下文和基本 id 信息。

清单 2. 决策组成员

[ian@echidna ~]$ id

uid=1000(ian) gid=1000(ian) groups=1000(ian),505(development),8093(editor)

context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

[ian@echidna ~]$ id ian

uid=1000(ian) gid=1000(ian) groups=1000(ian),8093(editor),505(development)

[ian@echidna ~]$ groups

ian development editor

[ian@echidna ~]$ id tom

uid=1012(tom) gid=1012(tom) groups=1012(tom),505(development)

[ian@echidna ~]$ groups tom

tom : tom development

[ian@echidna ~]$ su tom

Password:

[tom@echidna ian]$ groups

tom development

[tom@echidna ian]$ groups ian

ian : ian editor development

文件的所有权和权限

如果每个用户都有 id 并且是主要组的成员,那么 Linux 系统上的每个文件都有一个所有者和与其相关的组。

普通文件

使用 ls -l 命令显示所有者和组。

清单 3. 决定文件所有权

[ian@echidna ~]$ ls -l /bin/bash .bashrc helloworld.C

-rw-r--r--. 1 ian  ian            124 Mar 31  2010 .bashrc

-rwxr-xr-x. 1 root root        943360 May 21  2010 /bin/bash

-rw-rw-r--. 1 ian  development    116 Nov 30 10:21 helloworld.C

在这个特殊的例子中,用户 ian 的 .bashrc 文件由他自己所有,并且属于 ian 的主要组。类似的,/bin/bash 由用户 root 所有,并且位于组 root。但是,helloworld.C 由用户 ian 所有,但是属于组 development。用户名和组名来自不同的名称空间,所以给定的名称可能同时是用户名和组名。事实上,很多版本默认为每个新用户创建一个匹配的组。

Linux 权限模型每个文件系统对象有 3 种类型。这些权限就是读(r),写(w)和执行(x)。写权限包括修改和删除对象的能力。此外,这些权限被分别指定给文件所有者、文件组成员和其他人。

回到清单 3 第一列,注意,它包括一个 11 个字符的字符串。这第 11 个字符是最近才添加的。我们稍后再讨论。第一个字母描述了对象的类型(- 在这个例子中表示普通文件),剩下的 9 个字母每三个字母为一组。第一组表示文件所有者的读、写和执行权限。- 表示相应的权限没有被授予。因此,用户 ian 就可以读和写 .bashrc 文件,但是不能执行它;而 root 可以读、写 和 执行 /bin/bash 文件。第二组表示文件组的读、写和执行权限。development 组的成员能够读或者写 ian 的 helloworld.C 文件,而其他人只能读。类似的,root 组中的成员和其他人能够读或者执行 /bin/bash 文件。

目录

目录和常规文件一样使用相同的权限标识,但是它们的翻译不同。目录的读权限允许用户使用该权限列出目录内容。写权限意味着用户使用该权限能够在目录中创建或者删除文件。执行权限允许用户输入目录并访问任意子目录。没有执行权限,目录下的文件系统对象就是不可访问的。没有读权限,目录下的文件系统对象在目录清单下就是不可见的,但是如果知道磁盘上对象的完整路径,这些对象仍是可访问的。清单 4 是说明这些问题的非常人工的例子。

清单 4. 权限和目录

[ian@echidna ~]$ ls -l /home

total 32

drwxr-x---. 38 editor   editor      12288 Nov 30 10:49 editor

drwxr-x---.  4 greg     development  4096 Nov 30 12:44 greg

drwx------. 21 gretchen gretchen     4096 Nov 30 11:26 gretchen

drwxr-xr-x. 41 ian      ian          4096 Nov 30 10:51 ian

drwx------. 21 ianadmin ianadmin     4096 May 28  2010 ianadmin

d-wx--x--x. 21 tom      tom          4096 Nov 30 11:30 tom

[ian@echidna ~]$ ls -a ~greg/.ba*

/home/greg/.bash_history  /home/greg/.bash_profile

/home/greg/.bash_logout   /home/greg/.bashrc

[ian@echidna ~]$ ls -a ~gretchen

ls: cannot open directory /home/gretchen: Permission denied

[ian@echidna ~]$ ls -a ~tom

ls: cannot open directory /home/tom: Permission denied

[ian@echidna ~]$ head -n 3 ~tom/.bashrc

# .bashrc

# Source global definitions

长清单的第一个字母表示对象的类型(d 表示目录)。用户 greg 的主目录有 development 组成员的读和写权限,因此用户 tom 和 ian 能够列出目录。用户 gretchen 的主目录没有 gretchen 组或者其他用户的读和执行权限,所以用户 ian 不能访问它。用户 tom 的主目录有执行权限,但是没有读权限,所以用户 ian 不能列出内容,但是如果知道对象存在,就可以访问目录下的对象。

其他文件系统对象

ls -l 的输出可能包含文件系统对象,而不是文件和目录,如清单中第一个字母所示。在后面的文章中我们还会见到更多,但是现在,只是说明可能的对象类型。

表 1. 文件系统对象类型

代码 对象类型

- 常规文件

d 目录

l 符号链接

c 字符特殊设备

b 模块特殊设备

p FIFO

s 套接字

第 11 个字符

来自 ls 命令中长清单的第 11 个字符是最近才出现的,所以部分版本仍只显示头 10 个字符。在其他情况下,第 11 个字符是一个空格,所以您可能没有注意到。这个字符表示是否有替换的访问方法应用到文件。当跟随文件模式位的字符是空格时,就表示没有替换访问方法。当是一个可打印字符时,就有替换方法。这个方法可能是例子的访问控制清单。GNU ls 使用一个 ‘.’(点)来表示文件只有一个 SELinux 安全上下文。有其他替换访问方法的文件用 ‘+’(加号)表示。

变更权限

添加权限

假设您创建一个 “Hello world” 的 shell 脚本。当您第一次创建脚本时,它通常是不可执行的。使用 chmod 命令和 +x 选项添加执行权限,如清单 5 所示。

清单 5. 创建可执行的 shell 脚本

[ian@echidna ~]$ echo 'echo "Hello world!"'>hello.sh

[ian@echidna ~]$ ls -l hello.sh

-rw-rw-r--. 1 ian ian 20 Nov 30 13:05 hello.sh

[ian@echidna ~]$ ./hello.sh

bash: ./hello.sh: Permission denied

[ian@echidna ~]$ chmod +x hello.sh

[ian@echidna ~]$ ./hello.sh

Hello world!

[ian@echidna ~]$ ls -l hello.sh

-rwxrwxr-x. 1 ian ian 20 Nov 30 13:05 hello.sh

您可以按类似的方法使用 +r 来设置读权限,使用 +w 设置写权限。事实上,您可以联合使用 r、w 和 x。例如,使用 chmod +rwx 将会设置文件的所有读、写和执行权限。chmod 会添加尚未设置的权限。

可选性

您在上面的例子中可能已经注意到,执行权限被设置给所有者、组 和 其他。为了更具可选性,您可以给模式描述加前缀 u 来设置用户权限,g 来设置组权限,还有 o 为其他人设置。需要指出的是 a 设置所有用户的权限,这就相当于忽略它。清单 6 显示了如何添加用户和组写和执行权限到 shell 脚本的其他副本。

清单 6. 有选择性地添加权限

[ian@echidna ~]$ echo 'echo "Hello world!"'>hello2.sh

[ian@echidna ~]$ chmod ug+xw hello2.sh

[ian@echidna ~]$ ls -l hello2.sh

-rwxrwxr--. 1 ian ian 20 Nov 30 13:08 hello2.sh

删除权限

有时您需要删除权限,而不单单是添加。简单地将 + 改变为 -,就能删除任何已设置的指定权限。清单 7 显示了如何删除两个 shell 脚本上的其他用户的所有权限。

清单 7. 删除权限

[ian@echidna ~]$ ls -l hello*.sh

-rwxrwxr--. 1 ian ian 20 Nov 30 13:08 hello2.sh

-rwxrwxr-x. 1 ian ian 20 Nov 30 13:05 hello.sh

[ian@echidna ~]$ chmod o-xrw hello*.sh

[ian@echidna ~]$ ls -l hello*.sh

-rwxrwx---. 1 ian ian 20 Nov 30 13:08 hello2.sh

-rwxrwx---. 1 ian ian 20 Nov 30 13:05 hello.sh

请注意,您可以一次改变一个或者多个文件的权限。正如在 topic 103 的文章中看到其他命令一样,您甚至可以使用 -R(或者 --recursive)选项在目录和文件上进行递归操作。

设置权限

现在已经可以添加或者删除权限了,您可能会想,怎样才能只设置一些特殊权限。使用 = 替换 + 或者 - 来完成这个动作。要在上述脚本中设置权限,这样其他用户就没有访问权利,您可以使用 chmod o= hello* 替换我们用于删除权限的命令。

如果您想对用户、组合或其他设置不同的权限,您可以通过逗号分隔不同的表达;例如,ug=rwx,o=rx,或者您可以使用稍后提到的数字权限。

八进制权限

目前为止,您都是使用符号(ugoa 和 rxw)来指定权限。每组中有三个可能的权限。您还可以使用八进制取代符号设置权限。按这种方法设置的权限使用高达 4 位八进制数字。讨论属性时,我们会查看第 1 个数字。第 2 个数字定义了用户权限,第 3 个是组权限,第 4 个是其他权限。这三个数字中的每一个都通过添加所需的权限设置来构建:读(4),写(2)和执行(1)。在 清单 5 中的 hello.sh 例子中,创建的脚本有权限 -rw-r--r--,相当于八进制 644。设置每个人的执行权限将模式改为 755。

当您想要一次设置所有权限,而不给予每个组相同权限时,设置使用数字权限非常方便。使用 表 2 作为一个方便的八进制权限参考。

表 2. 数字权限

符号 八进制

rwx 7

rw- 6

r-x 5

r-- 4

-wx 3

-w- 2

--x 1

--- 0

suid 和 sgid

Linux 权限模型有两个特殊的访问模式,名为 suid(设置用户 id)和 sgid(设置组 id)。当可执行的程序设置为 suid 访问模式,它就会开始运行,好像是由文件所有者启动而不是由真正启动它的用户启动。类似的,设置为 sgid 访问模式,程序就会运行,好像启动用户属于文件组,而不属于他所有的组。可以单独或者同时设置两个访问模式。

清单 8 显示了可执行的 passwd 由 root 所有:

清单 8. /usr/bin/

亿恩科技地址(ADD):郑州市黄河路129号天一大厦608室 邮编(ZIP):450008 传真(FAX):0371-60123888

联系:亿恩小凡

QQ:89317007

电话:0371-63322206

本文出自:亿恩科技【www.enkj.com】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值