linux下的权限问题

发表于:2007-05-26来源:作者:点击数: 标签:
在 linux 中的权限,是linux中一个比较有趣的问题,你可以使用ll或者ls-l就可以看到。一下是我电脑上的东东。 #ll total69840 -rw-r--r--1rootsys19Jan11970bootconf drwxr-xr-x5rootsys3072Jan81970build drwxrwxrwx5rootsys1024Jan31970dlkm drwxrwxrwx5ro

linux中的权限,是linux中一个比较有趣的问题,你可以使用ll或者ls -l就可以看到。一下是我电脑上的东东。
# ll
total 69840
-rw-r--r--   1 root       sys             19 Jan  1  1970 bootconf
drwxr-xr-x   5 root       sys           3072 Jan  8  1970 build
drwxrwxrwx   5 root       sys           1024 Jan  3  1970 dlkm
drwxrwxrwx   5 root       sys           1024 Jan  3  1970 dlkm.vmunix.prev
-rw-r--r--   1 root       sys           2244 Mar 17 02:22 ioconfig
-r--r--r--   1 root       sys             82 Jan  1  1970 kernrel
drwxr-xr-x   2 root       sys           1024 Mar 17 02:27 krs
drwxr-xr-x   2 root       root          1024 Mar 17 02:22 krs_lkg
drwxr-xr-x   2 root       root          1024 Mar 17 02:27 krs_tmp
drwxr-xr-x   2 root       root         65536 Jan  1  1970 lost+found
-rw-------   1 root       root            12 Mar 17 02:22 rootconf
-rw-r--r--   1 root       sys           1145 Jan  3  1970 system
drwxr-xr-x   2 root       sys           1024 Jan  1  1970 system.d
-rw-r--r--   1 root       sys            992 Jan  3  1970 system.prev
-rwxr-xr-x   1 root       sys        14319984 Jan  3  1970 vmunix
-rwxr-xr-x   1 root       sys        21061664 Jan  3  1970 vmunix.prev


1、umask值:它定义了用户新建文件以及文件夹的所具有的权限。
这同windows里面的权限继承有点相似。
umask的配置/etc/profile
umask的值的算法:这可能是很多linux爱好者比较迷惑的地方。我在这里就贡献一个我的自己总结的一个算法,有不正确的请大家一起来探讨一下。
umask的值+chmod文件的值=666
umask的值+chmod文件夹的值=777

比如你新建了一个文件,myfile,你的umask的值是022那么这个文件具有的权限是多少乃?是644。哈哈,请注意,凡是具有可执行权限的内容都要使用第二个公式。

2、权限位和修改
rwx  rwx  rwx
所有者 所有者所在的组 其他用户
如果用数字表示,r=4,w=2,x=1。r是读的意思,w是写的意思,x是执行。

你可以使用命令来修改权限。一般情况下,这个命令只能有root来执行。请注意。
chmod [参数] [模式] <文件或者目录> /符号标记模式

[参数] -c 只有在文件的权限确认改变才进行详细说明
-f 不输出权限不能改变的文件的错误
-v 详细说明权限的变化
-r 改变目录及其子目录的文件的权限(比较有用)
[模式] [ugoa] [+-=] [rwxXs]
u:文件的所有者
g:所有者所在的组
o:其他的组
a:其他的用户

+:增加
-:去掉
=:指定文件的权限

r:是读的意思
w:是写的意思
x:是执行
X:只有目标文件对某些用户是可执行的火灾该目标文件是目录是才追加X属性。
t:T位,拒绝删除的权限位
s:设置SUID,SGID,指拥有这样的权限的可执行程序当某一用户执行的时候拥有属主或者属主所在的组的权限。

当然,你也可以使用数字来表示权限,用数值请注意了
XYZ,四个位
x代表文件的类型,你只有通过mc才能看到。
y代表SUID,SGID,T位,其中SUID=4,SGID=2,T位=1
Z代表权限位r=4,w=2,x=1

比如现在我要修改一个文件的权限,让它的权限为属主拥有所有权限,属主所在的组拥有读和写的权限,其他用户拥有读的权限,并防止其他用户删除我的文件。那么执行
#chmod 1764 myfile
用字符表示就是
#chmod u+rwx,g+rw,o+r,a+T myfile

