感悟生活,感受茶文化

linux权限管理

上一篇 / 下一篇  2007-03-07 16:20:45 / 个人分类:linux技术杂谈

配置cvs服务器,一直对linux下用户权限管理有点迷糊,今天看了这篇文章,突然弄明白了如何设置权限。

转文章

linux文件属性 chown chgrp用法

                                      

Linux 檔案屬性


嗯!既然要讓你瞭解 Linux 的檔案屬性,那麼有個重要的也是常用的指令就必須要先跟你說囉!那一個?!就是『 ls 』這一個 list 檔案的指令囉!在你以 root 的身份登入 Linux 之後,下達『ls -al 』看看,會看到底下的幾個咚咚:
[root@linux ~]# ls -al
total 248
drwxr-x---   9   root    root    4096    Jul 11 14:58    .
drwxr-xr-x  24   root    root    4096    Jul  9 17:25    ..
-rw-------   1   root    root    1491    Jun 25 08:53    anaconda-ks.cfg
-rw-------   1   root    root   13823    Jul 10 23:12    .bash_history
-rw-r--r--   1   root    root      24    Dec  4  2004    .bash_logout
-rw-r--r--   1   root    root     191    Dec  4  2004    .bash_profile
-rw-r--r--   1   root    root     395    Jul  4 11:45    .bashrc
-rw-r--r--   1   root    root     100    Dec  4  2004    .cshrc
drwx------   3   root    root    4096    Jun 25 08:35    .ssh
-rw-r--r--   1   root    root   68495    Jun 25 08:53    install.log
-rw-r--r--   1   root    root    5976    Jun 25 08:53    install.log.syslog
[    1   ][ 2  ][  3   ][  4 ][    5   ][      6     ][       7          ][  屬性  ][連結][擁有者][群組][檔案容量][  修改日期  ][      檔名        ]

ls 是『list』的意思,與在早期的 DOS 年代的指令 dir 類似功能。 而參數『-al』則表示列出所有的檔案 ( 包含隱藏檔,就是檔名前面第一個字元為 . 的那種檔案 ) 。如上所示,在你第一次以 root 身份登入 Linux 時,如果你輸入指令後,應該有上列的幾個東西, 先解釋一下上面七個欄位個別的意思:



圖二、檔案屬性的示意圖


第一欄代表這個檔案的屬性: 這個地方最需要注意了!仔細看的話,你應該可以發現這一欄其實共有十個屬性:


圖三、檔案的十個屬性內容


第一個屬性代表這個檔案是『目錄、檔案或連結檔等等』:
當為[ d ]則是目錄,例如上表的第 11 行;
當為[ - ]則是檔案,例如上表的第 5 行;
若是[ l ]則表示為連結檔(link file);
若是[ b ]則表示為裝置檔裡面的可供儲存的周邊設備;
若是[ c ]則表示為裝置檔裡面的序列埠設備,例如鍵盤、滑鼠。


接下來的屬性中,三個為一組,且均為『rwx』 的三個參數的組合。其中,[ r ]代表可讀(read)、[ w ]代表可寫(write)、[ x ]代表可執行(excute):
第一組為『擁有人的權限』,以第 5 行為例,該檔案的擁有人可以讀寫,但不可執行;
第二組為『同群組的權限』;
第三組為『其他非本群組的權限』。

範例:若有一個檔案的屬性為『-rwxr-xr--』,簡單的可由下面說明之:

[-][rwx][r-x][r--]
1  234  567  890
     1 為:代表這個檔名為目錄或檔案(上面為檔案)
    234為:擁有人的權限(上面為可讀、可寫、可執行)
    567為:同群組使用者權限(上面為可讀可執行)
    890為:其他使用者權限(上面為僅可讀)
上面的屬性情況代表一個檔案、這個檔案的擁有人可讀可寫可執行、但同群組的人僅可讀與執行, 非同群組的使用者僅可讀的意思!

除此之外,需要特別留意的是 x 這個標號! 若檔名為一個目錄的時候,例如上表中的 .ssh 這個目錄:

drwx------   3   root    root    4096    Jun 25 08:35    .ssh



可以看到這是一個目錄,而且只有 root 可以讀寫與執行。但是若為底下的樣式時,請問非 root 的其他人是否可以進入該目錄呢?

drwxr--r--   3   root    root    4096    Jun 25 08:35    .ssh



