Linux學習之CentOS(四)----Linux文件屬性、所有者、群組、其他組及文件權限操作簡要總結


Linux文件屬性、所有者、群組、其他組及文件權限操作簡要總結

首先介紹一個重要的知識點:文件屬性控制權限

[root@www ~]# ls -al
total 156
drwxr-x---   4    root   root     4096   Sep  8 14:06 .
drwxr-xr-x  23    root   root     4096   Sep  8 14:21 ..
-rw-------   1    root   root     1474   Sep  4 18:27 anaconda-ks.cfg
-rw-r--r--   1    root   root      100   Jan  6  2007 .cshrc
drwx------   3    root   root     4096   Sep  5 10:37 .gconf      <=范例說明處
drwx------   2    root   root     4096   Sep  5 14:09 .gconfd
-rw-r--r--   1    root   root    42304   Sep  4 18:26 install.log <=范例說明處
-rw-r--r--   1    root   root     5661   Sep  4 18:25 install.log.syslog
[    1  ] [  2 ]  [ 3 ]  [ 4 ]   [  5  ] [     6     ] [       7          ]
[  權限  ][文件數][擁有者][群組]  [文件大小] [   修改日期  ] [      文件名       ]

如果這個文件被修改的時間距離現在太久了,那么時間部分會僅顯示年份而已。 如下所示:

[root@www ~]# ls -l /etc/termcap /root/install.log
-rw-r--r-- 1 root root 807103 Jan  7  2007 /etc/termcap
-rw-r--r-- 1 root root  42304 Sep  4 18:26 /root/install.log
# 如上所示,/etc/termcap 為 2007 年所修改過的文件,離現在太遠之故;
# 至於 install.log 是今年 (2009) 所建立的,所以就顯示完整的時間了。

 

如果想要讓系統默認的語系變成英文的話,那么你可以修改系統配置文件『/etc/sysconfig/i18n』,修改該文件的內容,使LANG這個變量成為上述的內容即可。如果想要顯示完整的時間格式,可以利用ls的選項,亦即:『ls -l --full-time』就能夠顯示出完整的時間格式了!包括年、月、日、時間喔。 另外,如果你當初是以繁體中文安裝你的Linux系統,那么日期字段將會以中文來顯示。 可惜的是,中文並沒有辦法在純文本的終端機模式中正確的顯示,所以此欄會變成亂碼。 那你就得要使用『LANG=en_US』來修改語系喔!

第七欄為這個文件的檔名

這個字段就是檔名了。比較特殊的是:如果檔名之前多一個『 . 』,則代表這個文件為『隱藏檔』,例如上表中的.gconf那一行,該文件就是隱藏檔。 你可以使用『ls』及『ls -a』這兩個指令去感受一下什么是隱藏檔啰! 

這七個字段的意義是很重要的!務必清楚的知道各個字段代表的意義!尤其是第一個字段的九個權限, 那是整個Linux文件權限的重點之一。

總結如下

通過查看ls -l命令可以查看文件的詳細列表信息(如文件類型、所在組、文件名等)
如:-rwxrw-r-- 1 501 502 100 Mar Test.java
【-rwxrw-r--】各個段的含義
將【-rwxrw-r--】拆分為 【-| rwx| rw-| r--】四段
第一段【-】代表的是文件類型,一般有三種(-代表是文件)、(d代表是文件夾)、(l代表是鏈接)可以用字符表示的文件類型 
-:普通文件
d:目錄文件
l:鏈接文件
b:塊設備文件
c:字符設備文件
p:管道文件
 【rwx代表的含義】,在linux系統中,r代表用戶對該文件或者文件夾擁有可讀權限、w代表可寫權限、x代表可執行權限
在linux系統中,每個權限都有一個數字來表示,r(可讀權限)用數字4表示,w(可寫權限)用數字2表示,x(可執行權限)用數字1表示
第二段【rwx】代表的是該文件(或文件夾)的【所有者(誰創建了該文件,誰就是該文件的所有者)】對該文件的訪問權限,如該所有者對該文件的權限是可讀、可寫、可執行
第三段【rw-】代表的是該用戶【所在組的其它用戶】對該文件的訪問權限,如該用戶組其它用戶對該文件的訪問權限是可讀、可寫
第四段【r--】代表的是【除了該用戶所在組的其他組】對該文件的訪問權限,如其他組用戶對該文件的訪問權限是可讀
【注:權限都可以用數字來代替,例如 rwx 可用 4+2+1 =7 來表示,rw可用數字6來表示等】
綠色文件: 可執行文件,可執行的程序 
 
紅色文件:壓縮文件或者包文件
 
藍色文件:目錄
 
