歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> 學習Linux >> [Linux 004]——用戶和用戶組以及 Linux 權限管理(二),linux004

[Linux 004]——用戶和用戶組以及 Linux 權限管理(二),linux004

日期:2017/3/3 18:10:09   编辑:學習Linux

[Linux 004]——用戶和用戶組以及 Linux 權限管理(二),linux004

[Linux 004]——用戶和用戶組以及 Linux 權限管理(二),linux004


  到權限了。前面講到了 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 的區別。

  謝謝觀看。


作者:油炸丸子  轉載請注明出處:http://www.cnblogs.com/charleylla/p/5980300.html


http://xxxxxx/Linuxjc/1166448.html TechArticle

Copyright © Linux教程網 All Rights Reserved