咦!似乎好像是可以喔!因為有可讀[ r ]存在嘛!『錯!』答案是非 root 這個帳號的其他使用者均不可進入 .ssh 這個目錄,為什麼呢? 因為 x 與 目錄 的關係相當的重要, 如果您在該目錄底下不能執行任何指令的話,那麼自然也就無法進入了,因此, 請特別留意的是,如果您想要開放某個目錄讓一些人進來的話, 請記得將該目錄的 x 屬性給開放呦!至於目錄的權限相關說明, 我們會在底下繼續介紹的。

另外,你也必須要更加的小心的是,在 Windows 底下一個檔案是否具有執行的能力是藉由『 附檔名 』來判斷的, 例如:.exe, .bat, .com 等等,但是在 Linux 底下, 我們的檔案是否能執行,則是藉由是否具有 x 這個屬性來決定的!所以,跟檔名是沒有絕對的關係的! 這點還請特別留意呢!稍後我們還會針對目錄來稍作說明的

2.     第二欄表示為連結佔用的節點 (i-node): 這個跟連結檔 (link file) 比較有關係,我們在未來的章節會再加以介紹的。 如果是目錄的話,那麼就與該目錄下還有多少目錄有關。

3.     第三欄表示這個檔案(或目錄)的『擁有人』。

4.     第四欄表示擁有人的群組。
這裡再次解釋一下,在 Linux 中,你的 ID ( 如 root 或 test 等帳號均是所謂的 ID ) 即是你的身份,而且你還可以附屬在一個或多個群組之下,例如剛剛我們上面提到的,你有一個團體 ( 即群組 ) 代號為 testgroup ,且這個群體裡有三個人,其代號分別是 test1, test2, 與 test3,則這三個人為同一群組即 testgroup!那麼如果以上圖的的檔案屬性(-rwxrwx---) 來看,如果該檔案屬於 test1 所有,那麼 test2, test3 亦有讀、寫、執行的權力,因為他們都屬於同一個 group 呀!而如果您不是屬於 test1, test2, test3 的任何一個人,也不屬於 testgroup 這個群組時,那麼您將不具備讀、寫、執行這個檔案的權限了!

5.     第五欄為這個檔案的容量大小。

6.     第六欄為這個檔案的建檔日期或者是最近的修改日期, 分別為月份、日期及時間。請特別留意,如果您是以繁體中文來進行安裝您的 Linux 時,那麼預設的語系可能會被改為中文。而 由於中文無法顯示在文字型態的終端機上面, 所以這一欄會成為怪怪的亂碼,這個時候,請修改一下 /etc/sysconfig/i18n 這個檔案,裡面的『 LC_TIME 』修改為:『 LC_TIME=en 』再儲存離開,再登入一次,就可以得到英文字形顯示的日期了! 那麼如何修改該檔案呢?呵呵!以 root 身份用 vi 修改。 另外,也可以使用『 LANG=en ls -al 』之類的語法來顯示。

7.     第七欄為這個檔案的檔名, 如果檔名之前多一個『 . 』,則代表這個檔案為『隱藏檔』, 例如上表第 6 行的『.bashrc_history』檔名即是隱藏檔,由於我們有下一個參數為 ls -al,所以連隱藏檔都列出來,如果你只輸入 ls 則檔名有加『 . 』的檔案就不會被顯示出來!

如何改變檔案權限

好了,我們已經知道檔案權限對於一個系統的安全重要性了,也知道檔案的權限對於使用者與群組的相關性了, 好了,那麼如何修改一個檔案的權限呢?又!有多少檔案的權限我們可以修改呢? 其實一個檔案的權限很多嘛!大致上我們先介紹幾個簡單的,例如:群組、擁有者、各種身份的權限等等。

chgrp :改變檔案所屬群組
chown :改變檔案所屬人
chmod :改變檔案的屬性、 SUID 、等等的特性

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

·  改變所屬群組, chgrp

改變一個檔案的群組真是很簡單的,直接以 chgrp 來改變即可,咦!這個指令就是 change group 的縮寫嘛!對啦!這樣就很好記了吧! ^_^。不過,請記得, 要改變成為的群組名稱必須要在 /etc/group 裡面存在的名稱才行,否則就會顯示錯誤!

假設您是以 root 的身份登入 FC4 ,那麼在您的家目錄內有一個 install.log 的檔案, 如何將該檔案的群組改變一下呢?假設您已經知道在 /etc/group 裡面已經存在一個名為 users 的群組,但是 testing 這個群組名字就不存在 /etc/group 當中了, 此時改變群組成為 users 與 testing 會有什麼現象發生呢?