白色文件:一般性文件,如文本文件,配置文件,源碼文件等 
 
淺藍色文件:鏈接文件,主要是使用ln命令建立的文件
 
紅色閃爍:表示鏈接的文件有問題
 
黃色表示設備文件
 
灰色:表示其他文件
 
  1 501 502 100 Mar Test.java各個字段含義
1:代表的文件個數,如果是文件則是1,若是文件夾,則顯示該文件夾下子文件數目
501:代表哪個用戶,在每創建一個用戶時,都會為該用戶創建一個唯一的用戶id,501就是指代該用戶的id
502:代表該用戶所在組,在創建每一個組時,linux也會為該組創建一個唯一的組id,502就是代表該用戶所在組的id
100:代表文件的大小
Mar:代表文件創建時間
Test.java:代表文件名

如何改變文件屬性與權限

linux系統文件權限分為三種:(1)使用者(2)群組(3)其他人

       我們現在知道文件權限對於一個系統的安全重要性了,也知道文件的權限對於使用者與群組的相關性, 那么如何修改一個文件的屬性與權限呢?又!有多少文件的權限我們可以修改呢? 其實一個文件的屬性與權限有很多!我們先介紹幾個常用於群組、擁有者、各種身份的權限之修改的指令,如下所示:

  • chgrp :改變文件所屬群組
  • chown :改變文件擁有者
  • chmod :改變文件的權限, SUID, SGID, SBIT等等的特性

 改變所屬群組:chgrp

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

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

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

發現了嗎?文件的群組被改成users了,但是要改成testing的時候, 就會發生錯誤~注意喔!發生錯誤訊息還是要努力的查一查錯誤訊息的內容才好! 將他英文翻譯成為中文,就知道問題出在哪里了。

改變文件擁有者:chown

如何改變一個文件的擁有者呢?很簡單呀!既然改變群組是change group,那么改變擁有者就是change owner啰!BINGO!那就是chown這個指令的用途,要注意的是, 用戶必須是已經存在系統中的賬號,也就是在/etc/passwd 這個文件中有紀錄的用戶名稱才能改變。

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

[root@www ~]# chown [-R] 賬號名稱 文件或目錄
[root@www ~]# chown [-R] 賬號名稱:組名 文件或目錄
選項與參數:
-R : 進行遞歸(recursive)的持續變更,亦即連同次目錄下的所有文件都變更

范例:將install.log的擁有者改為bin這個賬號:
[root@www ~]# chown bin install.log
[root@www ~]# ls -l
-rw-r--r--  1 bin  users 68495 Jun 25 08:53 install.log

范例:將install.log的擁有者與群組改回為root:
[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r--r--  1 root root 68495 Jun 25 08:53 install.log
知道如何改變文件的群組與擁有者了,那么什么時候要使用chown或chgrp呢?或許你會覺得奇怪吧? 是的,確實有時候需要變更文件的擁有者的,
最常見的例子就是在復制文件給你之外的其他人時, 我們使用最簡單的cp指令來說明好了:
[root@www ~]# cp 來源文件 目標文件

假設你今天要將.bashrc這個文件拷貝成為.bashrc_test檔名,且是要給bin這個人,你可以這樣做

[root@www ~]# cp .bashrc .bashrc_test
[root@www ~]# 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  <==新文件的屬性沒變

由於復制行為(cp)會復制執行者的屬性與權限,所以!怎么辦?.bashrc_test還是屬於root所擁有, 如此一來,即使你將文件拿給bin這個使用者了,那他仍然無法修改的(看屬性/權限就知道了吧), 所以你就必須要將這個文件的擁有者與群組修改一下!

改變權限:chmod

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

 

數字類型改變文件權限

Linux文件的基本權限就有九個,分別是owner/group/others三種身份各有自己的read/write/execute權限, 先復習一下剛剛上面提到的數據:

文件的權限字符為:『-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@www ~]# chmod [-R] xyz 文件或目錄
選項與參數:
xyz : 就是剛剛提到的數字類型的權限屬性,為 rwx 屬性數值的相加。
-R : 進行遞歸(recursive)的持續變更,亦即連同次目錄下的所有文件都會變更

舉例來說,如果要將.bashrc這個文件所有的權限都設定啟用,那么就下達:

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

那如果要將權限變成『 -rwxr-xr-- 』呢?那么權限的分數就成為 [4+2+1][4+0+1][4+0+0]=754 啰!所以你需要下達『 chmod 754 filename』。 另外,在實際的系統運作中最常發生的一個問題就是,常常我們以vim編輯一個shell的文字批處理文件后,他的權限通常是 -rw-rw-r-- 也就是664, 如果要將該文件變成可執行文件,並且不要讓其他人修改此一文件的話, 那么就需要-rwxr-xr-x這樣的權限,此時就得要下達:『 chmod 755 test.sh 』的指令啰!另外,如果有些文件你不希望被其他人看到,那么應該將文件的權限設定為例如:『-rwxr-----』,那就下達『chmod 740 filename 』吧!

 

