我們在使用 Linux 的過程中,或多或少都會遇到一些關於使用者和群組的問題,比如最常見的你想要在某個路徑下執行某個指令,會經常出現這個錯誤提示 。
permission denied反正我大概率見到這個錯誤都是在使用 FTP 傳輸文件的時候,等了半天傳輸百分比還是零,我說網路這麼慢么?怎麼都不傳輸呢?其實我不知道,這是由於許可權問題所致。
我一般的修復方式是直接賦予 777 許可權,或者直接使用 su 管理員登錄。。。。。。
大家可能不太知道我說的是什麼,也有一些大佬可能覺得我這種方式太 low 了,不管怎樣,遇到這種問題就是說你得許可權不夠,為什麼呢?下面我們就需要來認識一下 Linux 中的使用者和群組了。
使用者和群組
在 Linux 中,關於文件所有者分為三類,即文件所有者、群組和其他人所屬,這裡分別解釋以下這三個概念
- 文件所有者
Linux 是一個多用戶多任務系統,多用戶就意味著有些用戶創建的文件是否對其他用戶可見,這是一種可見性問題,同時也是一種隱私性問題,為了考慮到每個人的隱私權,Linux 設計了文件所有者的角色。如果你有一些資料和文件的隱私性比較高,你就可以把文件設置成 “只有我自己可見” ,這就是文件所有者的作用。
- 群組
群組的這個概念用在團隊開發中,用處比較多的就是為項目設置許可權,比如你就職於一個銀行的外包部門,你和其他外包部門共同為某個銀行服務,所有的外包團體都使用一台伺服器,這就會涉及到群組許可權的問題,你們外包部門開發的項目不想讓其他外包部門所看到,就會把該項目設置成群組可見。但是銀行是總負責人,所有銀行具有查看你們所有外包部門項目的許可權,因此,你還需要設置銀行的許可權。
- 其他人所屬
其他人和群組是相對的,其他人在群組之外,沒有許可權查看群組內文件的一種許可權關係。
除了上面三個概念之外,還有一個許可權級別最高的大佬,它就是 root,這個 root 許可權是最高的。
Linux 文件許可權
在聊完上面使用者和群組的概念之後,接下來我們就來談一下文件許可權要如何設置的問題,這塊內容是很重要的,因為這部分內容是很好解決 permission denied 問題的關鍵。
許可權屬性
首先登錄 Linux 系統,使用 su – 可以切換成為 root 身份,然後執行 ls -al 會看到下面這些

一共有七列內容,這七列內容如下圖所示。

學習的時候可以直接使用 root ,因為後續的 chgrp,chown 等指令都需要 root 來處理,但是工作中強烈建議不要使用 root 許可權。
使用 exit 可以退出 root 身份。
上面這段指令中,ls 是 list 的意思,也就是列出,而選項 -al 則表示文件詳細許可權和屬性。
- 許可權,第一列表示的是許可權,許可權一共通過 10 個字元來表示,我們拿 home 許可權為例,來列舉各個字元表示的含義

第一個字元表示的是文件類型,文件類型有很多種,一般 [d] 表示的是目錄,能用cd命令進入到這個目錄中。可以看到圖中幾乎所有都是目錄。

如果是 [-] 則表示文件,如果是 [l] 則表示鏈接文件,如果是 [b] 則表示設備文件中的可隨機存取設備,如果是 [c] 則表示為設備文件中的一次性讀取設備(鍵盤、滑鼠)。
接下來的九個字元分為三組,三個一組,分別表示所屬人、所屬群組、其他所有者許可權,每組內的許可權都是三個 rwx 的組合,[r] 表示可讀,[w]表示可寫,[x] 表示可執行,這裡需要注意的是,如果沒有許可權,就會變為 -號。
- 鏈接,這一列表示有多少文件名鏈接到這個節點(i-node)上,每個文件都會將它的許可權和屬性記錄到文件系統的 i-node 上,不過,我們使用的目錄樹卻是使用文件名來記錄的,因此每個文件名都會關聯到一個 i-node ,所以這個屬性就是記錄有多少文件鏈接到了同一個 i-node 上。
什麼是 i-node ?
i-node 的描述方式很像是我們之前聊過的 Socket,Socket 就是一個四元組,有時會加上協議類型變為五元組,如果你不太清楚我說的是什麼,可以看下我的這篇文章 原來這才是 Socket!
我們知道,磁碟的最小存儲單位是扇區,操作系統在讀取扇區時,不會一個扇區接著一個扇區這樣讀取,因為效率太低,而是以塊為單位進行讀取,塊是由多個扇區組成的。
文件中的數據都存儲在扇區中,但是我們並不知道哪一塊數據是我們需要的,為了存儲一些文件的元信息,比如文件的創建者,創建日期,文件的大小,開發人員提出了 i-node ,也就是索引節點。一般來說,i-node 具有如下內容
具體關於 i-node 的內容,我們後面還會再說。
- 然後第三列表示這個文件的所屬人,由圖可見,大部分文件的所屬人都是 root 用戶。
- 第四列表示這個文件的所屬群組,在 Linux 系統下,你登錄的賬號會添加到一個或者多個所有人群組中,這一欄就表示對應的群組許可權。
- 第五列表示文件大小,默認單位為位元組(Bytes)。
- 第六列為創建這個文件的日期和最近修改日期,從圖中可以看到,這個日期格式有可能不是我們想要的,如果要顯示完整的日期格式,可以使用 ls -l –full-time,包括年、月、日、時間。
如果想要讓系統默認的語系變為英文的話,那麼你可以修改系統配置文件 /etc/locale.conf,首先我們可以查看一下系統都支持哪些語言。

