我想知道Linux中的进程如何决定它拥有哪些权限?
假设有一个二进制程序Read_File
从文件/home/myname/data.txt
读取并显示它的内容到STD输出,现在Read_File
如何决定它是否有权读取{{ 1}},它检查什么类型的ID来决定权限?
答案 0 :(得分:6)
首先,有点背景知识:
该过程通常由特定用户运行。因此,例如,如果您自己登录并运行程序,它将以与您自己相同的权限运行。您可以使用stat
或ls -l
检查文件的权限。
stat
malbert@dredg:/tmp$ stat foo
File: `foo'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fb00h/64256d Inode: 618 Links: 1
Access: (0644/-rw-r--r--) Uid: (11204/ malbert) Gid: (10513/domain users)
Access: 2011-06-10 13:03:27.181227226 +0200
Modify: 2011-06-10 13:03:27.181227226 +0200
Change: 2011-06-10 13:03:27.181227226 +0200
这里重要的信息是:
Access: (0644/-rw-r--r--) Uid: (11204/ malbert) Gid: (10513/domain users)
这会告诉您所有者( rw-
),群组( r--
)和其他所有人的权限( {{ 1}} 强>)。它还会显示当前所有者ID(r--
)和当前组ID(Uid
)。
缩写代表:
Gid
=读取权限r
=写入权限w
=执行/遍历目录访问x
ls -l
为您提供了快速摘要:
ls -l
在这里,您可以看到与malbert@dredg:/tmp$ ls -l /tmp
total 48
drwx------ 2 malbert domain users 4096 2011-06-10 08:51 akonadi-malbert.zOSngu
-rw-r--r-- 1 malbert domain users 0 2011-06-10 13:03 foo
drwx------ 2 kdm nogroup 4096 2011-06-10 08:51 kde-kdm
drwx------ 3 malbert domain users 4096 2011-06-10 08:51 kde-malbert
[snip]
相同的信息,但作为摘要。此外,uid和gid被解析为名称(在本例中为stat
和malbert
)。您可以使用domain users
将这些视为数字值。
如果您希望以自己的不同用户身份运行应用程序,可以使用ls -u
,su
或您的应用程序本身可以删除特权并更改其运行的用户。这通常是系统守护进程执行操作的方式。
注意扩展属性。使用sudo
列出文件时,这些文件会带有附加的ls -l
符号。例如:
+
请注意以下一行:
malbert@dredg:/tmp$ ls -l
total 48
drwx------ 2 malbert domain users 4096 2011-06-10 08:51 akonadi-malbert.zOSngu
-rw-rwxr--+ 1 malbert domain users 0 2011-06-10 13:03 foo
drwx------ 2 kdm nogroup 4096 2011-06-10 08:51 kde-kdm
drwx------ 3 malbert domain users 4096 2011-06-10 08:51 kde-malbert
[snip]
-rwxr--+ 1 malbert domain users 0 2011-06-10 13:03 foo
中的+
符号指向扩展属性。这些可能是ACL。 SuSE文档中有an excellent document on ACLs。如果需要,去看看吧。解释ACL肯定会爆炸这篇文章,所以我不会讨论这些。
扩展属性也可能与文件系统有关。有关详细信息,请参阅the man page of chattr。
现在,作为旁注:这是StackOverflow。问题应该与发展有关。对于像这样的问题,有http://www.serverfault.com。但是你不知道,这不是一个开发问题,而是与操作系统有关,我觉得我应该回答;)
祝你好运,玩得开心!答案 1 :(得分:2)
这个过程没有做出任何决定;每当它尝试操作时,操作系统都会检查它的EUID并决定是否具有所需的权限。
例如,当它尝试访问文件时,会检查文件的所有者和权限。如果进程的EUID没有足够的操作权限,则该操作将失败(通常使用EPERM
)。