符號類型改變文件權限

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

        u        +        r
chmod   g        -        w        文件或目錄
        o        =        x
        a

來實作一下吧!假如我們要『設定』一個文件的權限成為『-rwxr-xr-x』時,基本上就是:

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

所以就是:

[root@www ~]# chmod u=rwx,go=rx .bashrc

# 注意喔!那個 u=rwx,go=rx 是連在一起的,中間並沒有任何空格!

[root@www ~]# ls -al .bashrc
-rwxr-xr-x 1 root root 395 Jul 4 11:45 .bashrc

那么假如是『 -rwxr-xr-- 』這樣的權限呢?可以使用『 chmod u=rwx,g=rx,o=r filename 』來設定。此外,如果我不知道原先的文件屬性,而我只想要增加.bashrc這個文件的每個人均可寫入的權限, 那么我就可以使用:

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

而如果是要將權限去掉而不更動其他已存在的權限呢?例如要拿掉全部人的可執行權限,則:

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

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

 

 

Linux文件種類與擴展名

我們在基礎篇一直強調一個概念,那就是:任何裝置在Linux底下都是文件, 不僅如此,連數據溝通的接口也有專屬的文件在負責~所以,你會了解到,Linux的文件種類真的很多~ 除了前面提到的一般文件(-)與目錄文件(d)之外,還有哪些種類的文件呢?

我們在剛剛提到使用『ls -l』觀察到第一欄那十個字符中,第一個字符為文件的類型。 除了常見的一般文件(-)與目錄文件(d)之外,還有哪些種類的文件類型呢?

  • 正規文件(regular file ):
    就是一般我們在進行存取的類型的文件,在由 ls -al 所顯示出來的屬性方面,第一個字符為 [ - ],例如 [-rwxrwxrwx ]。另外,依照文件的內容,又大略可以分為:

    • 純文本檔(ASCII):這是Linux系統中最多的一種文件類型啰, 稱為純文本檔是因為內容為我們人類可以直接讀到的數據,例如數字、字母等等。 幾乎只要我們可以用來做為設定的文件都屬於這一種文件類型。 舉例來說,你可以下達『 cat ~/.bashrc 』就可以看到該文件的內容。 (cat 是將一個文件內容讀出來的指令)

    • 二進制文件(binary):Linux當中的可執行文件(scripts, 文字型批處理文件不算)就是這種格式的啦~ 舉例來說,剛剛下達的指令cat就是一個binary file。

    • 數據格式文件(data): 有些程序在運作的過程當中會讀取某些特定格式的文件,那些特定格式的文件可以被稱為數據文件 (data file)。舉例來說,我們的Linux在使用者登入時,都會將登錄的數據記錄在 /var/log/wtmp那個文件內,該文件是一個data file,他能夠透過last這個指令讀出來! 但是使用cat時,會讀出亂碼~因為他是屬於一種特殊格式的文件。瞭乎?

  • 目錄(directory):
    就是目錄啰~第一個屬性為 [ d ],例如 [drwxrwxrwx]。

  • 連結檔(link):
    就是類似Windows系統底下的快捷方式啦! 第一個屬性為 [ l ](英文L的小寫),例如 [lrwxrwxrwx] ;

  • 設備與裝置文件(device):
    與系統周邊及儲存等相關的一些文件, 通常都集中在/dev這個目錄之下!通常又分為兩種:

    • 區塊(block)設備檔 :就是一些儲存數據, 以提供系統隨機存取的接口設備,舉例來說,硬盤與軟盤等就是啦! 你可以隨機的在硬盤的不同區塊讀寫,這種裝置就是成組設備啰!你可以自行查一下/dev/sda看看, 會發現第一個屬性為[ b ]喔!

    • 字符(character)設備文件:亦即是一些串行端口的接口設備, 例如鍵盤、鼠標等等!這些設備的特色就是『一次性讀取』的,不能夠截斷輸出。 舉例來說,你不可能讓鼠標『跳到』另一個畫面,而是『滑動』到另一個地方啊!第一個屬性為 [ c ]。
  • 數據接口文件(sockets):
    既然被稱為數據接口文件, 想當然爾,這種類型的文件通常被用在網絡上的數據承接了。我們可以啟動一個程序來監聽客戶端的要求, 而客戶端就可以透過這個socket來進行數據的溝通了。第一個屬性為 [ s ], 最常在/var/run這個目錄中看到這種文件類型了。

  • 數據輸送文件(FIFO, pipe):
    FIFO也是一種特殊的文件類型,他主要的目的在解決多個程序同時存取一個文件所造成的錯誤問題。 FIFO是first-in-first-out的縮寫。第一個屬性為[p] 。