3、修改属主和属主所在的组
使用chown来修改
比如你要将myfile的属主修改为nicry的,那么请使用
#chown nicry myfile
如果你要将文件的属主所在的组改为sohubbs组,请使用
#chown .sohubbs myfile
和在一块就是
#chown nicry.sohubbs myfile
注意,该命令为root专用。

以上就是权限的一些问题,写的比较简陋:)希望大家喜欢~~~

 junyks 回复于:2004-03-23 15:04:46
谢谢你的勤劳!

 maldinihjw 回复于:2004-03-23 15:28:44
好东西,一直不太清楚umask

 tc 回复于:2004-03-23 15:36:49
今天下午闲着没事,就写了一点东西,希望大家喜欢~~~

 sxsfxx 回复于:2004-03-23 17:23:57
看了这名话
umask的值+chmod文件的值=666 
umask的值+chmod文件夹的值=777
让我想起了某介说员的一句名言,说他统计了一下,总球数和总失球居然相等!!

文件权限可以看做是一个3位的8进制数,chmod时用这个3位8进制数,这样比用那些字母方便,呵呵!

 tc 回复于:2004-03-23 17:29:31
[quote="sxsfxx"]看了这名话
umask的值+chmod文件的值=666 
umask的值+chmod文件夹的值=777
让我想起了某介说员的一句名言,说他统计了一下,总球数和总失球居然相等!!

比如现在我的umask为022,然后我新建了一个文件,他的权限就是644,可能是我没有说的很清除,每一位相加减~

 sxsfxx 回复于:2004-03-23 17:38:03
[quote:3751895af7="tc"]xsfxx"]看了这名话
umask的值+chmod文件的值=666 
umask的值+chmod文件夹的值=777
让我想起了某介说员的一句名言,说他统计了一下,总球数和总失球居然相等!!

比如现在我的umask为022,然后我新建了一个文件?.........[/quote:3751895af7]

这是肯定的了,新建的文件或目录的权限就是把掩码和666或777与运算一下得到的 :m01:

 tc 回复于:2004-03-23 19:09:13
sxsfxx兄,关于那个t位的说法我想和你探讨一下。
有的书闪说t位是一个可执行应用程序在执行完毕以后将自己保留在内存中,有的说凡是加上了t位的文件就不能删除(但是在有的时候可以删除,在tmp下好像不行。)。
请问你那里有没有其他的说法??

 tc 回复于:2004-03-23 19:46:43
欢迎大家来讨论权限问题呀~

 .netocool 回复于:2004-03-23 20:17:43
正好这几天在研究LINUX权限的问题


我理解Linux里面的权限分配跟WINDOWS下不同的是,LINUX不能把文件夹的权限对应地分给每个用户,只能用组的方法间接地把权限分配给用户

 wd 回复于:2004-03-23 20:19:58
所以你要是想把全县分配给某几个用户,必须为他们建立一个组。

 netocool 回复于:2004-03-23 20:22:04
可是在LINUX下一个用户最多只能同属于32个组,这也许是个缺点

 tc 回复于:2004-03-24 08:50:59
[quote:0efeca19be="netocool"]可是在LINUX下一个用户最多只能同属于32个组,这也许是个缺点[/quote:0efeca19be]

假设一下,如果次要组的权限发生冲突,那么如何区别?

 tanxiaoming 回复于:2004-03-24 08:57:08
s权限是一个比较搞的东西,按楼主所说,s权限就是一个带x属性的file,只要某用户首次执行了它,则该用户及改用户所在的组就有了对这个file的权限,是这样吗?

 好好先生 回复于:2004-03-24 09:08:44
精华贴分类索引中有这方面的贴子,对s,S,T,t讲的都比较详细。

 tc 回复于:2004-03-24 09:12:17
[quote:ffa5577b65="tanxiaoming"]s权限是一个比较搞的东西,按楼主所说,s权限就是一个带x属性的file,只要某用户首次执行了它,则该用户及改用户所在的组就有了对这个file的权限,是这样吗?[/quote:ffa5577b65]
S权限分为SUID和SGID,也就是说当一个用户执行一个可执行程序的时候拥有用户属主或者属主所在的组的权限。
这是有区别的。 :D

 tc 回复于:2004-03-24 12:41:31