修改默認語言,輸入
vi /etc/profile在文檔的最後輸入
export LANG="en_US.UTF-8"就可以切換成為英文,如果想使用中文,可以輸入
export LANG="zh_CN.GB18030"然後使用 esc + :wq 保存,保存之後使用
source /etc/profile即可完成設置。
- 第七列為文件名,有一類特殊的文件名,它表示著隱藏文件,如果文件名之前多一個 . ,那就表示隱藏文件。
許可權的重要性
- 提供系統保護:非許可權用戶不能操作具有某些許可權的功能和數據。
- 適合團隊開發和數據共享:團隊所有組成員和個人所屬能夠共享項目。
如果沒有恰當的設置系統許可權,可能會造成某些泄密事件或者其他不可忽視的後果,所以許可權問題大家要引起重視,下面我們就來聊一聊如何設置系統許可權。
改變系統許可權和屬性
我們現在知道文件許可權對於一個系統安全的重要性了,現在就要聊一聊如何修改文件許可權了。常用的修改文件許可權的指令有
- chgrp :改變文件所屬群組
- chown:改變文件所有者
- chmod:改變文件許可權
chgrp
chgrp 就是 change group 的縮寫,我覺得李納斯把縮寫用到了極致,這也許是我們現在對於縮寫這麼流行的原因。chgrp 能夠改變文件群組,不過,要改變群組的話,要被改變的群組名稱要在 /etc/group 文件內存在才行,否則就會顯示錯誤。
chown
既然 chgrp 能夠改變文件群組,那麼 chown 能夠改變文件所有者,同樣也需要注意的是,文件所有者必須是系統中存在的賬號,也就是在 /etc/passwd 這個文件中有記錄的使用者名稱才可改變。除此之外,chown 還可以直接修改群組名稱。
chmod
變更文件許可權使用的是 chmod 這個指令,但是,許可權的設置有兩種方式,可以分別使用數字或者符號進行許可權變更。
- 使用數字改變文件許可權
Linux 文件基本許可權有 9 種,分別是 owner/group/others 三種身份加自己的 read/write/execute 許可權,這九個許可權三個為一組,我們可以使用數字表示各個許可權。
一般 r 表示 4;w 表示 2;x 表示 1,每種身份各自的許可權是需要累加的,比如 rwx 就表示 4 + 2 + 1 = 7。比如我們最常見的 chmod 777 它就表示賦予所有的許可權,也就是說誰都能看/寫/執行,所以這種文件也存在極大的安全問題。使用數字改變文件許可權是我們最常用的一種方式。
- 使用符號改變文件許可權
九種文件許可權分別對應著:(1) user (2) group (3) others,所以我們可以藉由 u,g,o 來代表三種身份的許可權。除此之外,a 代表 all 即全部的身份。
比如我們想要給 -rwxr-xr-x 設置許可權,那麼我們所使用的命令應該是
chmod u=rwx,go=rx .filename如果我們想要給所有人增加寫入許可權,就可以這麼操作
chmod a+w .filename如果我們想給所有人去掉寫入許可權,就可以這麼寫入指令
chmod a-w .filename我們上面列出了三種指令,分別是 =、+、- 號,= 號表示賦值指定許可權,+ 號表示增加許可權,- 號表示去掉某些許可權,在 + 和 – 的狀態下,只要沒找到指令的項目,那麼該許可權不會發生變動。
Linux 目錄和文件許可權
我們上面聊的都是文件許可權,文件是容納數據的地方,這些文件包括一般文本文件、資料庫文件、二進位文件等,許可權對於文件的意義在於
- r(read):可以讀取文件的實際內容,比如讀取文本文件的文字內容
- w(write):可以新增、編輯或者修改文件中的內容(不包括刪除文件)
- x(execute):使文件具有被文件系統執行的許可權。
Windows 下面判斷文件是否能夠執行的因素是看文件擴展名, 比如 .exe, .bat, .com 等等,但是在 Linux 中,判斷文件是否具有可執行許可權是直接判斷文件有沒有 x 這個許可權,和文件名無關。
但是在 Linux 中,不只有文件具有許可權,目錄也有許可權,文件是存放實際數據的地方,而目錄是記錄文件所在位置的清單,我們只有通過目錄才能找到文件放在哪裡!許可權對於不同的目錄,也代表著不同的概念。
- r (read contents in directory):表示具有讀取目錄結構清單的許可權,所以如果你具有讀取一個目錄的許可權時,就代表你可以查詢目錄下的文件,所以你就可以使用 ls 將目錄的內容顯示出來。
- w(modify contents of directory):寫入許可權表示你具有對文件目錄和目錄中的文件進行修改的操作,主要包括
- 刪除已經存在的文件和目錄。
- 創建新的文件和目錄。
- 將已存在的文件或目錄進行改名。
- 移動目錄內文件、目錄位置。
- x(access directory):這執行許可權有啥用?總不能目錄也能夠被執行把?其實並不是這樣,執行許可權表示著你有沒有許可權進入到指定目錄下,也就是 cd(change directory) 。
Linux 文件種類和擴展名
想必大家都聽說過這樣一句話:任何設備在 Linux 下都是文件,但是文件也分為多種,除了上面介紹過的一般文件(-) 和目錄文件(d) 之外,還包括下面這些文件類型
- 常規文件(regular file):常規文件就是我們使用 ls -al 所顯示出來的屬性,也就是上面我們列出的第一個字元,

