到權限了。前面講到了 Linux 中的用戶和用戶主管理,其實它們的本質(或者用戶和用戶組出現的初衷)都是方便權限管理。權限管理對於計算機的重要性不言而喻,權限讓每個用戶能夠安安心心的使用計算機,而不用擔心別的用戶破壞到自己的資源。如果老王手裡有一把你家的鑰匙,你是不是很蛋疼呢,如果鄰居除了老王,還有老趙,老李,老張...都有你家的鑰匙,你是不是更加蛋疼呢。作為多用戶的 Linux 而言,權限管理至關重要。
前文提到,Linux 規定一個文件必須要有三種權限:文件所屬主權限,文件所屬組所在組的權限以及其他用戶的權限。通過 ll 命令可以查看目錄或者單個文件的權限信息:
上面紅框標注的區域,除去第一位之外,都是該文件的權限信息。第一位表示文件的類型,如目錄,普通文件,鏈接等。權限每三個進行分組,分別表示文件所屬主權限,文件所屬主所在組權限和其他用戶權限(我再也不想打這幾個字了真的)。
每個文件具有三種權限:讀(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 和 - 更加方便呢。
這時,機智的你又提出了一個問題:尼瑪這麼多數字,每個數字都代表了不同的含義,記起來太麻煩了!關鍵是還可能記錯啊,要知道咱們程序猿可是懶淫啊!有沒有更快樂一點的方法?
我老實告訴你吧:沒有!那麼現在來說一下比較快樂的記憶權限數字的方法:)
如果我們提取出只讀、只寫、只執行以及無權限的數字,可以得到:
發現沒?不管是 3,5,還是6等等這些權限數字,都是在0,1,2,4上面的幾個進行加法運算得到,其中最小值為0,最大值為7。因此 3 = 1 + 2,表示只寫和只執行;5 = 4 + 1,表示只讀和只執行....
終於記住權限了有木有,那麼現在我們來愉快的 chmod 777 吧。嗯哼?chmod 是什麼鬼?chmod 是我們修改權限的終極命令,在說這個命令之前還是先說一說文件的所屬主和所屬主所在的組吧(呸!)。
回到上圖,我們再來看一下 ll 所列出的目錄中的文件詳細信息:
框起來的部分分別該文件的所屬主和所屬主所在組。為了避免這麼拗口,我們把文件的所屬主改為文件的所有者,把文件所屬主的所在組該問文件所有者組,這樣叫起來就方便一些了。默認情況下,文件的所有者就是創建該文件的用戶,文件的所有者組則是文件所有者的基本組。由於在創建 charley 用戶時沒有制定基本組,它的基本組就是默認的 charley,如果 charley 的基本組改變為 Handsome,那麼框起來的內容就應該是:charley Handsome。
在 Linux 中,我們說一切都可以改改改,那麼文件的所有者和文件的所有者組能否修改呢?接下來就請出我們改天改地改空氣甚至還能 commit suiside 的 root 君。
root 用戶改變文件的所有者和所有者組需要用到兩個命令:chown 和 chgrp。
OK,介紹完了。什麼?還有個 chgrp 沒說?這貨其實用法和 chown 一樣啦,只是只能修改所有者組而已,使用 chown 可以同時改變所有者和所有者組,因此我個人使用 chown 多一些。
chmod 修改文件權限的方式很簡單:chmod MOD file1,file2...,大體的用法和 chown 一致。
個人比較喜歡最後一種方式修改權限。
還記得 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
創建用戶基本完成了,接下來創建密碼:
大功告成!你看,root 用戶是不是很帥很風騷呢。
還有個問題。
/etc/shadow 是保存用戶密碼信息的,那麼這個文件的權限是多少呢?ll 後可以看到:400。即使 root 用戶,也只有讀權限,這到沒什麼,畢竟 root 改天該地改空氣嘛。那麼對於其他用戶呢?如果其他用戶沒有寫權限的話,是如何做到修改密碼的呢?——普通用戶使用 passwd,開啟一個 passwd 進程,這個進程的所有者是普通用戶,因此是無法修改 /etc/shadow 的。但是普通用戶明明可以修改自身的密碼呀,這就需要從 passwd 命令本身說起。
ll `which passwd`,可見 passwd 命令的權限為:rwsr-xr-x 。s 的存在使得普通用戶可以改密碼。s 屬於特殊權限,由此用戶使用 passwd 可以修改自身密碼。
有個問題我們一直沒有考慮:普通用戶創建的文件和管理員創建的文件權限有什麼區別呢?我們在命令行中看一下。首先是普通用戶:
接下來是 root 用戶:
可見,普通用戶創建的文件默認權限為:664,而管理員創建的文件默認權限為:644。它倆是不同的。
難道還有什麼東東主導了文件創建的默認權限值嗎?
必須得有。這個值就是 umask 遮罩碼(反向掩碼),他是可以在 bash 中查看的,普通用戶的默認 umask 為 0002,root 用戶的默認 umask 為 0022。用戶創建文件的默認權限等於:系統默許的最大權限 - umask。
Linux 中創建的文件默認沒有執行權限,因此其最大權限是 666,這下知道為啥管理員創建的文件權限是 644,普通用戶創建的文件權限是 664了吧。
再則,如果是目錄呢?Linux 中目錄的最大默認權限是 777。因此普通用戶創建的目錄默認權限為 775,管理員創建的目錄默認權限為 755。
既然 umask 有一個默認值,我們能否修改呢?必須可以。只需 umask NEWVAL 就可以了。這種方式修改只在當前登錄有效。看下修改之後的結果變化:
恩,大功告成!
機智的你再次叫住了轉身的我:等等啊喂,好像有點問題。權限還是 644 啊,根本沒有改成功啊!其實是改成功了的,只是系統又幫我們改了一次而已。
理論上我們的權限應該這樣:666 - 023 = 643,但是為什麼還是 644 呢?因為 Linux 是死腦筋,它始終認為新創建的文件默認不能有執行權限,所以它看到我們修改 umask 後創建的文件擁有執行權限後,就默默的加上了 1,深藏功與名。
到此,權限的部分我們已經說完了,還有最後的一丟丟內容。
上面說到,修改 umask 只對當前登錄有效,退出後重新登錄,umask 就重置為默認值了。怎麼讓這種修改一直有效呢?
讓我們拉出二營長的意大利炮,對這最後一塊內容摩擦摩擦把。我們可以把 Shell 分為以下兩種:
下面的情況屬於登錄式 Shell:
下面的情況屬於非登錄式 Shell:
登錄式 Shell 和非登錄式 Shell 最主要的區別在於登錄時讀取配置文件的方式不同。配置文件有兩種,一種是全局配置文件,一種是個人配置文件。顧名思義,全局配置文件對所有用戶生效,個人配置文件只對特定用戶生效。全局配置文件存放在 /etc 中,個人配置文件存放在 ~ 中,當然 /etc/skel 中也存在一份,新建用戶時都會默認從 /etc/skel 中復制配置文件到自身的家目錄,因此所有用戶默認的配置文件是相同的。
全局配置文件:
個人配置文件:
可見配置文件分為兩大陣營:profile 陣營和 bashrc 陣營。來看看它們分別起到的作用:
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 中。
本文主要介紹了 Linux 的權限管理,包括 Linux 的權限表示方式,修改權限,修改文件的所有者和所有者組,以及 umask 遮罩碼。最後介紹了 Linux 的配置文件,包括全局配置和個人配置,以及登錄式 Shell 和非登錄式 Shell 的區別。
謝謝觀看。
作者:油炸丸子 轉載請注明出處:http://www.cnblogs.com/charleylla/p/5980300.html
http://xxxxxx/Linuxjc/1166448.html TechArticle