一直有一个问题,再使用mc是看到权限位之前的文件类型标识位使用什么方法修改?
这个问题困扰了我很长时间了!

 netocool 回复于:2004-03-24 13:59:54
up

 sakulagi 回复于:2004-03-24 14:12:27
好像只有t是可以设置的吧,试一下
权限位实际上是4位数字,试试chmod 7777 test_file_name

 tc 回复于:2004-03-25 09:43:52
[quote:07179d2205="sakulagi"]好像只有t是可以设置的吧,试一下
权限位实际上是4位数字,试试chmod 7777 test_file_name[/quote:07179d2205]

谢谢你的回复,我的意思不是说设置T,SUID,SGID位,而是说,在console下使用mc的时候,可以看到除了这些位以外的文件类型标识位。
比如:
-   普通文件,类型位是10
d     目录,类型位是4
s     可执行文件,类型位是14
c     字符设备,类型位是2
b     块设备,类型位是6
p     管道文件,类型位是1

我的意思是这些文件实际上在linux中是以类型位来确定文件类型,如何来直接修改这些类型位?

 tc 回复于:2004-03-25 12:47:00
问题还没有解决,我自己顶上去!

 tc 回复于:2004-03-25 18:37:02
各位DX,快来帮帮忙看看先~

 netocool 回复于:2004-03-25 19:27:35
up

 sakulagi 回复于:2004-03-25 19:53:38
这样修改应该是不允许的吧?如果我把一个目录的类型强行修改成一个block device,那么这个目录里的所有的文件的将如何访问呢?其他的程序在处理这个目录的时候该如何处理它呢?

 網中人 回复于:2004-03-26 00:11:19
樓主有試過 033 的 umask 嗎?  ^_^

 wd 回复于:2004-03-26 11:12:28
y代表SUID,SGID,T位,其中SUID=4,SGID=2,T位=1

这个是用来干吗的?
每次设置权限我都没有包括他,呵呵。。。

 tc 回复于:2004-03-26 13:11:09
[quote:3fac3677b6="sakulagi"]这样修改应该是不允许的吧?如果我把一个目录的类型强行修改成一个block device,那么这个目录里的所有的文件的将如何访问呢?其他的程序在处理这个目录的时候该如何处理它呢?[/quote:3fac3677b6]

谢谢你的回复,你的这种回答我也觉得是比较合理的解释。谢谢~
在这里也感谢其他几位回复的网友,虽然他们都误解文件标识位是umask了:) :m01:

 magretg 回复于:2004-03-26 14:11:04
好贴呀.

 ohsnoopy 回复于:2004-03-26 15:21:52
好,仔细看看记下来 :em22: !

 tc 回复于:2004-03-26 19:26:27
[quote:6ba6de6c07="wd"]y代表SUID,SGID,T位,其中SUID=4,SGID=2,T位=1

这个是用来干吗的?
每次设置权限我都没有包括他,呵呵。。。[/quote:6ba6de6c07]

在上面我已经说了D,SUID代表在执行一个程序的时候拥有属主的身份,SGID师拥有属主所在的组的身份,t位不让删除~

 網中人 回复于:2004-03-26 20:52:36
嗯?樓主還沒回答我 umask 033 的問題呢~~~  ^_^
關於 suid, sgid, sticky bit ,對於 file 與 directory 來說,意議都不相同的。
樓主諸位先進,似乎說的都還不是很完整...
不知有多少人先看過精華區裡的舊文章了呢?

 sxsfxx 回复于:2004-03-27 10:43:26
看来我以前也是一知半解呀,谢谢tc!
“UNIX环境高级编程”的第四章有详细的介绍,大家可以看一下!

好铁,建议板主固精!

 tc 回复于:2004-03-27 10:47:47
[quote:473f344905="網中人"]嗯?樓主還沒回答我 umask 033 的問題呢~~~  ^_^
關於 suid, sgid, sticky bit ,對於 file 與 directory 來說,意議都不相同的。
樓主諸位先進,似乎說的都還不是很完整...
不知有多少人先看過精華區裡的舊文章?.........[/quote:473f344905]

