1 Linux檔案屬性
ls是『list』的意思,重點在顯示檔案的檔名與相關屬性。
而選項『-al』則表示列出所有的檔案詳細的權限與屬性 (包含隱藏檔,就是檔名第一個字元為『 . 』的檔案)。
如上所示,在你第一次以root身份登入Linux時, 如果你輸入上述指令後,應該有上列的幾個東西,先解釋一下上面七個欄位個別的意思:
圖5.2.1、檔案屬性的示意圖
- 第一欄代表這個檔案的類型與權限(permission):
這個地方最需要注意了!仔細看的話,你應該可以發現這一欄其實共有十個字元:(圖5.2.1及圖5.2.2內的權限並無關係)

接下來的字元中,以三個為一組,且均為『rwx』 的三個參數的組合。
其中,[ r ]代表可讀(read)、[ w ]代表可寫(write)、[ x ]代表可執行(execute)。
要注意的是,這三個權限的位置不會改變,如果沒有權限,就會出現減號[ - ]而已。
- 第一組為『檔案擁有者可具備的權限』,以『initial-setup-ks.cfg』那個檔案為例, 該檔案的擁有者可以讀寫,但不可執行;
- 第二組為『加入此群組之帳號的權限』;
- 第三組為『非本人且沒有加入本群組之其他帳號的權限』。
例題:
答:
[-][rwx][r-x][r--]1 為:代表這個檔名為目錄或檔案,本例中為檔案(-);
1 234 567 890
234為:擁有者的權限,本例中為可讀、可寫、可執行(rwx);
567為:同群組使用者權限,本例中為可讀可執行(rx);
890為:其他使用者權限,本例中為可讀(r),就是唯讀之意
同時注意到,rwx所在的位置是不會改變的,有該權限就會顯示字元,沒有該權限就變成減號(-)就第二欄表示有多少檔名連結到此節點(i-node):
每個檔案都會將他的權限與屬性記錄到檔案系統的i-node中,
不過,我們使用的目錄樹卻是使用檔名來記錄,
因此每個檔名就會連結到一個i-node囉!這個屬性記錄的,
就是有多少不同的檔名連結到相同的一個i-node號碼去就是了。
- 第三欄表示這個檔案(或目錄)的『擁有者帳號』
- 第四欄表示這個檔案的所屬群組
- 第五欄為這個檔案的容量大小,預設單位為bytes
- 第六欄為這個檔案的建檔日期或者是最近的修改日期:
這一欄的內容分別為日期(月/日)及時間。如果這個檔案被修改的時間距離現在太久了,那麼時間部分會僅顯示年份而已。
- 第七欄為這個檔案的檔名
這個欄位就是檔名了。比較特殊的是:如果檔名之前多一個『 . 』,
則代表這個檔案為『隱藏檔』,例如上表中的.config那一行,該檔案就是隱藏檔。
你可以使用『ls』及『ls -a』這兩個指令去感受一下什麼是隱藏檔囉!
這七個欄位的意義是很重要的!務必清楚的知道各個欄位代表的意義!尤其是第一個欄位的九個權限, 那是整個Linux檔案權限的重點之一。底下我們來做幾個簡單的練習,你就會比較清楚囉!
例題:
假設test1, test2, test3同屬於testgroup這個群組,如果有下面的兩個檔案,請說明兩個檔案的擁有者與其相關的權限為何?
答:
-rw-r--r-- 1 root root 238 Jun 18 17:22 test.txt -rwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 ping_tsai
|
例題:
承上一題如果我的目錄為底下的樣式,請問testgroup這個群組的成員與其他人(others)是否可以進入本目錄?
答:
drwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 groups/
|
- Linux檔案權限的重要性:
其實,最大的用途是在『資料安全性』上面的。
2 如何改變檔案屬性與權限
常用於群組、擁有者、各種身份的權限之修改的指令,如下所示:
- chgrp :改變檔案所屬群組
- chown :改變檔案擁有者
- chmod :改變檔案的權限, SUID, SGID, SBIT等等的特性
- 改變所屬群組, chgrp
請記得,要被改變的群組名稱必須要在/etc/group檔案內存在才行,否則就會顯示錯誤!
發現了嗎?檔案的群組被改成users了,但是要改成testing的時候,
就會發生錯誤~注意喔!發生錯誤訊息還是要努力的查一查錯誤訊息的內容才好! 將他英文翻譯成為中文,就知道問題出在哪裡了
- 改變檔案擁有者, chown
要注意的是, 使用者必須是已經存在系統中的帳號,也就是在/etc/passwd 這個檔案中有紀錄的使用者名稱才能改變。
- 改變權限, chmod
檔案權限的改變使用的是chmod這個指令,
但是,權限的設定方法有兩種, 分別可以使用數字或者是符號來進行權限的變更。
數字類型改變檔案權限
檔案的權限字元為:『-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的語法是這樣的:
舉例來說,如果要將.bashrc這個檔案所有的權限都設定啟用,那麼就下達:
例題:
將剛剛你的.bashrc這個檔案的權限修改回-rw-r--r--的情況吧!
答:
-rw-r--r--的分數是644,所以指令為:
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):具有可讀與執行的權限。
所以就是:
那麼假如是『 -rwxr-xr-- 』這樣的權限呢?
可以使用『 chmod u=rwx,g=rx,o=r filename 』來設定。
此外,如果我不知道原先的檔案屬性,而我只想要增加.bashrc這個檔案的每個人均可寫入的權限, 那麼我就可以使用:
而如果是要將權限去掉而不更動其他已存在的權限呢?例如要拿掉全部人的可執行權限,則:
3 目錄與檔案之權限意義:
- 權限對檔案的重要性
檔案是實際含有資料的地方,包括一般文字檔、資料庫內容檔、二進位可執行檔(binary program)等等。 因此,權限對於檔案來說,他的意義是這樣的:
- r (read):可讀取此一檔案的實際內容,如讀取文字檔的文字內容等;
- w (write):可以編輯、新增或者是修改該檔案的內容(但不含刪除該檔案);
- x (eXecute):該檔案具有可以被系統執行的權限。
在Linux底下,我們的檔案是否能被執行,則是藉由是否具有『x』這個權限來決定的!跟檔名是沒有絕對的關係的!
當你對一個檔案具有w權限時,你可以具有寫入/編輯/新增/修改檔案的內容的權限, 但並不具備有刪除該檔案本身的權限!
- 權限對目錄的重要性
檔案是存放實際資料的所在,那麼目錄主要是儲存啥玩意啊?目錄主要的內容在記錄檔名清單,檔名與目錄有強烈的關連啦! 所以如果是針對目錄時,那個 r, w, x 對目錄是什麼意義呢?
- r (read contents in directory):
表示具有讀取目錄結構清單的權限,所以當你具有讀取(r)一個目錄的權限時,表示你可以查詢該目錄下的檔名資料。 所以你就可以利用 ls 這個指令將該目錄的內容列表顯示出來! - w (modify contents of directory):
這個可寫入的權限對目錄來說,是很了不起的! 因為他表示你具有異動該目錄結構清單的權限,也就是底下這些權限:
- 建立新的檔案與目錄;
- 刪除已經存在的檔案與目錄(不論該檔案的權限為何!)
- 將已存在的檔案或目錄進行更名;
- 搬移該目錄內的檔案、目錄位置。
總之,目錄的w權限就與該目錄底下的檔名異動有關就對了啦! - x (access directory):
咦!目錄的執行權限有啥用途啊?目錄只是記錄檔名而已,總不能拿來執行吧?沒錯!目錄不可以被執行,目錄的x代表的是使用者能否進入該目錄成為工作目錄的用途! 所謂的工作目錄(work directory)就是你目前所在的目錄啦!舉例來說,當你登入Linux時, 你所在的家目錄就是你當下的工作目錄。而變換目錄的指令是『cd』(change directory)囉!
現在假設『檔案是一堆文件資料夾』,所以你可能可以在上面寫/改一些資料。而『目錄是一堆抽屜』,因此你可以將資料夾分類放置到不同的抽屜去。 因此抽屜最大的目的是拿出/放入資料夾喔!
現在讓我們彙整一下資料:
元件 | 內容 | 疊代物件 | r | w | x |
檔案 | 詳細資料data | 文件資料夾 | 讀到文件內容 | 修改文件內容 | 執行文件內容 |
目錄 | 檔名 | 可分類抽屜 | 讀到檔名 | 修改檔名 | 進入該目錄的權限(key) |
大致的目錄權限概念是這樣,底下我們來看幾個範例,讓你瞭解一下啥是目錄的權限囉!
例題:
有個目錄的權限如下所示:
答:
drwxr--r-- 3 root root 4096 Jun 25 08:35 .ssh系統有個帳號名稱為vbird,這個帳號並沒有支援root群組,請問vbird對這個目錄有何權限?是否可切換到此目錄中? vbird對此目錄僅具有r的權限,因此vbird可以查詢此目錄下的檔名列表。因為vbird不具有x的權限,亦即 vbird 沒有這個抽屜的鑰匙啦! 因此vbird並不能切換到此目錄內!(相當重要的概念!)
|
如果你在某目錄下不具有x的權限, 那麼你就無法切換到該目錄下,也就無法執行該目錄下的任何指令,即使你具有該目錄的r或w的權限。
要開放目錄給任何人瀏覽時,應該至少也要給予r及x的權限,但w權限不可隨便給
為什麼w不能隨便給,我們來看下一個例子:
例題:
假設有個帳號名稱為dmtsai,他的家目錄在/home/dmtsai/,dmtsai對此目錄具有[rwx]的權限。 若在此目錄下有個名為the_root.data的檔案,該檔案的權限如下:
答:
-rwx------ 1 root root 4365 Sep 19 23:20 the_root.data請問dmtsai對此檔案的權限為何?可否刪除此檔案? 如上所示,由於dmtsai對此檔案來說是『others』的身份,因此這個檔案他無法讀、無法編輯也無法執行, 也就是說,他無法變動這個檔案的內容就是了。
但是由於這個檔案在他的家目錄下, 他在此目錄下具有rwx的完整權限,因此對於the_root.data這個『檔名』來說,他是能夠『刪除』的! 結論就是,dmtsai這個用戶能夠刪除the_root.data這個檔案!
|
還是看不太懂?有聽沒有懂喔!
沒關係~我們底下就來設計一個練習, 讓你實際玩玩看,應該就能夠比較進入狀況啦!
不過,由於很多指令我們還沒有教, 所以底下的指令有的先瞭解即可,詳細的指令用法我們會在後面繼續介紹的。
- 先用root的身份建立所需要的檔案與目錄環境
我們用root的身份在所有人都可以工作的/tmp目錄中建立一個名為testing的目錄,
該目錄的權限為744且目錄擁有者為root。
另外,在testing目錄下在建立一個空的檔案, 檔名亦為testing。
建立目錄可用mkdir(make directory),建立空檔案可用touch(下一章會說明)來處理。
所以過程如下所示:
- 一般用戶的讀寫權限為何?觀察中
在上面的例子中,雖然目錄是744的權限設定,一般用戶應該能有 r 的權限, 但這樣的權限使用者能做啥事呢?
由於鳥哥的系統中含有一個帳號名為 dmtsai 的,請再開另外一個終端機,使用 dmtsai 登入來操作底下的任務!
- 如果該目錄屬於用戶本身,會有什麼狀況?
上面的練習我們知道了只有r確實可以讓使用者讀取目錄的檔名列表,
不過詳細的資訊卻還是讀不到的, 同時也不能將該目錄變成工作目錄(用 cd 進入該目錄之意)。
那如果我們讓該目錄變成使用者的, 那麼使用者在這個目錄底下是否能夠刪除檔案呢?底下的練習做看看:
- 使用者操作功能與權限
剛剛講這樣如果你還是搞不懂~沒關係,我們來處理個特殊的案例!假設兩個檔名,分別是底下這樣:
- /dir1/file1
- /dir2
假設你現在在系統使用 dmtsai 這個帳號,
那麼這個帳號針對 /dir1, /dir1/file1, /dir2 這三個檔名來說,
分別需要『哪些最小的權限』才能達成各項任務?
鳥哥彙整如下,如果你看得懂,恭喜你,如果妳看不懂~沒關係~未來再來繼續學!
操作動作 | /dir1 | /dir1/file1 | /dir2 | 重點 |
讀取 file1 內容 | x | r | - | 要能夠進入 /dir1 才能讀到裡面的文件資料! |
修改 file1 內容 | x | rw | - | 能夠進入 /dir1 且修改 file1 才行! |
執行 file1 內容 | x | rx | - | 能夠進入 /dir1 且 file1 能運作才行! |
刪除 file1 檔案 | wx | - | - | 能夠進入 /dir1 具有目錄修改的權限即可! |
將 file1 複製到 /dir2 | x | r | wx | 要能夠讀 file1 且能夠修改 /dir2 內的資料 |
你可能會問,上面的表格當中,很多時候 /dir1 都不必有 r 耶!為啥?
我們知道 /dir1 是個目錄,也是個抽屜!
那個抽屜的 r 代表『這個抽屜裡面有燈光』, 所以你能看到的抽屜內的所有資料夾名稱 (非內容)。
但你已經知道裡面的資料夾放在哪個地方,那,有沒有燈光有差嘛?
你還是可以摸黑拿到該資料夾的!對吧!
因此,上面很多動作中,你只要具有 x 即可!r 是非必備的!
只是,沒有 r 的話,使用 [tab] 時,他就無法自動幫你補齊檔名了!這樣理解乎?
4 Linux檔案種類與副檔名
任何裝置在Linux底下都是檔案,
不僅如此,連資料溝通的介面也有專屬的檔案在負責~
所以,你會瞭解到,Linux的檔案種類真的很多~
除了前面提到的一般檔案(-)與目錄檔案(d)之外,還有哪些種類的檔案呢?
- 檔案種類:
我們在剛剛提到使用『ls -l』觀察到第一欄那十個字元中,第一個字元為檔案的類型。、
除了常見的一般檔案(-)與目錄檔案(d)之外,還有哪些種類的檔案類型呢?
- 正規檔案(regular file ):
就是一般我們在進行存取的類型的檔案,在由 ls -al 所顯示出來的屬性方面,第一個字元為 [ - ],例如 [-rwxrwxrwx ]。另外,依照檔案的內容,又大略可以分為:
- 純文字檔(ASCII):這是Linux系統中最多的一種檔案類型囉, 稱為純文字檔是因為內容為我們人類可以直接讀到的資料,例如數字、字母等等。 幾乎只要我們可以用來做為設定的檔案都屬於這一種檔案類型。 舉例來說,你可以下達『 cat ~/.bashrc 』就可以看到該檔案的內容。 (cat 是將一個檔案內容讀出來的指令)
- 二進位檔(binary):還記得我們在『 第零章、計算機概論 』裡面的軟體程式的運作中提過, 我們的系統其實僅認識且可以執行二進位檔案(binary file)吧?沒錯~ 你的Linux當中的可執行檔(scripts, 文字型批次檔不算)就是這種格式的啦~ 舉例來說,剛剛下達的指令cat就是一個binary file。
- 資料格式檔(data): 有些程式在運作的過程當中會讀取某些特定格式的檔案,那些特定格式的檔案可以被稱為資料檔 (data file)。舉例來說,我們的Linux在使用者登入時,都會將登錄的資料記錄在 /var/log/wtmp那個檔案內,該檔案是一個data file,他能夠透過last這個指令讀出來! 但是使用cat時,會讀出亂碼~因為他是屬於一種特殊格式的檔案。瞭乎?
- 純文字檔(ASCII):這是Linux系統中最多的一種檔案類型囉, 稱為純文字檔是因為內容為我們人類可以直接讀到的資料,例如數字、字母等等。 幾乎只要我們可以用來做為設定的檔案都屬於這一種檔案類型。 舉例來說,你可以下達『 cat ~/.bashrc 』就可以看到該檔案的內容。 (cat 是將一個檔案內容讀出來的指令)
- 目錄(directory):
就是目錄囉~第一個屬性為 [ d ],例如 [drwxrwxrwx]。 - 連結檔(link):
就是類似Windows系統底下的捷徑啦! 第一個屬性為 [ l ](英文L的小寫),例如 [lrwxrwxrwx] ; - 設備與裝置檔(device):
與系統周邊及儲存等相關的一些檔案, 通常都集中在/dev這個目錄之下!通常又分為兩種:
- 區塊(block)設備檔 :就是一些儲存資料, 以提供系統隨機存取的周邊設備,舉例來說,硬碟與軟碟等就是啦! 你可以隨機的在硬碟的不同區塊讀寫,這種裝置就是區塊裝置囉!你可以自行查一下/dev/sda看看, 會發現第一個屬性為[ b ]喔!
- 字元(character)設備檔:亦即是一些序列埠的周邊設備, 例如鍵盤、滑鼠等等!這些設備的特色就是『一次性讀取』的,不能夠截斷輸出。 舉例來說,你不可能讓滑鼠『跳到』另一個畫面,而是『連續性滑動』到另一個地方啊!第一個屬性為 [ c ]。
- 區塊(block)設備檔 :就是一些儲存資料, 以提供系統隨機存取的周邊設備,舉例來說,硬碟與軟碟等就是啦! 你可以隨機的在硬碟的不同區塊讀寫,這種裝置就是區塊裝置囉!你可以自行查一下/dev/sda看看, 會發現第一個屬性為[ b ]喔!
- 資料接口檔(sockets):
既然被稱為資料接口檔, 想當然爾,這種類型的檔案通常被用在網路上的資料承接了。我們可以啟動一個程式來監聽用戶端的要求, 而用戶端就可以透過這個socket來進行資料的溝通了。第一個屬性為 [ s ], 最常在/run或/tmp這些個目錄中看到這種檔案類型了。 - 資料輸送檔(FIFO, pipe):
FIFO也是一種特殊的檔案類型,他主要的目的在解決多個程序同時存取一個檔案所造成的錯誤問題。 FIFO是first-in-first-out的縮寫。第一個屬性為[p] 。
- Linux檔案副檔名:
基本上,Linux的檔案是沒有所謂的『副檔名』的,我們剛剛就談過,
一個Linux檔案能不能被執行,與他的第一欄的十個屬性有關,
與檔名根本一點關係也沒有。
這個觀念跟Windows的情況不相同喔!
在Windows底下, 能被執行的檔案副檔名通常是 .com .exe .bat等等,
而在Linux底下,只要你的權限當中具有x的話,例如[ -rwxr-xr-x ] 即代表這個檔案具有可以被執行的能力喔!
雖然如此,不過我們仍然希望可以藉由副檔名來瞭解該檔案是什麼東西,所以, 通常我們還是會以適當的副檔名來表示該檔案是什麼種類的。底下有數種常用的副檔名:
- *.sh : 腳本或批次檔 (scripts),因為批次檔為使用shell寫成的,所以副檔名就編成 .sh 囉;
- *Z, *.tar, *.tar.gz, *.zip, *.tgz: 經過打包的壓縮檔。這是因為壓縮軟體分別為 gunzip, tar 等等的,由於不同的壓縮軟體,而取其相關的副檔名囉!
- *.html, *.php:網頁相關檔案,分別代表 HTML 語法與 PHP 語法的網頁檔案囉! .html 的檔案可使用網頁瀏覽器來直接開啟,至於 .php 的檔案, 則可以透過 client 端的瀏覽器來 server 端瀏覽,以得到運算後的網頁結果呢!
- Linux檔案長度限制(註1):
- 單一檔案或目錄的最大容許檔名為 255bytes,以一個 ASCII 英文佔用一個 bytes 來說,則大約可達 255 個字元長度。若是以每個中文字佔用 2bytes 來說, 最大檔名就是大約在 128 個中文字之譜!
- Linux檔案名稱的限制:
-
由於Linux在文字介面下的一些指令操作關係,一般來說,你在設定Linux底下的檔案名稱時, 最好可以避免一些特殊字元比較好!例如底下這些:
* ? > < ; & ! [ ] | \ ' " ` ( ) { }
因為這些符號在文字介面下,是有特殊意義的!另外,檔案名稱的開頭為小數點『.』時, 代表這個檔案為『隱藏檔』喔!同時,由於指令下達當中,常常會使用到 -option 之類的選項, 所以你最好也避免將檔案檔名的開頭以 - 或 + 來命名啊!