到許可權了。前面講到了 Linux 中的用戶和用戶主管理,其實它們的本質(或者用戶和用戶組出現的初衷)都是方便許可權管理。許可權管理對於電腦的重要性不言而喻,許可權讓每個用戶能夠安安心心的使用電腦,而不用擔心別的用戶破壞到自己的資源。如果老王手裡有一把你家的鑰匙,你是不是很蛋疼呢,如果鄰居除了老王,還有 ...
到許可權了。前面講到了 Linux 中的用戶和用戶主管理,其實它們的本質(或者用戶和用戶組出現的初衷)都是方便許可權管理。許可權管理對於電腦的重要性不言而喻,許可權讓每個用戶能夠安安心心的使用電腦,而不用擔心別的用戶破壞到自己的資源。如果老王手裡有一把你家的鑰匙,你是不是很蛋疼呢,如果鄰居除了老王,還有老趙,老李,老張...都有你家的鑰匙,你是不是更加蛋疼呢。作為多用戶的 Linux 而言,許可權管理至關重要。
1.Linux 文件許可權的規定
前文提到,Linux 規定一個文件必須要有三種許可權:文件所屬主許可權,文件所屬組所在組的許可權以及其他用戶的許可權。通過 ll 命令可以查看目錄或者單個文件的許可權信息:
上面紅框標註的區域,除去第一位之外,都是該文件的許可權信息。第一位表示文件的類型,如目錄,普通文件,鏈接等。許可權每三個進行分組,分別表示文件所屬主許可權,文件所屬主所在組許可權和其他用戶許可權(我再也不想打這幾個字了真的)。
2.許可權的表示方式
每個文件具有三種許可權:讀(r),寫(w)和執行(x),如果沒有許可權用 - 表示,每個用戶對某個文件的許可權都是上面四種標識的排列組合:
-
-
---:無任何許可權
-
--x:只可執行
-
-w-:只可寫
-
-wx:只可寫和執行
-
r--:只讀
-
r-x:只可讀和執行
-
rw-:只可讀寫
-
rwx:可讀、寫、執行
-
如果使用二進位 1 和 0 分別表示有對應許可權和無對應許可權,上面的許可權可以表示為:
-
-
000:無任何許可權
-
001:只可執行
-
010:只可寫
-
011:只可寫和執行
-
100:只讀
-
101:只可讀和執行
-
110:只可讀寫
-
111:可讀、寫、執行
-
機智的你也許說:這都什麼鬼啊,奏凱奏凱,我覺得十進位才是淫類的標準數字語言,你能不能把它改為十進位?OK:
-
-
0:無任何許可權
-
1:只可執行
-
2:只可寫
-
3:只可寫和執行
-
4:只讀
-
5:只可讀和執行
-
6:只可讀寫
-
7:可讀、寫、執行
-
這總可以了吧!可是機智的你又說:總共才八個數字啊,為啥要寫成十進位,不如咱們寫成八進位把!:)。fine,這裡我就不寫了,因為將上面的十進位改成八進位結果是一樣的。
現在我們知道了,所有的許可權都可以使用 0~7 之間的某個八進位數字來表示,是不是比使用 r、w、x 和 - 更加方便呢。
這時,機智的你又提出了一個問題:尼瑪這麼多數字,每個數字都代表了不同的含義,記起來太麻煩了!關鍵是還可能記錯啊,要知道咱們程式猿可是懶淫啊!有沒有更快樂一點的方法?
我老實告訴你吧:沒有!那麼現在來說一下比較快樂的記憶許可權數字的方法:)
如果我們提取出只讀、只寫、只執行以及無許可權的數字,可以得到:
-
- 0:無許可權
- 1:只執行
- 2:只寫
- 4:只讀
發現沒?不管是 3,5,還是6等等這些許可權數字,都是在0,1,2,4上面的幾個進行加法運算得到,其中最小值為0,最大值為7。因此 3 = 1 + 2,表示只寫和只執行;5 = 4 + 1,表示只讀和只執行....
終於記住許可權了有木有,那麼現在我們來愉快的 chmod 777 吧。嗯哼?chmod 是什麼鬼?chmod 是我們修改許可權的終極命令,在說這個命令之前還是先說一說文件的所屬主和所屬主所在的組吧(呸!)。
3.文件的所屬主
回到上圖,我們再來看一下 ll 所列出的目錄中的文件詳細信息:
框起來的部分分別該文件的所屬主和所屬主所在組。為了避免這麼拗口,我們把文件的所屬主改為文件的所有者,把文件所屬主的所在組該問文件所有者組,這樣叫起來就方便一些了。預設情況下,文件的所有者就是創建該文件的用戶,文件的所有者組則是文件所有者的基本組。由於在創建 charley 用戶時沒有制定基本組,它的基本組就是預設的 charley,如果 charley 的基本組改變為 Handsome,那麼框起來的內容就應該是:charley Handsome。
在 Linux 中,我們說一切都可以改改改,那麼文件的所有者和文件的所有者組能否修改呢?接下來就請出我們改天改地改空氣甚至還能 commit suiside 的 root 君。
4.修改文件的所有者和所有者組(root only)
root 用戶改變文件的所有者和所有者組需要用到兩個命令:chown 和 chgrp。
-
- chown USERNAME file1,file2,file3... :改變文件的所有者,可以一次修改多個文件
- chown -R USERNAME DIR:遞歸改變目錄下的所有文件的所有者
- chown --reference = PATH file1,file2...:將文件的所有者信息改成和 PATH 一致
- 註意:--reference 會將所有者和所有者組一併修改
- chown --reference = PATH -R DIR:遞歸 reference
- chown USERNAME:GROUPNAME / chown USERNAME.GROUPNAME:同時改變所有者和所有者組
- chown :GROUPNAME / chown .GROUPNAME:改變所有者組
OK,介紹完了。什麼?還有個 chgrp 沒說?這貨其實用法和 chown 一樣啦,只是只能修改所有者組而已,使用 chown 可以同時改變所有者和所有者組,因此我個人使用 chown 多一些。
5.chmod:修改文件許可權
chmod 修改文件許可權的方式很簡單:chmod MOD file1,file2...,大體的用法和 chown 一致。
-
- chmod u=rx FILE:修改所有者的許可權
- chmod g=rwx FILE:修改所有者組的許可權
- chmod u=rx,g=x FILE:同事修改所有者和所有者組的許可權
- chmod o= FILE:修改其他用戶的許可權
- chmod [u|g|o][+|-] MOD FILE:位某類用戶添加或者刪除許可權
- chmod u+x,g-w FILE
- chmod MOD FILE:使用八進位許可權值修改許可權
- chmod 775 FILE
- chmod 000 FILE
個人比較喜歡最後一種方式修改許可權。
6.通過修改配置文件創建用戶
還記得 useradd -M USERNAME 嗎?這行命令用於創建一個用戶,但是不創建用戶的家目錄。如果我們想要手動創建用戶的家目錄,就需要拷貝 /etc/skel 中的文件到對應的目錄中,然後將該目錄的許可權分配給該用戶。來看一下 /etc/skel 中的內容:
框起來的部分就是我們在手動創建目錄的時候需要複製的部分,直(shi)覺(jue)告訴我們這些文件和 bash 有關。稍後會詳細解釋。
另外我們知道,/etc/passwd 和 /etc/shadow 中存放了和用戶相關的訊息,因此在添加用戶時還需手動向這兩個文件中寫入內容(創建組同理)。下麵給出簡要的步驟:
-
-
# nano /etc/passwd
-
# nano /etc/group
-
# nano /etc/shadow
-
# cp -r /etc/skel /home/fish
-
# chown -R fish:fish /home/fish
-
# chmod -R go= /home/fish
-
創建用戶基本完成了,接下來創建密碼:
-
- # passwd fish -> 這樣做的密碼不是散列值,我們應該使用加密後的密碼
- openssl passwd,然後輸入密碼。 -> 得到的結果是加密後的值,但是沒有加鹽,不可取
- openssl passwd -1 -salt 'memeda'(1代表md5加密),-salt 表示加鹽
- 將上部生成的字串粘貼到 /etc/shadow 中
大功告成!你看,root 用戶是不是很帥很風騷呢。
還有個問題。
/etc/shadow 是保存用戶密碼信息的,那麼這個文件的許可權是多少呢?ll 後可以看到:400。即使 root 用戶,也只有讀許可權,這到沒什麼,畢竟 root 改天該地改空氣嘛。那麼對於其他用戶呢?如果其他用戶沒有寫許可權的話,是如何做到修改密碼的呢?——普通用戶使用 passwd,開啟一個 passwd 進程,這個進程的所有者是普通用戶,因此是無法修改 /etc/shadow 的。但是普通用戶明明可以修改自身的密碼呀,這就需要從 passwd 命令本身說起。
ll `which passwd`,可見 passwd 命令的許可權為:rwsr-xr-x 。s 的存在使得普通用戶可以改密碼。s 屬於特殊許可權,由此用戶使用 passwd 可以修改自身密碼。
7.再看許可權
有個問題我們一直沒有考慮:普通用戶創建的文件和管理員創建的文件許可權有什麼區別呢?我們在命令行中看一下。首先是普通用戶:
接下來是 root 用戶:
可見,普通用戶創建的文件預設許可權為:664,而管理員創建的文件預設許可權為:644。它倆是不同的。
難道還有什麼東東主導了文件創建的預設許可權值嗎?
必須得有。這個值就是 umask 遮罩碼(反向掩碼),他是可以在 bash 中查看的,普通用戶的預設 umask 為 0002,root 用戶的預設 umask 為 0022。用戶創建文件的預設許可權等於:系統默許的最大許可權 - umask。
Linux 中創建的文件預設沒有執行許可權,因此其最大許可權是 666,這下知道為啥管理員創建的文件許可權是 644,普通用戶創建的文件許可權是 664了吧。
再則,如果是目錄呢?Linux 中目錄的最大預設許可權是 777。因此普通用戶創建的目錄預設許可權為 775,管理員創建的目錄預設許可權為 755。
8.修改 umask
既然 umask 有一個預設值,我們能否修改呢?必須可以。只需 umask NEWVAL 就可以了。這種方式修改只在當前登錄有效。看下修改之後的結果變化:
恩,大功告成!
機智的你再次叫住了轉身的我:等等啊喂,好像有點問題。許可權還是 644 啊,根本沒有改成功啊!其實是改成功了的,只是系統又幫我們改了一次而已。
理論上我們的許可權應該這樣:666 - 023 = 643,但是為什麼還是 644 呢?因為 Linux 是死腦筋,它始終認為新創建的文件預設不能有執行許可權,所以它看到我們修改 umask 後創建的文件擁有執行許可權後,就默默的加上了 1,深藏功與名。
到此,許可權的部分我們已經說完了,還有最後的一丟丟內容。
上面說到,修改 umask 只對當前登錄有效,退出後重新登錄,umask 就重置為預設值了。怎麼讓這種修改一直有效呢?
9.Linux 的登錄機制
讓我們拉出二營長的義大利炮,對這最後一塊內容摩擦摩擦把。我們可以把 Shell 分為以下兩種:
-
- 登錄式 Shell
- 非登錄式 Shell
下麵的情況屬於登錄式 Shell:
-
- 普通用戶通過終端登錄
- 管理員登錄普通用戶
- su - USERNAME
- su -l USERNAME
下麵的情況屬於非登錄式 Shell:
-
- 圖形終端下打開命令視窗
- 自動執行的 Shell 腳本
- su USERNAME(註意沒有 - 或者 -l)
登錄式 Shell 和非登錄式 Shell 最主要的區別在於登錄時讀取配置文件的方式不同。配置文件有兩種,一種是全局配置文件,一種是個人配置文件。顧名思義,全局配置文件對所有用戶生效,個人配置文件只對特定用戶生效。全局配置文件存放在 /etc 中,個人配置文件存放在 ~ 中,當然 /etc/skel 中也存在一份,新建用戶時都會預設從 /etc/skel 中複製配置文件到自身的家目錄,因此所有用戶預設的配置文件是相同的。
全局配置文件:
-
- /etc/profile
- /etc/profile.d/*.sh
- /etc/bashrc
個人配置文件:
-
- ~/.bash_profile
- ~/.bashrc
可見配置文件分為兩大陣營:profile 陣營和 bashrc 陣營。來看看它們分別起到的作用:
profile 配置文件:
-
- 設置環境變數
- 如果我們想建立所有用戶的全局變數,就修改 /etc/profile 或者在 /etc/profile.d/ 下建立任意以 .sh 結尾的文件,其中寫入環境變數。
- 如果對單個用戶配置環境變數:編輯 ~/.bash_profile
- 如果兩個都有,以 ~/.bash_profile 為準
- 運行命令或者腳本(比如開機啟動或者登陸問候語)
- 設置環境變數
bashrc 配置文件:
-
- 設定本地變數
- 定義命令別名
登錄式 Shell 讀取配置的方式:/etc/profile -> /etc/profile.d/*.sh -> ~/.bash_profile -> ~/.bashrc -> /erc/bashrc
非登錄式 Shell 讀取配置的方式:~/.bashrc -> /etc/bashrc -> /etc/profile,d/*.sh
可見:非登錄式 Shell 不讀取 /etc/profile 和 ~/.bash_profile,因此 su 和 su -的用戶讀取到的配置是不一致的。su 也叫半切換,su - (su -l)叫全切換。
現在我們瞭解:要想我們定義的命令別名,本地變數等一直有效,需要將定義寫入配置文件(全局或者個人),如果還要要區分登錄式 Shell 和非登錄式 Shell,就需要將配置寫入 /etc/profile 或者 ~/.bash_profile 中。
10.總結
本文主要介紹了 Linux 的許可權管理,包括 Linux 的許可權表示方式,修改許可權,修改文件的所有者和所有者組,以及 umask 遮罩碼。最後介紹了 Linux 的配置文件,包括全局配置和個人配置,以及登錄式 Shell 和非登錄式 Shell 的區別。
謝謝觀看。
作者:Charleylla 轉載請註明出處:http://www.cnblogs.com/charleylla/p/5980300.html