现在我的手上没有linux的机器,我就在我的HPUX上操作了一下,验证我的看法。
当文件umask位是033的时候同umask022是一样的情况,新建文件的权限是-rw-r--r--,新建目录的权限是-rw-r--r--,这同umask022的时候是一样的情况。
同时也谢谢你的回复,我去看了看以前的帖子,可能是我才上cu时间不长的关系,手里的链接不是很丰富,如果楼上有相关的链接,请贴出来大家分享,谢谢~

 tc 回复于:2004-03-27 11:07:27
[quote:9762927544="sxsfxx"]看来我以前也是一知半解呀,谢谢tc!
“UNIX环境高级编程”的第四章有详细的介绍,大家可以看一下!

好铁,建议板主固精![/quote:9762927544]

谢谢~
也感谢你的恢复,大家一起探讨才能更加有效的进步~~

 justboy2000 回复于:2004-03-27 16:40:46
好,好,好,高,实在是高!!!!!强烈建议固精!!!!!

 網中人 回复于:2004-03-27 17:24:11
[quote:c7d4e0bad2="tc"]现在我的手上没有linux的机器,我就在我的HPUX上操作了一下,验证我的看法。
当文件umask位是033的时候同umask022是一样的情况,新建文件的权限是-rw-r--r--,新建目录的权限是-rw-r--r--,这同umask022的时候是..........[/quote:c7d4e0bad2]

是的,確是如此...
不過,有去想想這樣的結過為何與之前介紹的公式不一樣呢?
new_perm + umask = 666 

假如大家找不到相關資料的話,答案我會稍後跟大家說...
嗯,不是不說,或賣甚麼關子啦,我只是希望大家先"活動一下腦力",
這樣的話,之後出來的效果會更深刻哦...

當然,若在我說出答案之前,就能找到原因,那更是值得慶賀的事情﹗  ^_^

 tc 回复于:2004-03-27 19:16:09
[quote:824e1cb87f="網中人"]

是的,確是如此...
不過,有去想想這樣的結過為何與之前介紹的公式不一樣呢?
new_perm + umask = 666 

假如大家找不到相關資料的話,答案我會稍後跟大家說...
嗯,不是不說,或賣甚麼關子啦,我只是希望大..........[/quote:824e1cb87f]

网兄,这是我在我的电脑上做的试验的全过程。

# umask 022
# umask
022
# mkdir 022d
# touch 022
# ll 022
-rw-r--r--   1 root       sys              0 Mar 17 11:03 022
# ll -d 022d
drwxr-xr-x   2 root       sys             96 Mar 17 11:03 022d
# umask 033
# umask
033
# mkdir 033d
# touch 033
# ll 033
-rw-r--r--   1 root       sys              0 Mar 17 11:04 033
# ll -d 033d
drwxr--r--   2 root       sys             96 Mar 17 11:04 033d

结论是:umask 033和022在创建文件的时候是一致的,但是在目录的时候却出现不同~并且,当我使用普通用户无法登陆003d目录,因为没有x权限。如下:
# su user
$ ls
022         SD_CDROM    dev         lib         opt         tmp
022d        TT_DB       etc         lost+found  root        usr
033         bin         export      mnt         sbin        var
033d        cdrom       home        nohup.out   stand       vml
$ lsf
022          SD_CDROM/    dev/         lib/         opt/         tmp/
022d/        TT_DB/       etc/         lost+found/  root/        usr/
033          bin/         export/      mnt/         sbin/        var/
033d/        cdrom/       home/        nohup.out    stand/       vml
$ cd 033d
sh: 033d: Permission denied.

 網中人 回复于:2004-03-27 20:37:15
嗯... 還不是我要的哦...

你提到的是"結果",我要的是"原因"...
繼續加油,快到了﹗  ^_^

 tc 回复于:2004-03-28 10:06:29
[quote:ab6a03cfd5="網中人"]嗯... 還不是我要的哦...

你提到的是"結果",我要的是"原因"...
繼續加油,快到了﹗  ^_^[/quote:ab6a03cfd5]