文件類型又可以分為
- 純文本文件(ASCII),這是 Linux 系統中最多的一種文件類型,純文本文件是我們能夠直接看到的數據,你可以使用 cat 來直接看到這部分內容。比如我們最常用的設置 Linux 靜態 ip 的文件 ens33 ,就可以使用 cat 命令來輸出
cat ifcfg-ens33
- 二進位文件,在 Linux 中,查看二進位文件可以使用 xxd 或者 od 進行格式化輸出
- 數據格式文件,數據文件直接使用 cat 讀取會顯示亂碼,但是它能夠通過 last 指令進行輸出
- 目錄,目錄沒什麼好說的,就是表示一個文件清單,目錄的表示就是 [d],也就是 directory。
- 鏈接文件(link),鏈接文件就是某些程序執行時需要和這些鏈接文件進行鏈接才能執行的一種文件類型。
- 設備與設備文件(device),Linux 下的設備分為兩種,塊設備和字元設備:
塊設備是一個能存儲固定大小塊信息的設備,它支持以固定大小的塊,扇區或群集讀取和(可選)寫入數據。每個塊都有自己的物理地址。通常塊的大小在 512 – 65536 之間。所有傳輸的信息都會以連續的塊為單位。塊設備的基本特徵是每個塊都較為對立,能夠獨立的進行讀寫。常見的塊設備有 硬碟、藍光光碟、USB 盤。
塊設備一般位於 /dev/sda 下,它的第一個屬性為 [b]。

另一類 I/O 設備是字元設備。字元設備以字元為單位發送或接收一個字元流,而不考慮任何塊結構。字元設備是不可定址的,也沒有任何尋道操作。常見的字元設備有 印表機、網路設備、滑鼠、以及大多數與磁碟不同的設備。

字元設備最大的特點就是一次性讀取,不能夠截斷輸出,舉例來說,你不可能將滑鼠一下跳到另外一個地方,而是採用平滑移動的方式才可以,字元設備的第一個屬性是 [c]。
- 數據介面文件(sockets):數據介面文件顧名思義就是利用 socket 承接網路數據的,它的屬性是 [s],一般在 /run 或者 /tmp 這些目錄中看到。
- 數據輸送文件(FIFO,pipe):FIFO 也是一種特殊類型的文件,它的主要目的在於解決多個程序同時存取一個文件所造成的的錯誤問題,它的第一個屬性為 [p]。
Linux 擴展名
說到這個擴展名其實就很頭疼,Linux 中是沒有擴展名這個概念的,但是又有一些擴展名的命名方式,這就很尷尬,所以暫且成為擴展類型吧。一般有下面幾種
- *.sh ,這是一個執行腳本或者批處理腳本,一般也被稱為 shell 腳本,裡面是一些 shell 語法寫的指令。
- .tar,.tar.gz,.zip,*.tgz,這種擴展類型是打包的壓縮文件,根據不同的打包方式有不同的擴展類型
- .html ,.php :網頁相關文件,分別代表 HTML 和 PHP 語法的網頁文件。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/226387.html
微信掃一掃
支付寶掃一掃