一個基本概念:任何裝置在 Linux 下都是文件,數據溝通的介面也有專屬的文件在負責,Linux 的文件種類繁多,常用的是一般文件(-)與目錄文件(d)。 註意:Linux 文件類型和文件的文件名所代表的意義是兩個不同的概念,在 linux 中文件類型與文件擴展名沒有關係。它不像 Windows 那... ...
Linux 系統由 Linux 內核、shell、文件系統和第三方應用軟體組成。Linux 文件許可權與屬性是學習 Linux 系統的一個重要關卡,必須理解這個部分內容的概念。
一,文件類型
1.1,概述
一個基本概念:任何裝置在 Linux 下都是文件,數據溝通的介面也有專屬的文件在負責,Linux 的文件種類繁多,常用的是一般文件(-
)與目錄文件(d
)。
註意:Linux
文件類型和文件的文件名所代表的意義是兩個不同的概念,在 linux
中文件類型與文件擴展名沒有關係。它不像 Windows
那樣是依靠文件尾碼名來區分文件類型的,在 linux
中文件名只是為了方便操作而的取得名字。Linux
文件類型常見的有:普通文件、目錄、字元設備文件、塊設備文件、符號鏈接文件等。
查看文件類型方法,使用 ls -al
命令列出的信息中第一欄十個字元中,第一個字元為文件的類型。
1.2,正規文件(regular file)
就是一般我們在進行存取的類型的文件,在由 ls -al
所顯示出來的屬性方面,第一個字元為 -
,例如 -rwxrwxrwx
。另外,依照文件的內容,又大略可以分為:
- 純文本檔(
ASCII
):Linux 系統中最為常見的一種文件類型,稱為純文本是因為文件內容為人類可以直接讀取到的數據,例如數字、字母等。 - 二進位文件(
binary
):Linux 系統僅認識且可以執行的二進位文件 binary file,Linux 系統中可執行的文件就是這種類型,例如 cat 就是一個 binary file。 - 數據格式文件(
data
): 有些程式在運作的過程當中會讀取某些特定格式的文件,那些特定格式的文件可以被稱為數據文件 (data file
)。舉例來說,我們的 Linux 在使用者登入時,都會將登錄的數據記錄在/var/log/wtmp
文件內,該文件是一個data file
,它能夠通過last
這個指令讀出來,但是使用cat
命令讀取時會讀出亂碼,因為他是屬於一種特殊格式的文件。
1.3,目錄(directory)
第一個屬性為 d
,例如 drwx------
。
1.4,鏈接文件(link)
類似 Windows 系統下的快捷鍵,第一個屬性為 l
,例如 lrwxrwxrwx
。
1.5,設備與裝置文件(device)
與系統周邊設備及存儲相關的一些文件,通常集中在 /dev
目錄下,一般分為兩種:
- 區塊(block)設備類型:就是一些儲存數據, 以提供系統隨機存取的介面設備,比如硬碟設備,第一個屬性為
b
。 - 字元(character)設備文件:一些串列埠的介面設備,例如鍵盤、滑鼠、攝像頭等。這些設備的特性是**一次性讀取",不能夠截斷輸出,第一個屬性為
c
。
1.6,資料介面文件(sockets):
被用於網路上的數據連接了。我們可以啟動一個程式來監聽客戶端的要求, 而客戶端就可以透過這個 socket
來進行數據的溝通了。第一個屬性為 s
,最常在 /run
或 /tmp
這些目錄中可以看到這種文件類型。
1.7,數據輸送文件(FIFO, pipe):
FIFO
也是一種特殊的文件類型,他主要的目的在解決多個程式同時存取一個文件所造成的錯誤問題。FIFO
是 first-in-first-out
的縮寫。第一個屬性為 p
。
1.8,文件拓展名
註意 Linux 系統的文件是沒有所謂的拓展名的。 一個 Linux 文件能不能被執行,與他的 ls -al
展示的文件信息的第一欄的十個屬性有關, 與文件名根本一點關係也沒有,這與 Windows 不同,在Linux 系統下,只要用戶的許可權有 x
,文件就可以被執行。擁有了 x
許可權,表示文件可以被執行,但是只有具有可執行的程式代碼文件才能被執行,文本等文件即使有許可權也是不能執行成功的。
二,文件屬性與許可權
2.1,Linux 文件屬性
ls -al
命令:列出所有的文件詳細的許可權與屬性 (包含隱藏文件-文件名第一個字元為『 .
』的文件)。 ls -al
展示的文件屬性信息如下:
- 第一列代表這個文件的類型與許可權(permission);第一列的第一個字元代表這個文件是『目錄、 文件或鏈接文件等等文件類型』:
- 當為
d
則是目錄,例如上圖文件名為『.config』的那一行; - 當為
-
則是文件,例如上圖文件名為『initial-setup-ks.cfg』那一行; - 若是
l
則表示為鏈接文件(link file); - 若是
b
則表示為裝置文件裡面的可供儲存的介面設備(可隨機存取裝置); - 若是
c
則表示為裝置文件裡面的串列埠設備,例如鍵盤、滑鼠(一次性讀取裝置)。
- 當為
- 第二列表示有多少文件名連結到此節點(i-node);
- 第三列表示這個文件(或目錄)的『擁有者賬號』;
- 第四列表示這個文件的所屬群組;
- 第五列為這個文件的容量大小,預設單位為
bytes
; - 第六列為這個文件的建檔日期或者是最近的修改日期;
- 第七列為這個文件的文件名。
ls -al
命令展示的文件屬性的七個欄位的意義很重要,必須理解和熟記,這是掌握 Linux
文件許可權與目錄管理的基礎知識。
2.2,Linux 文件許可權
Linux 文件的基本許可權就有九個,分別是 owner/group/others
三種身份各有自己的 read/write/execute
許可權。在 Linux 中,對於文件的許可權(rwx
),分為三部分,第一部分是該文件的擁有者所擁有的許可權,第二部分是該文件所在用戶組的用戶所擁有的許可權,最後一部分是其他用戶所擁有的許可權。
每個文件/文件夾的屬性都用 10
個字元表示,第一個字元如果是 d
:表示文件夾,如果是 -
:表示文件。用(rwx
)表示文件許可權,其中r
: 可讀(4)
,w
: 可寫(2)
,x
: 可執行(1
)。舉例,drwxr-xrw-
表示文件夾擁有者擁有可讀可寫可執行的許可權,用戶所在用戶組和其他用戶無任何許可權,命令的詳細解釋如下。
- 從第二到第四位
(rwx)
是文件所有者的許可權:可讀、可寫、可執行。 - 從第五到第七位
(r-x)
文件夾用戶擁有者所在組的許可權:可讀、可執行。 - 從第八位到第十位
(rw-)
其他人對這個文件夾操作的許可權.:可讀、可寫。
Linux
系統查看文件/目錄許可權示例,如下:
root@5b84c8f05303:/data/project# ls -al
total 16
drwx------ 4 1018 1002 4096 Jul 20 02:59 .
drwx------ 8 1018 1002 4096 Jul 20 02:57 ..
drwx------ 6 1018 1002 4096 Jul 20 02:57 DeepPruner
-rw-r--r-- 1 root root 0 Jul 20 02:59 demo.py
drwx------ 8 1018 1002 4096 Jul 20 02:57 nn_tools-master
2.3,如何改變文件屬性和許可權
Linux/Unix
是多人多工操作系統,所有的文件皆有擁有者。利用 chown
命令可以改變文件的擁有者(用戶)和群組,用戶可以是用戶名或者用戶 ID
,組可以是組名或者組 ID
。註意,普通用戶不能將自己的文件改變成其他的擁有者,其操作許可權一般為管理員(root 用戶);同時用戶必須是已經存在系統中的賬號,也就是在 /etc/passwd
這個文件中有紀錄的用戶名稱才能改變。
三個常用於群組、擁有者、各種身份的許可權之修改的命令,如下所示:
chown
: 改變文件的擁有者。如遞歸子目錄修改命令:chown -R user_name folder/
chgrp
: 改變文件所屬群組。chmod
: 改變文件讀、寫、執行許可權(許可權分數r:4 w:2 x:1
)屬性。如增加腳本可執行許可權命令:chmod a+x myscript
。
添加用戶和用戶組的命令:adduser
groupadd
,其簡單用法如下所示:
adduser harley
:新建 harley 用戶passwd harley
:給 harley 用戶設置密碼groupadd harley
:新建 harley工作組useradd -g harley harley
:新建 harley 用戶並增加到 harley 工作組
改變所屬群組 chgrp/chown/chmod 命令的用法如下:
$ chgrp [-R] group dirname/filename # -R : 進行遞歸(recursive)的持續變更,亦即連同子目錄下的所有文件、目錄都更新成為這個群組之意。
$ chown [-R] 賬號名稱 文件或目錄
$ chown [-R] 賬號名稱:組名 文件或目錄
$ chmod [-R] xyz 文件或目錄 # xyz : 數字類型的許可權屬性分數值, 為 rwx 屬性數值的相加。
chgrp
範例:將 test
的工作組從 harley
改為 root
(前提是當前用戶切換為 root
了,否則會提示許可權不足的錯誤):
chmod
範例:將 .bashrc
這個文件所有的許可權都設定啟用。
root@17c30d837aba:~# ls -al .bashrc
-rw-r--r-- 1 root root 3479 Jan 8 03:14 .bashrc
root@17c30d837aba:~# chmod 777 .bashrc
root@17c30d837aba:~# ls -al .bashrc
-rwxrwxrwx 1 root root 3479 Jan 8 03:14 .bashrc
2.4,文件與目錄的許可權意義
我們可以利用 ls -al
命令查看文件屬性及許可權,已知了 Linux
系統內文件的三種身份(擁有者、群組與其他人),每種身份都有三種許可權(rwx
),再使用 chown
, chgrp
, chmod
去修改這些許可權與屬性。
文件是實際含有數據的地方,包括一般文本文件、資料庫內容文件、二進位可執行文件(binary program)等等。因此,許可權對於文件來說,他的意義是這樣的:
r (read)
:可讀取此一文件的實際內容,如讀取文本文件的文字內容等;w (write)
:可以編輯、新增或者是修改該文件的內容(但不含刪除該文件);x (eXecute)
:該文件具有可以被系統執行的許可權。Linux 底下, 文件是否能被執行,是由x
這個許可權來決定的!跟文件名是沒有絕對的關係,即使是能夠執行成功的.sh
腳本文件,如果沒有x
可執行許可權,文件也不能被執行。
目錄主要的內容是記錄文件名列表,文件名與目錄有強烈的關連。對一般文件來說, rwx
主要是針對『文件的內容』來設計許可權,對目錄來說, rwx
則是針對『目錄內的文件名列表』來設計許可權。許可權對文件和目錄重要性的理解彙總成如下表格:
三,Linux 文件屬性與許可權總結
利用 ls -al
命令查看文件屬性及許可權,已知了 Linux
系統內文件的三種身份(文件擁有者、文件所屬群組與其他用戶),每種身份都有四種許可權(rwxs
)。可以使用 chown
, chgrp
, chmod
去修改這些許可權與屬性。文件是實際含有數據的地方,包括一般文本文件、資料庫內容文件、二進位可執行文件(binary program)等等。
四,參考資料
《鳥哥的Linux私房菜 基礎篇 第四版》