网兄,你看这样理解咋样?
umask    022     033
F            644      644
D           655       755
现在问题的关键不是在目录上的权限异常,而是根据上面我说的公式
umask+XXX=666(file时)
umask+XXX=777(Dri时)
分析出来的结果应该是当umask=033的时候,f的权限应该是633。
那么633同644有什么差别?我当时在想是不是存在这样一种情况,当一个文件具有写和执行的权限的时候,这个文件是可读的,于是我做了一下试验,试验结果如下:
# touch tttt
# chmod 333 ttt
chmod: can't aclearcase/" target="_blank" >ccess ttt
# chmod 333 tttt
# more tttt
# cat >tttt
jkadnbflke
skdjfbnlskr
klsdjfglakjer
# cat tttt
jkadnbflke
skdjfbnlskr
klsdjfglakjer
证明当一个文件具有写和执行的权限的时候,这个文件是可读的。
^_^,希望这是你要的答案!
ps:同你讨论技术,感觉可以学习很多东西:)

 網中人 回复于:2004-03-29 00:41:57
嗯... 好像還是差那麼一點點...  ^_^

好吧,我這裡就我對 Linux  File Permission 的部份發表一下個人意見,
不見得完全正確,只希望提出來給大家一些參考。

-----------------------------

1) Permission Mode
首先,File Permission Mode 是存在 inode 中的資訊,
一共有 12 個 bit (0與1):0 是關閉、1是打開。
其中每一個 bit 所代表的意思分別如下:
suid, sgid, sticky_bit,
user_read, user_write, user_execute,
group_read, group_write, group_execute,
others_read, others_write, others_execute。

舉例: 100111101101 (binary mode)

但在系統應用及管理上,我們一般不是採用 binary mode(二進位),
而是使用 octal mode(八進位) 或 text mode(文字) 。
其中的 octal mode 就是單純將 binary 換算過來就可以了。
你可試試 linux 的 bc 命令來算一算:
$ echo "obase=8;ibase=2;100111101101" | bc
4755

不過,若你手邊沒有 bc 命令或計算器可用的話,那用手工來算也不難:
先列一個 3bit 的對照表:

000 : 0
001 : 1
010 : 2
011 : 3
100 : 4
101 : 5
110 : 6
111 : 7

然後,將 12bit 分成 4 組:
100,111,101,101
再跟據上表就能輕送換算出:
4,7,5,5

不過,在 text mode 的表示上,則有些複雜,因為需將 12 個字母壓縮為 9 個。
不過其原理也不難:
    * 將第一組的 bit 分散在後三組的 x 位置上:
        suid 蓋掉 ux 然後用 s 或S 表示
        sgid 蓋掉 gx 然後用 s 或S 表示
        stickbit 蓋掉 ox 然後用 t或T 表示
    * 若 x 有設則用小寫;若 x 沒設則為大寫
    * 若某一 bit 在打開狀態下用文字表示(rwxst)關閉狀態下則用 -  表示(或S,T)。

下面是前例的對照:
[code:1:45bf2e0c43]binary:   100 111 101 101 
text:              rws r-x r-x        
octal:      4   7   5   5 [/code:1:45bf2e0c43]

下面是另兩例:
[code:1:45bf2e0c43]binary:   010 111 111 101    001 111 111 111
text:       rwx rws r-x        rwx rwx rwt
octal:       2   7   7   5      1   7   7   7[/code:1:45bf2e0c43]


2) ugo
利用 ls -l 命令,可獲得每一個文件的如下資訊:
file_type&permission_mode, link_count, user, group, size, modification_time, file_name

我們可以從最左邊的欄位看到十個字母,
第一個為: file type 
其餘九個為 permission mode ,又分為三組:user, gorup, others 。
對每一個使用者來說,ugo 這三組只能選其一:
* 若 uid 與 file uid 一致,則取 user 而忽略 group & others 。
* 若 uid 與 file uid 不一致,則再看 gid(s) 若與 file gid 一致。取 group 而忽略 user & others 。
* 若 uid 與 gid 與 file 都不一致,則取 others 而忽略 user & group。
(註:你可在任何時候輸入 id 這個命令得知你所使用的 uid 與 gid(s)。)


3) rwx
一旦使用者所參考的 ugo permission 能確定下來之後,
接下來就來看其取的的 permission 代表的意思了。

事實上rwx 對下面兩種 file type 來說是不一樣的:
*以 - 開頭為 file:
        r: 可讀取該檔的內容
        w: 可修改該檔的內容
        x: 可執行該檔(executable)並產生 process