[root@linux ~]# chgrp [-R] dirname/filename ...
參數:
-R : 進行遞迴( recursive )的持續變更,亦即連同次目錄下的所有檔案、目錄
     都更新成為這個群組之意。常常用在變更某一目錄的情況。
範例:
[root@linux ~]# chgrp users install.log
[root@linux ~]# ls -l
-rw-r--r--  1 root users 68495 Jun 25 08:53 install.log
[root@linux ~]# chgrp testing install.log
chgrp: invalid group name `testing' <== 發生錯誤訊息囉~找不到這個群組名~


發現了嗎?檔案的群組被改成 users 了,但是要改成 testing 的時候, 就會發生錯誤~注意喔!發生錯誤訊息還是要努力的查一查錯誤訊息的內容才好!


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

·  改變檔案擁有者, chown

好了,那麼如何改變一個檔案的擁有者呢?很簡單呀!既然改變群組是 change group ,那麼改變擁有者就是 change owner 囉!BINGO,對啦!那就是 chown 這個指令的用途,要注意的是,使用者必須是已經存在系統中的,也就是在 /etc/passwd 這個檔案中有紀錄的使用者名稱才行改變。

chown 的用途還滿多的,他還可以順便直接修改群組的名稱呢!此外, 如果要連目錄下的所有次目錄或檔案同時更改檔案擁有者的話,直接加上 -R 的參數即可!我們來看看語法與範例:

[root@linux ~]# chown [-R] 帳號名稱 檔案或目錄
[root@linux ~]# chown [-R] 帳號名稱:群組名稱 檔案或目錄
參數:
-R : 進行遞迴( recursive )的持續變更,亦即連同次目錄下的所有檔案、目錄
     都更新成為這個群組之意。常常用在變更某一目錄的情況。
範例:
[root@linux ~]# chown bin install.log
[root@linux ~]# ls -l
-rw-r--r--  1 bin  users 68495 Jun 25 08:53 install.log
[root@linux ~]# chown root:root install.log
[root@linux ~]# ls -l
-rw-r--r--  1 root root 68495 Jun 25 08:53 install.log


嗯!知道如何改變檔案的群組與擁有者了,那麼什麼時候要使用 chown 或 chgrp 呢?!或許您會覺得奇怪吧?!是的,確實有時候需要變更檔案的擁有者的, 最常見的例子就是在 copy 檔案給你之外的其他人時,假設您今天要將 .bashrc 這個檔案拷貝成為 .bashrc_test ,且是要給 bin 這個人,您可以這樣做:

[root@linux ~]# cp .bashrc .bashrc_test
[root@linux ~]# ls -al .bashrc*
-rw-r--r--  1 root root 395 Jul  4 11:45 .bashrc
-rw-r--r--  1 root root 395 Jul 13 11:31 .bashrc_test


哇!怎麼辦? .bashrc_test 還是屬於 root 所有,如此一來,即使你將檔案拿給 bin 這個使用者了,那他仍然無法修改的( 看屬性就知道了吧! ), 所以你就必須要將這個檔案的擁有者與群組修改一下囉!知道如何修改了吧!?呵呵!


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

·  改變九個屬性, chmod

檔案屬性的改變使用的是 chmod 這個指令,但是,屬性的設定方法有兩種, 分別可以使用數字或者是符號來進行屬性的變更。我們就來談一談:

·  數字類型改變檔案權限

Linux 檔案的基本屬性就有九個,分別是 owner/group/others 組別的 read/write/excute 屬性, 先複習一下剛剛上面提到的資料:

-rwxrwxrwx

這九個屬性是三個三個一組的!其中,我們可以使用數字來代表各個屬性,各屬性的對照表如下:

r:4
w:2
x:1

同一組 (owner/group/others) 的三個屬性 (r/w/x) 是需要累加的,例如當屬性為 [-rwxrwx---] 則是:

owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others= --- = 0+0+0 = 0

所以等一下我們設定屬性的變更時,該屬性的數字就是 770 啦!變更屬性的指令 chmod 的語法是這樣的:

[root@linux ~]# chmod [-R] xyz 檔案或目錄
參數:
xyz : 就是剛剛提到的數字類型的權限屬性,為 rwx 屬性數值的相加。
-R : 進行遞迴( recursive )的持續變更,亦即連同次目錄下的所有檔案、目錄
     都更新成為這個群組之意。常常用在變更某一目錄的情況。


舉例來說,如果要將 .bashrc 這個檔案所有的屬性都打開,那麼就下達:

[root@linux ~]# ls -al .bashrc
-rw-r--r--  1 root root 395 Jul  4 11:45 .bashrc
[root@linux ~]# chmod 777 .bashrc
[root@linux ~]# ls -al .bashrc
-rwxrwxrwx  1 root root 395 Jul  4 11:45 .bashrc


看到了嗎?屬性改變了喔!由於一個檔案有三組屬性,所以你可以發現上面 777 為三組,而由於我們將所有的屬性都打開,所以數字都相加,亦即『 r+w+x = 4+2+1 = 7』

那如果要將屬性變成『 -rwxr-xr-- 』呢?那麼就成為 [4+2+1][4+0+1][4+0+0]=754 囉!所以你需要下達 chmod 754 filename。 最常發生的一個問題就是,常常我們以 vi 編輯一個 shell 的文字檔後,他的屬性通常是 -rw-rw-rw- 也就是 666 的屬性,如果要將他變成可執行檔,並且不要讓其他人修改此一檔案的話, 那麼就需要 -rwxr-xr-x 這一個 755 的屬性,所以 chmod 755 test.sh 就需要這樣做囉!

另外,有些檔案你不希望被其他人看到,例如 -rwxr-----,那麼就下達 chmod 740 filename 吧!

例題三:將剛剛您的 .bashrc 這個檔案的屬性改回原來的 -rw-r--r--
答:

chmod 644 .bashrc




·  符號類型改變檔案權限

還有一個改變屬性的方法呦!從之前的介紹中我們可以發現,基本上就九個屬性分別是(1)user (2)group (3)others 三群啦!那麼我們就可以藉由 u, g, o 來代表三群的屬性!此外, a 則代表 all 亦即全部的三群!那麼讀寫的屬性就可以寫成了 r, w, x 囉!也就是可以使用底下的方式來看:

chmod
u
g
o
a
+(加入)
-(除去)
=(設定)
r
w
x
檔案或目錄



來實作一下吧!假如我們要『設定』一個檔案的屬性為『-rwxr-xr-x』時,基本上就是:

user (u):具有可讀、可寫、可執行的權限;
group 與 others (g/o):具有可讀與執行的權限。
所以就是:

[root@linux ~]# chmod  u=rwx,go=rx  .bashrc
# 注意喔!那個 u=rwx,go=rx 是連在一起的,中間並沒有任何空白字元!
[root@linux ~]# ls -al .bashrc
-rwxr-xr-x  1 root root 395 Jul  4 11:45 .bashrc


請注意, u=rwx,og=rx 這一段文字之間並沒有空白字元隔開呦!不要搞錯囉! 那麼假如是『 -rwxr-xr-- 』?可以使用『 chmod u=rwx,g=rx,o=r filename 』來設定。此外,如果我不知道原先的檔案屬性,而我只想要增加 .bashrc 這個檔案的每個人均可寫入的權限,那麼我就可以使用:

[root@linux ~]# ls -al .bashrc
-rwxr-xr-x  1 root root 395 Jul  4 11:45 .bashrc
[root@linux ~]# chmod  a+w  .bashrc
[root@linux ~]# ls -al .bashrc
-rwxrwxrwx  1 root root 395 Jul  4 11:45 .bashrc


而如果是要將屬性去掉而不更動其他的屬性呢?!例如要拿掉所有人的 x 的屬性,則:

[root@linux ~]# chmod  a-x  .bashrc
[root@linux ~]# ls -al .bashrc
-rw-rw-rw-  1 root root 395 Jul  4 11:45 .bashrc


知道 +, -, = 的不同點了嗎?對啦! + 與 – 的狀態下,只要是沒有指定到的項目, 則該屬性『不會被變動』,例如上面的例子中,由於僅以 – 拿掉 x 則其他兩個保持當時的值不變!呵呵!多多實作一下,你就會知道如何改變屬性囉! 這在某些情況底下很好用的~舉例來說,您想要教一個朋友如何讓一個程式可以擁有執行的權限, 但您又不知道該檔案原本的權限為何,此時,利用 chmod a+x filename ,就可以讓該程式擁有執行的權限了。 是否很方便?


TAG: linux技术杂谈

 

评分:0

我来说两句

Open Toolbar