[Linux 004]——用戶和用戶組以及 Linux 許可權管理(二)

来源:http://www.cnblogs.com/charleylla/archive/2016/10/20/5980300.html
-Advertisement-
Play Games

到許可權了。前面講到了 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 

 


 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、建立httpd伺服器,提供兩個基於名稱的虛擬主機 2、為上面的第2個虛擬主機提供https服務,使得用戶可以通過https安全的訪問此web站點 ...
  • 功能:刪除文件或目錄。語法:rm [-dfirv][--help][--version][文件或目錄...]註意:小心使用rm -rf,沒有提示直接刪除目錄(可能會毀掉你整個公司--此句來源於網路)。參數: -d或–directory 直接把欲刪除的目錄的硬連接數據刪成0,刪除該目錄。 -f或–fo ...
  • (1)啟動任務管理器(ctrl+ alt + del)停止explorer進程(停止後你的任務欄等都消失了,不過不用怕,這樣你只是不能通過圖形界面去訪問系統資源,但是通過命令行還是可以的,現在iconcache.db還沒有刪掉。所以千萬不要重啟機器,要不然工作就白費了,別忘了顯示這些文字的瀏覽器視窗... ...
  • 總結了14門Linux課程,有基礎入門的、有進階提高的、有實戰項目的……適合各種Linux學習需求。 ...
  • 以TCPServ 服務程式來說: 1)父進程:負責系統初始化,以及監聽(listen),接受連接請求(accept);其中accept 預設阻塞調用。 2)每接受一個連接請求,動態新建(fork)一個子進程,任務完成或客戶端斷開,服務子進程需要退 出並收回系統資源。 3)根據linux的設計子進程的 ...
  • 簡介 IO復用技術,簡單來說就是同時監聽多個描述符。在沒有用到IO復用以前,只能是一個線程或一個 線程去監聽,服務端同時有多個連接的時候,需要創建多個線程或者進程。而且,並不是所有的連 接是一直在傳輸這數據,可能只是連接後啥都沒乾,如果這樣,進程就啥都沒乾。 現在有了IO復用技術,只有描述符就緒的時 ...
  • 對於日誌來說,最常見的需求就是收集、存儲、查詢、展示,開源社區正好有相對應的開源項目:logstash(收集)、elasticsearch(存儲+搜索)、kibana(展示),我們將這三個組合起來的技術稱之為ELKStack,所以說ELKStack指的是Elasticsearch、Logstash、 ...
  • hit,命中表示鏈接上這個網站 get獲取表示有更新並且下載, ign忽略表示無更新或者更新無關緊要或者不需要,譬如某些插件系統已經有了或者語言翻譯包 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...