* 以 d 開頭為 directory:
        r: 可讀取該目錄底下的內容(即列出 file 及 sub dir)
        w: 可修改該目錄底下的內容(即增減 file 及 sub dir)
        x: 可進入該目錄底下(即 access ,如門禁卡一般)

其中 directory 的 x 最不好理解:
就算你對 dir 有 rw ,若沒 x 的話,那也跑不進去做事情,
就好像你是自己套房的主人,卻進不了公寓大門一樣。

然而,當你對一個 directory 有了 rwx 權限之後,
裡面或許有些 file/dir 你是沒有 rwx 權限的,
就好比套房裡放了一些不屬於你的物品:
* 你沒辦法打開一看究竟(沒 r)
* 你沒辦法偷龍轉鳳動手腳(沒 w)
* 你只能乾瞪眼卻無福消受(沒 x)
但,你卻可以將之仍進垃圾桶... 因為你在套房:
* 可以看到所有物品(r)
* 可以搬進搬出或 DIY 物品(w)
* 你有鑰匙入門(x)

4) suid, sgid, sticky bit

SUID/SGID 對 executable file 而言,
會影響所產生的 process 用哪個 uid/gid:
    若有設,從 file 本身的 uid/gid 繼承。
    若沒設,從 parrent process 繼承(通常是 shell)。
sticky_bit 在現代的 Linux 系統中,對 file 來說是沒任何意意的。

但 SUID 對 directory 沒啥意義(有設沒設都一樣),
不過, SGID 對 directory 來說,
會影響該目錄下新建的 file/dir 的 gid :
    若有設,gid 從 dir 繼承(若是 new dir,其 SGID 也會繼承)。
    若沒設,那 gid 從產生 new file/dir 的 process 繼承。
至於 directory 的 sticky bit ,則起到保護文件的作用:
    若沒有設,使用者只要對 dir 有 w permission ,就能刪除 dir 裡的文件(請參考前述)。
    若有設,使用者除了要有 w permsissin 之外,還需符合如下兩個條件之一:
        * 使用者之 uid 必須與文件所在目錄一致,或:
        * 使用者之 uid 必須被刪文件一致。
 
5) umask
umask 的作用,就是在新建文件或目錄時,需要取消的 permission 。
其運算法則為:
new dir: (NOT umask) AND 0777 (000,111,111,111)
new file: (NOT umask) AND 0666 (000,110,110,110)

其中的 NOT(bitwise) 與 AND 是羅輯運算:
NOT : 1 變 0, 0 變 1
AND: 1&&1=1, 0&&0=0, 1&&0=0, 0&&1=0

以 0033 的 umask 為例子來算:
new dir:
* 0033 換為 bit :000,000,011,011
* NOT 0033 得:111,111,100,100
* 與目錄 0777 :000,111,111,111
* 做 AND 運算得:000,111,100,100
* 轉為 octal 就是:0, 7, 4, 4

new file:
* 0033 換為 bit :000,000,011,011
* NOT 0033 得:111,111,100,100
* 與目錄 0666 :000,110,110,110
* 做 AND 運算得:000,111,100,100
* 轉為 octal 就是:0, 6, 4, 4

要用減法的話,對 new file 恐怕會不準。
用 666-033=633
但事實上:(NOT 033) AND 666 = 644

---------------------------
okay,Linux File Permission 的確是非常重要的基礎,
應該花多一點時間將其中的原理弄清楚,這對日後的管理工作有很大幫助。

 Nigel 回复于:2004-03-29 03:19:41
good,值得收藏

 tc 回复于:2004-03-29 13:01:27
[quote:2fe103b149="網中人"]

2) ugo
利用 ls -l 命令,可獲得每一個文件的如下資訊:
file_type&permission_mode, link_count, user, group, size, modification_time, file_name

我們可以從最左邊的欄位看到十個字母,
第一個為: fi..........[/quote:2fe103b149]

好贴~~~
谢谢:)

 Coolin 回复于:2004-04-09 17:16:25
我想问一下 
如果是 用mount挂栽上去的分区呢? 我挂载的是 FAT32格式的分区
可以改变它的权限吗? 怎么修改?

 Coolin 回复于:2004-04-10 10:52:55
真的就没人重视 这个问题吗?
等待中

 sakulagi 回复于:2004-04-10 11:43:52
不能,已经讨论过很多次了。

原文转自:http://www.ltesting.net