除了設備文件是我們系統中很重要的文件,最好不要隨意修改之外(通常他也不會讓你修改的啦!), 另一個比較有趣的文件就是連結檔。如果你常常將應用程序捉到桌面來的話,你就應該知道在 Windows底下有所謂的『快捷方式』。同樣的,你可以將 linux下的連結檔簡單的視為一個文件或目錄的快捷方式。 至於socket與FIFO文件比較難理解,因為這兩個咚咚與程序(process)比較有關系, 這個等到未來你了解process之后,再回來查閱吧!此外, 你也可以透過man fifo及man socket來查閱系統上的說明!

Linux文件擴展名

基本上,Linux的文件是沒有所謂的『擴展名』的,我們剛剛就談過,一個Linux文件能不能被執行,與他的第一欄的十個屬性有關, 與檔名根本一點關系也沒有。這個觀念跟Windows的情況不相同喔!在Windows底下, 能被執行的文件擴展名通常是 .com .exe .bat等等,而在Linux底下,只要你的權限當中具有x的話,例如[ -rwx-r-xr-x ] 即代表這個文件可以被執行喔!

不過,可以被執行跟可以執行成功是不一樣的~舉例來說,在root家目錄下的install.log 是一個純文本檔,如果經由修改權限成為 -rwxrwxrwx 后,這個文件能夠真的執行成功嗎? 當然不行~因為他的內容根本就沒有可以執行的數據。所以說,這個x代表這個文件具有可執行的能力, 但是能不能執行成功,當然就得要看該文件的內容啰~

雖然如此,不過我們仍然希望可以藉由擴展名來了解該文件是什么東西,所以, 通常我們還是會以適當的擴展名來表示該文件是什么種類的。底下有數種常用的擴展名:

  • *.sh : 腳本或批處理文件 (scripts),因為批處理文件為使用shell寫成的,所以擴展名就編成 .sh ;

  • *Z, *.tar, *.tar.gz, *.zip, *.tgz: 經過打包的壓縮文件。這是因為壓縮軟件分別為 gunzip, tar 等等的,由於不同的壓縮軟件,而取其相關的擴展名啰!

  • *.html, *.php:網頁相關文件,分別代表 HTML 語法與 PHP 語法的網頁文件啰! .html 的文件可使用網頁瀏覽器來直接開啟,至於 .php 的文件, 則可以透過 client 端的瀏覽器來 server 端瀏覽,以得到運算后的網頁結果呢!

基本上,Linux系統上的文件名真的只是讓你了解該文件可能的用途而已, 真正的執行與否仍然需要權限的規范才行!例如雖然有一個文件為可執行文件, 如常見的/bin/ls這個顯示文件屬性的指令,不過,如果這個文件的權限被修改成無法執行時, 那么ls就變成不能執行啰!

上述的這種問題最常發生在文件傳送的過程中。例如你在網絡上下載一個可執行文件,但是偏偏在你的 Linux系統中就是無法執行!呵呵!那么就是可能文件的屬性被改變了!不要懷疑,從網絡上傳送到你的 Linux系統中,文件的屬性與權限確實是會被改變的喔!

Linux文件長度限制

在Linux底下,使用預設的Ext2/Ext3文件系統時,針對文件的檔名長度限制為:

  • 單一文件或目錄的最大容許文件名為 255 個字符;
  • 包含完整路徑名稱及目錄 (/) 之完整檔名為 4096 個字符。

是相當長的檔名喔!我們希望Linux的文件名可以一看就知道該文件在干嘛的, 所以檔名通常是很長很長!而用慣了Windows的人可能會受不了,因為文件名通常真的都很長, 對於用慣Windows而導致打字速度不快的朋友來說,嗯!真的是很困擾.....不過,只得勸你好好的加強打字的訓練!

Linux文件名的限制:

由於Linux在文字接口下的一些指令操作關系,一般來說,你在設定Linux底下的文件名時, 最好可以避免一些特殊字符比較好!例如底下這些:

* ? > < ; & ! [ ] | \ ' " ` ( ) { }

因為這些符號在文字接口下,是有特殊意義的!另外,文件名的開頭為小數點『.』時, 代表這個文件為『隱藏檔』喔!同時,由於指令下達當中,常常會使用到 -option 之類的選項, 所以你最好也避免將文件檔名的開頭以 - 或 + 來命名啊!

 文章參考 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM