(四)Linux之使用者管理(使用者和使用者組)

天然呆dull發表於2021-08-23

Linux之使用者管理(使用者和使用者組)

一、概述

Linux 是多使用者多工作業系統,換句話說,Linux 系統支援多個使用者在同一時間內登陸,不同使用者可以執行不同的任務,並且互不影響。

例如,某臺 Linux 伺服器上有 4 個使用者,分別是 root、www、ftp 和 mysql,在同一時間內,root 使用者可能在檢視系統日誌、管理維護系統;www 使用者可能在修改自己的網頁程式;ftp 使用者可能在上傳軟體到伺服器;mysql 使用者可能在執行自己的 SQL 查詢,每個使用者互不干擾,有條不紊地進行著自己的工作。與此同時,每個使用者之間不能越權訪問,比如 www 使用者不能執行 mysql 使用者的 SQL 查詢操作,ftp 使用者也不能修改 www 使用者的網頁程式。

不同使用者具有不問的許可權,毎個使用者在許可權允許的範圍內完成不間的任務,Linux 正是通過這種許可權的劃分與管理,實現了多使用者多工的執行機制。

因此,如果要使用 Linux 系統的資源,就必須向系統管理員申請一個賬戶,然後通過這個賬戶進入系統(賬戶和使用者是一個概念)。通過建立不同屬性的使用者,一方面可以合理地利用和控制系統資源,另一方面也可以幫助使用者組織檔案,提供對使用者檔案的安全性保護。

每個使用者都有唯一的使用者名稱和密碼。在登入系統時,只有正確輸入使用者名稱和密碼,才能進入系統和自己的主目錄。

使用者組是具有相同特徵使用者的邏輯集合。簡單的理解,有時我們需要讓多個使用者具有相同的許可權,比如檢視、修改某一個檔案的許可權,一種方法是分別對多個使用者進行檔案訪問授權,如果有 10 個使用者的話,就需要授權 10 次,那如果有 100、1000 甚至更多的使用者呢?

顯然,這種方法不太合理。最好的方式是建立一個組,讓這個組具有檢視、修改此檔案的許可權,然後將所有需要訪問此檔案的使用者放入這個組中。那麼,所有使用者就具有了和組一樣的許可權,這就是使用者組。

將使用者分組是 Linux 系統中對使用者進行管理及控制訪問許可權的一種手段,通過定義使用者組,很多程式上簡化了對使用者的管理工作。

二、使用者和組的關係

使用者和使用者組的對應關係有以下 4 種:

  1. 一對一:一個使用者可以存在一個組中,是組中的唯一成員;
  2. 一對多:一個使用者可以存在多個使用者組中,此使用者具有這多個組的共同許可權;
  3. 多對一:多個使用者可以存在一個組中,這些使用者具有和組相同的許可權;
  4. 多對多:多個使用者可以存在多個組中,也就是以上 3 種關係的擴充套件。

使用者和組之間的關係可以用下面的圖表示:

三、關於UID和GID(使用者ID和組ID)

登陸 Linux 系統時,雖然輸入的是自己的使用者名稱和密碼,但其實 Linux 並不認識你的使用者名稱稱,它只認識使用者名稱對應的 ID 號(也就是一串數字)。Linux 系統將所有使用者的名稱與 ID 的對應關係都儲存在 /etc/passwd 檔案中。說白了,使用者名稱並無實際作用,僅是為了方便使用者的記憶而已。

Linux 系統中,每個使用者的 ID 細分為 2 種,分別是使用者 ID(User ID,簡稱 UID)和組 ID(Group ID,簡稱 GID),這與檔案有擁有者和擁有群組兩種屬性相對應。

那麼讀者可能會問,既然 Linux 系統不認識使用者名稱,檔案是如何判別它的擁有者名稱和群組名稱的呢?

每個檔案都有自己的擁有者 ID 和群組 ID,當顯示檔案屬性時,系統會根據 /etc/passwd /etc/group 檔案中的內容,分別找到 UID 和 GID 對應的使用者名稱和群組名,然後顯示出來(/etc/passwd 檔案和 /etc/group 檔案,下面第四節會有講到)。

四、使用者和組的資料

使用者和組資訊的主要儲存庫是 /etc 中的 4 個檔案:

  • /etc/passwd 是包含使用者的基本資訊的密碼 檔案,所有使用者都可以對此檔案執行讀操作。
  • /etc/shadow 是包含已加密的密碼的影子密碼 檔案。
  • /etc/group 是組 檔案,包含組的基本資訊和哪些使用者屬於它們。
  • /etc/gshadow是包含已加密的組密碼的影子組 檔案。

細節說明:出於安全原因,密碼 (/etc/passwd) 和組 (/etc/group) 檔案都新增了影子檔案。passwd 和 group 檔案本身必須是所有使用者可讀的,但加密的密碼不應是所有使用者可讀的。因此,影子檔案包含加密的密碼,而且這些檔案僅能由 root 讀取。suid 程式提供了必要的驗證訪問權,該程式具有根許可權但可由任何使用者執行。

  1. /etc/passwd內容解釋

    首先我們來開啟這個檔案,看看到底包含哪些內容,執行命令如下:

    [root@localhost ~]# cat /etc/passwd
    #檢視一下檔案內容
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    ...省略部分輸出...
    

    可以看到,/etc/passwd 檔案中的內容非常規律,每行記錄對應一個使用者。

    那麼有些愛動腦筋的讀者可能會問,Linux 系統中預設怎麼會有這麼多的使用者?這些使用者中的絕大多數是系統或服務正常執行所必需的使用者,這種使用者通常稱為系統使用者或偽使用者。系統使用者無法用來登入系統,但也不能刪除,因為一旦刪除,依賴這些使用者執行的服務或程式就不能正常執行,會導致系統問題。

    不僅如此,每行使用者資訊都以 ":" 作為分隔符,劃分為 7 個欄位,每個欄位所表示的含義如下:

    使用者名稱:密碼:UID(使用者ID):GID(組ID):描述性資訊:主目錄(home目錄):預設Shell

    接下來,給大家逐個介紹這些欄位。

    使用者名稱

    使用者名稱,就是一串代表使用者身份的字串。

    前面講過,使用者名稱僅是為了方便使用者記憶,Linux 系統是通過 UID 來識別使用者身份,分配使用者許可權的。/etc/passwd 檔案中就定義了使用者名稱和 UID 之間的對應關係。

    密碼

    "x" 表示此使用者設有密碼,但不是真正的密碼,真正的密碼儲存在 /etc/shadow 檔案中。Linux 系統把真正的加密密碼串放置在 /etc/shadow 檔案中,此檔案只有 root 使用者可以瀏覽和操作,這樣就最大限度地保證了密碼的安全。

    需要注意的是,雖然 "x" 並不表示真正的密碼,但也不能刪除,如果刪除了 "x",那麼系統會認為這個使用者沒有密碼,從而導致只輸入使用者名稱而不用輸入密碼就可以登陸(只能在使用無密碼登入,遠端是不可以的),除非特殊情況(如破解使用者密碼),這當然是不可行的。

    UID

    UID,也就是使用者 ID。每個使用者都有唯一的一個 UID,Linux 系統通過 UID 來識別不同的使用者。

    實際上,UID 就是一個 0~65535 之間的數,不同範圍的數字表示不同的使用者身份,具體如表 所示。

    UID 範圍 使用者身份
    0 超級使用者。UID 為 0 就代表這個賬號是管理員賬號。在 Linux 中,如何把普通使用者升級成管理員呢?只需把其他使用者的 UID 修改為 0 就可以了,這一點和 Windows 是不同的。不過不建議建立多個管理員賬號。
    1~499 系統使用者(偽使用者)。也就是說,此範圍的 UID 保留給系統使用。其中,1~99 用於系統自行建立的賬號;100~499 分配給有系統賬號需求的使用者。 其實,除了 0 之外,其他的 UID 並無不同,這裡只是預設 500 以下的數字給系統作為保留賬戶,只是一個公認的習慣而已。
    500~65535 普通使用者。通常這些 UID 已經足夠使用者使用了。但不夠用也沒關係,2.6.x 核心之後的 Linux 系統已經可以支援 232 個 UID 了。

    GID

    全稱“Group ID”,簡稱“組ID”,表示使用者初始組的組 ID 號。這裡需要解釋一下初始組和附加組的概念。

    舉例來說,剛剛的 lamp 使用者除屬於初始組 lamp 外,我又把它加入了 users 組,那麼 lamp 使用者同時屬於 lamp 組和 users 組,其中 lamp 是初始組,users 是附加組。

    當然,初始組和附加組的身份是可以修改的,但是我們在工作中不修改初始組,只修改附加組,因為修改了初始組有時會讓管理員邏輯混亂。

    需要注意的是,在 /etc/passwd 檔案的第四個欄位中看到的 ID 是這個使用者的初始組。

    描述性資訊

    這個欄位並沒有什麼重要的用途,只是用來解釋這個使用者的意義而已。

    主目錄

    也就是使用者登入後有操作許可權的訪問目錄,通常稱為使用者的主目錄。

    例如,root 超級管理員賬戶的主目錄為 /root,普通使用者的主目錄為 /home/yourIDname,即在 /home/ 目錄下建立和使用者名稱相同的目錄作為主目錄,如 lamp 使用者的主目錄就是 /home/lamp/ 目錄。

    預設的Shell

    Shell 就是 Linux 的命令直譯器,是使用者和 Linux 核心之間溝通的橋樑。

    我們知道,使用者登陸 Linux 系統後,通過使用 Linux 命令完成操作任務,但系統只認識類似 0101 的機器語言,這裡就需要使用命令直譯器。也就是說,Shell 命令直譯器的功能就是將使用者輸入的命令轉換成系統可以識別的機器語言。

    通常情況下,Linux 系統預設使用的命令直譯器是 bash(/bin/bash),當然還有其他命令直譯器,例如 sh、csh 等。

    /etc/passwd 檔案中,大家可以把這個欄位理解為使用者登入之後所擁有的許可權。如果這裡使用的是 bash 命令直譯器,就代表這個使用者擁有許可權範圍內的所有許可權。例如:

    [root@localhost ~]# vim /etc/passwd
     lamp:x:502:502::/home/lamp:/bin/bash
    

    我手工新增了 lamp 使用者,它使用的是 bash 命令直譯器,那麼這個使用者就可以使用普通使用者的所有許可權。

    如果我把 lamp 使用者的 Shell 命令直譯器修改為 /sbin/nologin,那麼,這個使用者就不能登入了,例如:

    [root@localhost ~]# vi /etc/passwd
    lamp:x:502:502::/home/lamp:/sbin/nologin
    

    因為 /sbin/nologin 就是禁止登入的 Shell。同樣,如果我在這裡放入的系統命令,如 /usr/bin/passwd,例如:

    [root@localhost ~]#vi /etc/passwd
    lamp:x:502:502::/home/lamp:/usr/bin/passwd
    

    那麼這個使用者可以登入,但登入之後就只能修改自己的密碼。但是,這裡不能隨便寫入和登陸沒有關係的命令(如 ls),系統不會識別這些命令,同時也就意味著這個使用者不能登入。

  2. /etc/shadow(影子檔案)內容解析

    /etc/shadow 檔案,用於儲存 Linux 系統中使用者的密碼資訊,又稱為“影子檔案”。

    前面介紹了 /etc/passwd 檔案,由於該檔案允許所有使用者讀取,易導致使用者密碼洩露,因此 Linux 系統將使用者的密碼資訊從 /etc/passwd 檔案中分離出來,並單獨放到了此檔案中。

    /etc/shadow 檔案只有 root 使用者擁有讀許可權,其他使用者沒有任何許可權,這樣就保證了使用者密碼的安全性。

    我們先開啟該檔案看看,執行如下命令:

    [root@localhost ~]#vim /etc/shadow
    root: $6$9w5Td6lg
    $bgpsy3olsq9WwWvS5Sst2W3ZiJpuCGDY.4w4MRk3ob/i85fl38RH15wzVoom ff9isV1 PzdcXmixzhnMVhMxbvO:15775:0:99999:7:::
    bin:*:15513:0:99999:7:::
    daemon:*:15513:0:99999:7:::
    …省略部分輸出…
    

    /etc/passwd 檔案一樣,檔案中每行代表一個使用者,同樣使用 ":" 作為分隔符,不同之處在於,每行使用者資訊被劃分為 9 個欄位。每個欄位的含義如下:

    使用者名稱:加密密碼:最後一次修改時間:最小修改時間間隔:密碼有效期:密碼需要變更前的警告天數:密碼過期後的寬限時間:賬號失效時間:保留欄位

    需要注意的是加密密碼

    這裡儲存的是真正加密的密碼。目前 Linux 的密碼採用的是 SHA512 雜湊加密演算法,原來採用的是 MD5 或 DES 加密演算法。SHA512 雜湊加密演算法的加密等級更高,也更加安全。

    注意,這串密碼產生的亂碼不能手工修改,如果手工修改,系統將無法識別密碼,導致密碼失效。很多軟體透過這個功能,在密碼串前加上 "!"、"*" 或 "x" 使密碼暫時失效。

    所有偽使用者的密碼都是 "!!" 或 "*",代表沒有密碼是不能登入的。當然,新建立的使用者如果不設定密碼,那麼它的密碼項也是 "!!",代表這個使用者沒有密碼,不能登入。

  3. /etc/group檔案解析

    /ect/group 檔案是使用者組配置檔案,即使用者組的所有資訊都存放在此檔案中。

    此檔案是記錄組 ID(GID)和組名相對應的檔案。前面講過,etc/passwd 檔案中每行使用者資訊的第四個欄位記錄的是使用者的初始組 ID,那麼,此 GID 的組名到底是什麼呢?就要從 /etc/group 檔案中查詢。

    /etc/group 檔案的內容可以通過 Vim 看到:

    [root@localhost ~]#vim /etc/group
    root:x:0:
    bin:x:1:bin,daemon
    daemon:x:2:bin,daemon
    …省略部分輸出…
    lamp:x:502:
    

    可以看到,此檔案中每一行各代表一個使用者組。在前面章節中,我們曾建立 lamp 使用者,系統預設生成一個 lamp 使用者組,在此可以看到,此使用者組的 GID 為 502,目前它僅作為 lamp 使用者的初始組。

    各使用者組中,還是以 ":" 作為欄位之間的分隔符,分為 4 個欄位,每個欄位對應的含義為:

    組名:密碼:GID:該使用者組中的使用者列表

    接下來,分別介紹各個欄位具體的含義。

    組名

    也就是是使用者組的名稱,有字母或數字構成。同 /etc/passwd 中的使用者名稱一樣,組名也不能重複

    組密碼

    /etc/passwd 檔案一樣,這裡的 "x" 僅僅是密碼標識,真正加密後的組密碼預設儲存在 /etc/gshadow 檔案中。

    不過,使用者設定密碼是為了驗證使用者的身份,那使用者組設定密碼是用來做什麼的呢?使用者組密碼主要是用來指定組管理員的,由於系統中的賬號可能會非常多,root 使用者可能沒有時間進行使用者的組調整,這時可以給使用者組指定組管理員,如果有使用者需要加入或退出某使用者組,可以由該組的組管理員替代 root 進行管理。但是這項功能目前很少使用,我們也很少設定組密碼。如果需要賦予某使用者調整某個使用者組的許可權,則可以使用 sudo 命令代替。

    組ID (GID)

    就是群組的 ID 號,Linux 系統就是通過 GID 來區分使用者組的,同使用者名稱一樣,組名也只是為了便於管理員記憶。

    這裡的組 GID 與 /etc/passwd 檔案中第 4 個欄位的 GID 相對應,實際上,/etc/passwd 檔案中使用 GID 對應的群組名,就是通過此檔案對應得到的。

    組中的使用者

    此欄位列出每個群組包含的所有使用者。需要注意的是,如果該使用者組是這個使用者的初始組,則該使用者不會寫入這個欄位,可以這麼理解,該欄位顯示的使用者都是這個使用者組的附加使用者。

    舉個例子,lamp 組的組資訊為 "lamp:x:502:",可以看到,第四個欄位沒有寫入 lamp 使用者,因為 lamp 組是 lamp 使用者的初始組。如果要查詢這些使用者的初始組,則需要先到 /etc/passwd 檔案中檢視 GID(第四個欄位),然後到 /etc/group 檔案中比對組名。

    每個使用者都可以加入多個附加組,但是隻能屬於一個初始組。所以我們在實際工作中,如果需要把使用者加入其他組,則需要以附加組的形式新增。例如,我們想讓 lamp 也加入 root 這個群組,那麼只需要在第一行的最後一個欄位加入 lamp,即 root:x:0:lamp 就可以了。

    一般情況下,使用者的初始組就是在建立使用者的同時建立的和使用者名稱相同的組。

    到此,我們已經學習了/etc/passwd/etc/shadow/etc/group,它們之間的關係可以這樣理解,即先在 /etc/group 檔案中查詢使用者組的 GID 和組名;然後在 /etc/passwd 檔案中查詢該 GID 是哪個使用者的初始組,同時提取這個使用者的使用者名稱和 UID;最後通過 UID 到 /etc/shadow 檔案中提取和這個使用者相匹配的密碼。

  4. /etc/gshadow檔案內容解析

    前面講過,/etc/passwd 檔案儲存使用者基本資訊,同時考慮到賬戶的安全性,將使用者的密碼資訊存放另一個檔案 /etc/shadow 中。/etc/gshadow檔案也是如此,組使用者資訊儲存在/etc/group檔案中,而將組使用者的密碼資訊儲存在/etc/gshadow檔案中。

    首先,我們藉助 Vim 命令檢視一下此檔案中的內容:

    [root@localhost ~]#vim /etc/gshadow
    root:::
    bin:::bin, daemon
    daemon:::bin, daemon
    ...省略部分輸出...
    lamp:!::
    

    檔案中,每行代表一個組使用者的密碼資訊,各行資訊用 ":" 作為分隔符分為 4 個欄位,每個欄位的含義如下:

    組名:加密密碼:組管理員:組附加使用者列表

    組名

    /etc/group 檔案中的組名相對應。

    組密碼

    對於大多數使用者來說,通常不設定組密碼,因此該欄位常為空,但有時為 "!",指的是該群組沒有組密碼,也不設有群組管理員。

    組管理員

    從系統管理員的角度來說,該檔案最大的功能就是建立群組管理員。那麼,什麼是群組管理員呢?

    考慮到 Linux 系統中賬號太多,而超級管理員 root 可能比較忙碌,因此當有使用者想要加入某群組時,root 或許不能及時作出回應。這種情況下,如果有群組管理員,那麼他就能將使用者加入自己管理的群組中,也就免去麻煩 root 了。

    不過,由於目前有 sudo 之類的工具,因此群組管理員的這個功能已經很少使用了。

    組中的附加使用者

    該欄位顯示這個使用者組中有哪些附加使用者,和 /etc/group 檔案中附加組顯示內容相同。

五、關於sudo許可權(粗略講解)

普通使用者的許可權非常的低,就連在系統裡安裝軟體的許可權都沒有,很多時候可以臨時給普通使用者以特權,就是sudo(在命令前新增sudo)。比如:

sudo cat /etc/shadow

完成後需要您輸入root的密碼,這樣 就可以假借root身份了,centos預設普通使用者是沒有sudo許可權的,這與主要以桌面版為主的Ubuntu和Fedora不同,如需給予使用者root特權,就需要更改/etc/sudoers檔案,修改內容。

六、使用者與組常用操作

  1. 新增新的系統使用者 useradd

    Linux 系統中,可以使用 useradd 命令新建使用者,此命令的基本格式如下:

    [root@localhost ~]#useradd [選項] 使用者名稱
    

    該命令常用的選項及各自的含義,如表 所示。

    選項 含義
    -u UID 手工指定使用者的 UID,注意 UID 的範圍(不要小於 500)。
    -d 主目錄 手工指定使用者的主目錄。主目錄必須寫絕對路徑,而且如果需要手工指定主目錄,則一定要注意許可權;
    -c 使用者說明 手工指定/etc/passwd檔案中各使用者資訊中第 5 個欄位的描述性內容,可隨意配置;
    -g 組名 手工指定使用者的初始組。一般以和使用者名稱相同的組作為使用者的初始組,在建立使用者時會預設建立初始組。一旦手動指定,則系統將不會在建立此預設的初始組目錄。
    -G 組名 指定使用者的附加組。我們把使用者加入其他組,一般都使用附加組;
    -s shell 手工指定使用者的登入 Shell,預設是 /bin/bash;
    -e 曰期 指定使用者的失效曰期,格式為 "YYYY-MM-DD"。也就是 /etc/shadow 檔案的第八個欄位;
    -o 允許建立的使用者的 UID 相同。例如,執行 "useradd -u 0 -o usertest" 命令建立使用者 usertest,它的 UID 和 root 使用者的 UID 相同,都是 0;
    -m 建立使用者時強制建立使用者的家目錄。在建立系統使用者時,該選項是預設的;
    -r 建立系統使用者,也就是 UID 在 1~499 之間,供系統程式使用的使用者。由於系統使用者主要用於執行系統所需服務的許可權配置,因此係統使用者的建立預設不會建立主目錄。

    其實,系統已經幫我們規定了非常多的預設值,在沒有特殊要求下,無需使用任何選項即可成功建立使用者。例如:

    [root@localhost ~]# useradd lamp
    

    此行命令就表示建立 lamp 普通使用者。

  2. 修改使用者密碼 passwd

    學習 useradd 命令我們知道,使用此命令建立新使用者時,並沒有設定使用者密碼,因此還無法用來登陸系統,那麼 passwd 就是密碼配置命令 。

    passwd 命令的基本格式如下:

    [root@localhost ~]#passwd [選項] 使用者名稱
    
    選項 含義
    -S 查詢使用者密碼的狀態,也就是 /etc/shadow 檔案中此使用者密碼的內容。僅 root 使用者可用;
    -l 暫時鎖定使用者,該選項會在 /etc/shadow 檔案中指定使用者的加密密碼串前新增 "!",使密碼失效。僅 root 使用者可用;
    -u 解鎖使用者,和 -l 選項相對應,也是隻能 root 使用者使用;
    --stdin 可以將通過管道符輸出的資料作為使用者的密碼。主要在批量新增使用者時使用;
    -n 天數 設定該使用者修改密碼後,多長時間不能再次修改密碼,也就是修改 /etc/shadow 檔案中各行密碼的第 4 個欄位;
    -x 天數 設定該使用者的密碼有效期,對應 /etc/shadow 檔案中各行密碼的第 5 個欄位;
    -w 天數 設定使用者密碼過期前的警告天數,對於 /etc/shadow 檔案中各行密碼的第 6 個欄位;
    -i 日期 設定使用者密碼失效日期,對應 /etc/shadow 檔案中各行密碼的第 7 個欄位。

    例如,我們使用 root 賬戶修改 lamp 普通使用者的密碼,可以使用如下命令:

    [root@localhost ~]#passwd lamp
    Changing password for user lamp.
    New password: <==直接輸入新的口令,但螢幕不會有任何反應
    BAD PASSWORD: it is WAY too short <==口令太簡單或過短的錯誤!這裡只是警告資訊,輸入的密碼依舊能用
    Retype new password:  <==再次驗證輸入的密碼,再輸入一次即可
    passwd: all authentication tokens updated successfully.  <==提示修改密碼成功
    

    當然,也可以使用 passwd 命令修改當前系統已登入使用者的密碼,但要注意的是,需省略掉 "選項" 和 "使用者名稱"。例如,我們登陸 lamp 使用者,並使用 passwd 命令修改 lamp 的登陸密碼,執行過程如下:

    [root@localhost ~]#passwd
    #passwd直接回車代表修改當前使用者的密碼
    Changing password for user vbird2.
    Changing password for vbird2
    (current) UNIX password: <==這裡輸入『原有的舊口令』
    New password: <==這裡輸入新口令
    BAD PASSWORD: it is WAY too short <==口令檢驗不通過,請再想個新口令
    New password: <==這裡再想個來輸入吧
    Retype new password: <==通過口令驗證!所以重複這個口令的輸入
    passwd: all authentication tokens updated successfully. <==成功修改使用者密碼
    

    注意,普通使用者只能使用 passwd 命令修改自己的密碼,而不能修改其他使用者的密碼。

  3. 修改使用者資訊 usermod

    usermod 命令,該命令專門用於修改使用者資訊。

    這裡一定要分清 useradd 命令和 usermod 命令的區別,前者用於新增使用者,當然,新增使用者時可以對使用者資訊進行定製;後者針對與已存在的使用者,使用該命令可以修改它們的資訊。

    usermod 命令的基本格式如下:

    [root@localhost ~]#usermod [選項] 使用者名稱
    
    選項 含義
    -c 使用者說明 修改使用者的說明資訊,即修改 /etc/passwd 檔案目標使用者資訊的第 5 個欄位;
    -d 主目錄 修改使用者的主目錄,即修改 /etc/passwd 檔案中目標使用者資訊的第 6 個欄位,需要注意的是,主目錄必須寫絕對路徑;
    -e 日期 修改使用者的失效曰期,格式為 "YYYY-MM-DD",即修改 /etc/shadow 檔案目標使用者密碼資訊的第 8 個欄位;
    -g 組名 修改使用者的初始組,即修改 /etc/passwd 檔案目標使用者資訊的第 4 個欄位(GID);
    -u UID 修改使用者的UID,即修改 /etc/passwd 檔案目標使用者資訊的第 3 個欄位(UID);
    -G 組名 修改使用者的附加組,其實就是把使用者加入其他使用者組,即修改 /etc/group 檔案;
    -l 使用者名稱 修改使用者名稱稱;
    -L 臨時鎖定使用者(Lock);
    -U 解鎖使用者(Unlock),和 -L 對應;
    -s shell 修改使用者的登入 Shell,預設是 /bin/bash。

    如果你仔細觀察會發現,其實 usermod 命令提供的選項和 useradd 命令的選項相似,因為 usermod 命令就是用來調整使用 useradd 命令新增的使用者資訊的。

    不過,相比 useradd 命令,usermod 命令還多出了幾個選項,即 -L 和 -U,作用分別與 passwd 命令的 -l 和-u 相同。需要注意的是,並不是所有的 Linux 發行版都包含這個命令,因此,使用前可以使用 man usermod 命令確定系統是否支援。

    此命令對使用者的臨時鎖定,同 passwd 命令一樣,都是在 /etc/passwd 檔案目標使用者的加密密碼欄位前新增 "!",使密碼失效;反之,解鎖使用者就是將新增的 "!" 去掉。

    【例 1】

    #鎖定使用者
    [root@localhost ~]# usermod -L lamp
    [root@localhost ~]# grep "lamp" /etc/shadow
    lamp:!$6$YrPj8g0w$ChRVASybEncU24hkYFqxREH3NnzhAVDJSQLwRwTSbcA2N8UbPD9bBKVQSky xlaMGs/Eg5AQwO.UokOnKqaHFa/:15711:0:99999:7:::
    #其實鎖定就是在密碼欄位前加入"!",這時lamp使用者就暫時不能登入了
    
    #解鎖使用者
    [root@localhost ~]# usermod -U lamp
    [root@localhost ~]# grep "lamp" /etc/shadow
    lamp:$6$YrPj8g0w$ChRVASybEncU24hkYFqxREH3NnzhAVDJSQLwRwTSbcA2N8UbPD9bBKVQSkyx laMGs/Eg5AQwO.UokOnKqaHFa/:15711:0:99999:7:::
    #取消了密碼欄位前的 "!"
    

    【例 2】

    #把lamp使用者加入root組
    [root@localhost ~]# usermod -G root lamp
    [root@localhost ~]# grep "lamp" /etc/group
    root:x:0:lamp
    #lamp使用者已經加入了root組
    lamp:x:501
    

    【例 3】

    #修改使用者說明
    [root@localhost ~]# usermod -c "test user" lamp 
    [root@localhost ~]# grep "lamp" /etc/passwd
    lamp:x:501:501:test user:/home/lamp:/bin/bash
    #檢視一下,使用者說明已經被修改了
    
  4. 修改使用者密碼狀態 chage

    除了 passwd -S 命令可以檢視使用者的密碼資訊外,還可以利用 chage 命令,它可以顯示更加詳細的使用者密碼資訊,並且和 passwd 命令一樣,提供了修改使用者密碼資訊的功能。

    如果你要修改使用者的密碼資訊,我個人建議,還是直接修改 /etc/shadow 檔案更加方便。

    我們來看 chage 命令的基本格式:

    [root@localhost ~]#chage [選項] 使用者名稱
    
    選項 含義
    -l 列出使用者的詳細密碼狀態;
    -d 日期 修改 /etc/shadow 檔案中指定使用者密碼資訊的第 3 個欄位,也就是最後一次修改密碼的日期,格式為 YYYY-MM-DD;
    -m 天數 修改密碼最短保留的天數,也就是 /etc/shadow 檔案中的第 4 個欄位;
    -M 天數 修改密碼的有效期,也就是 /etc/shadow 檔案中的第 5 個欄位;
    -W 天數 修改密碼到期前的警告天數,也就是 /etc/shadow 檔案中的第 6 個欄位;
    -i 天數 修改密碼過期後的寬限天數,也就是 /etc/shadow 檔案中的第 7 個欄位;
    -E 日期 修改賬號失效日期,格式為 YYYY-MM-DD,也就是 /etc/shadow 檔案中的第 8 個欄位。
    #檢視一下使用者密碼狀態
    [root@localhost ~]# chage -l lamp
    Last password change:Jan 06, 2013
    Password expires:never
    Password inactive :never
    Account expires :never
    Minimum number of days between password change :0
    Maximum number of days between password change :99999
    Number of days of warning before password expires :7
    

    讀者可能會問,既然直接修改使用者密碼檔案更方便,為什麼還要講解 chage 命令呢?因為 chage 命令除了修改密碼資訊的功能外,還可以強制使用者在第一次登入後,必須先修改密碼,並利用新密碼重新登陸系統,此使用者才能正常使用。

  5. 刪除使用者 userdel

    userdel 命令功能很簡單,就是刪除使用者的相關資料。此命令只有 root 使用者才能使用。

    通過前面的學習我們知道,使用者的相關資料包含如下幾項:

    • 使用者基本資訊:儲存在 /etc/passwd 檔案中;
    • 使用者密碼資訊:儲存在 /etc/shadow 檔案中;
    • 使用者群組基本資訊:儲存在 /etc/group 檔案中;
    • 使用者群組資訊資訊:儲存在 /etc/gshadow 檔案中;
    • 使用者個人檔案:主目錄預設位於 /home/使用者名稱,郵箱位於 /var/spool/mail/使用者名稱。

    其實,userdel 命令的作用就是從以上檔案中,刪除與指定使用者有關的資料資訊。

    userdel 命令的語法很簡單,基本格式如下:

    [root@localhost ~]# userdel -r 使用者名稱
    

    -r 選項表示在刪除使用者的同時刪除使用者的家目錄。

    注意,在刪除使用者的同時如果不刪除使用者的家目錄,那麼家目錄就會變成沒有屬主和屬組的目錄,也就是垃圾檔案。

  6. 檢視使用者的UID和GID id

    id 命令可以查詢使用者的UID、GID 和附加組的資訊。命令比較簡單,格式如下:

    [root@localhost ~]# id 使用者名稱
    

    【例 1】

    [root@localhost ~]# id lamp
    uid=501(lamp) gid=501(lamp) groups=501(lamp)
    #能看到uid(使用者ID)、gid(初始組ID), groups是使用者所在組,這裡既可以看到初始組,如果有附加組,則也能看到附加組
    

    【例 2】

    [root@localhost ~]# usermod -G root lamp
    #把使用者加入root組
    [root@localhost ~]# id lamp
    uid=501(lamp) gid=501(lamp) groups=501(lamp),0(root)
    #大家發現root組中加入了lamp使用者的附加組資訊
    
  7. 使用者間切換(包含su和su -的區別)

    su 是最簡單的使用者切換命令,通過該命令可以實現任何身份的切換,包括從普通使用者切換為 root 使用者、從 root 使用者切換為普通使用者以及普通使用者之間的切換。

    普通使用者之間切換以及普通使用者切換至 root 使用者,都需要知曉對方的密碼,只有正確輸入密碼,才能實現切換;從 root 使用者切換至其他使用者,無需知曉對方密碼,直接可切換成功。

    su 命令的基本格式如下:

    [root@localhost ~]# su [選項] 使用者名稱
    
    選項 含義
    - 當前使用者不僅切換為指定使用者的身份,同時所用的工作環境也切換為此使用者的環境(包括 PATH 變數、MAIL 變數等),使用 - 選項可省略使用者名稱,預設會切換為 root 使用者。
    -l 同 - 的使用類似,也就是在切換使用者身份的同時,完整切換工作環境,但後面需要新增欲切換的使用者賬號。
    -p 表示切換為指定使用者的身份,但不改變當前的工作環境(不使用切換使用者的配置檔案)。
    -m 和 -p 一樣;
    -c 命令 僅切換使用者執行一次命令,執行後自動切換回來,該選項後通常會帶有要執行的命令。

    【例 1】

    [lamp@localhost ~]$ su -root
    密碼: <-- 輸入 root 使用者的密碼
    #"-"代表連帶環境變數一起切換,不能省略
    

    【例 2】

    [lamp@localhost ~]$ whoami
    lamp
    #當前我是lamp
    [lamp@localhost ~]$ su - -c "useradd user1" root
    密碼:
    #不切換成root,但是執行useradd命令新增user1使用者
    [lamp@localhost ~]$ whoami
    lamp
    #我還是lamp
    [lamp@localhost ~]$ grep "user1' /etc/passwd
    userl:x:502:504::/home/user1:/bin/bash
    #user使用者已經新增了
    

    除了像例 2 這樣,執行一條命令後使用者身份會隨即自動切換回來,其他切換使用者的方式不會自動切換,只能使用 exit 命令進行手動切換,例如:

    [lamp@localhost ~]$ whoami
    lamp
    #當前我是lamp
    [lamp@localhost ~]$ su - lamp1
    Password:   <--輸入lamp1使用者的密碼
    #切換至 lamp1 使用者的工作環境
    [lamp@localhost ~]$ whoami
    lamp1
    #什麼也不做,立即退出切換環境
    [lamp1@localhost ~]$ exit
    logout
    [lamp@localhost ~]$ whoami
    lamp
    

    su 和 su - 的區別

    注意使用 su 命令時,有 - 和沒有 - 是完全不同的,- 選項表示在切換使用者身份的同時,連當前使用的環境變數也切換成指定使用者的。我們知道,環境變數是用來定義作業系統環境的,因此如果系統環境沒有隨使用者身份切換,很多命令無法正確執行。

    舉個例子,普通使用者 lamp 通過 su 命令切換成 root 使用者,但沒有使用 - 選項,這樣情況下,雖然看似是 root 使用者,但系統中的 $PATH 環境變數依然是 lamp 的(而不是 root 的),因此當前工作環境中,並不包含 /sbin、/usr/sbin等超級使用者命令的儲存路徑,這就導致很多管理員命令根本無法使用。不僅如此,當 root 使用者接受郵件時,會發現收到的是 lamp 使用者的郵件,因為環境變數 $MAIL 也沒有切換。

    可以這樣理解它們之間的區別,即有 - 選項,切換使用者身份更徹底;反之,只切換了一部分,這會導致某些命令執行出現問題或錯誤(例如無法使用 service 命令)。

  8. whoami和who am i命令用法和區別

    whoami 命令和 who am i 命令是不同的 2 個命令,前者用來列印當前執行操作的使用者名稱,後者則用來列印登陸當前 Linux 系統的使用者名稱。

    為了能夠更好地區分這 2 個命令的功能,舉個例子,首先使用使用者名稱為“Cyuyan”登陸 Linux 系統,然後執行如下命令:

    [Cyuyan@localhost ~]$ whoami
    Cyuyan
    [Cyuyan@localhost ~]$ who am i
    Cyuyan    pts/0    2017-10-09 15:30 (:0.0)
    

    在此基礎上,使用 su 命令切換到 root 使用者下,再執行一遍上面的命令:

    [Cyuyan@localhost ~] su - root
    [root@localhost ~]$ whoami
    root
    [root@localhost ~]$ who am i
    Cyuyan    pts/0    2017-10-09 15:30 (:0.0)
    

    看到了嗎?在未切換使用者身份之前,whoami 和 who am i 命令的輸出是一樣的,但使用 su 命令切換使用者身份後,使用 whoami 命令列印的是切換後的使用者名稱,而 who am i 命令列印的仍舊是登陸系統時所用的使用者名稱。

  9. 新增使用者組 groupadd

    新增使用者組的命令是 groupadd,命令格式如下:

    [root@localhost ~]# groupadd [選項] 組名
    
    選項 含義
    -g GID 指定組 ID;
    -r 建立系統群組;

    使用 groupadd 命令建立新群組非常簡單,例如:

    [root@localhost ~]# groupadd group1
    #新增group1組
    [root@localhost ~]# grep "group1" /etc/group
    /etc/group:group1:x:502:
    /etc/gshadow:group1:!::
    
  10. 修改使用者組 groupmod

    groupmod 命令用於修改使用者組的相關資訊,命令格式如下:

    [root@localhost ~]# groupmod [選現] 組名
    
    選項 含義
    -g GID 修改組 ID;
    -n 新組名 修改組名;

    【例 1】

    [root@localhost ~]# groupmod -n testgrp group1
    #把組名group1修改為testgrp
    [root@localhost ~]# grep "testgrp" /etc/group
    testgrp:x:502:
    #注意GID還是502,但是組名已經改變
    

    不過大家還是要注意,使用者名稱不要隨意修改,組名和 GID 也不要隨意修改,因為非常容易導致管理員邏輯混亂。如果非要修改使用者名稱或組名,則建議大家先刪除舊的,再建立新的。

  11. 刪除使用者組 groupdel

    groupdel 命令用於刪除使用者組(群組),此命令基本格式為:

    [root@localhost ~]#groupdel 組名
    

    通過前面的學習不難猜測出,使用 groupdel 命令刪除群組,其實就是刪除 /etc/gourp 檔案和 /etc/gshadow 檔案中有關目標群組的資料資訊。

    例如,刪除前面章節中用 groupadd 命令建立的群組 group1,執行命令如下:

    [root@localhost ~]#grep "group1" /etc/group /etc/gshadow
    /etc/group:group1:x:505:
    /etc/gshadow:group1:!::
    [root@localhost ~]#groupdel group1
    [root@localhost ~]#grep "group1" /etc/group /etc/gshadow
    [root@localhost ~]#
    

    注意,不能使用 groupdel 命令隨意刪除群組。此命令僅適用於刪除那些 "不是任何使用者初始組" 的群組,換句話說,如果有群組還是某使用者的初始群組,則無法使用 groupdel 命令成功刪除。例如:

    [root@localhost ~]# useradd temp
    #執行如下命令,可以看到 temp 使用者建立的同時,還建立了 temp 群組,且將其作為 temp使用者的初始組(組ID都是 505)
    [root@localhost ~]# grep "temp" /etc/passwd /etc/group /etc/gshadow
    /etc/passwd:temp:x:505:505::/home/temp:/bin/bash
    /etc/group:temp:x:505:
    /etc/gshadow:temp:!::
    #下面嘗試刪除 temp 群組
    [root@localhost ~]# groupdel temp
    groupdel:cannot remove the primary group of user 'temp'
    

    可以看到,groupdel 命令刪除 temp 群組失敗,且提示“不能刪除 temp 使用者的初始組”。如果一定要刪除 temp 群組,要麼修改 temp 使用者的 GID,也就是將其初始組改為其他群組,要麼先刪除 temp 使用者。

    切記,雖然我們已經學瞭如何手動刪除群組資料,但胡亂地刪除群組可能會給其他使用者造成不小的麻煩,因此更改檔案資料要格外慎重。

  12. 把使用者新增進組或從組中刪除 gpasswd

    為了避免系統管理員(root)太忙碌,無法及時管理群組,我們可以使用 gpasswd 命令給群組設定一個群組管理員,代替 root 完成將使用者加入或移出群組的操作。

    gpasswd 命令的基本格式如下:

    [root@localhost ~]# gpasswd 選項 組名
    
    選項 功能
    選項為空時,表示給群組設定密碼,僅 root 使用者可用。
    -A user1,... 將群組的控制權交給 user1,... 等使用者管理,也就是說,設定 user1,... 等使用者為群組的管理員,僅 root 使用者可用。
    -M user1,... 將 user1,... 加入到此群組中,僅 root 使用者可用。
    -r 移除群組的密碼,僅 root 使用者可用。
    -R 讓群組的密碼失效,僅 root 使用者可用。
    -a user 將 user 使用者加入到群組中。
    -d user 將 user 使用者從群組中移除。

    除 root 可以管理群組外,可設定多個普通使用者作為群組的管理員,但也只能做“將使用者加入群組”和“將使用者移出群組”的操作。

    【例 1】

    #建立新群組 group1,並將群組交給 lamp 管理
    [root@localhost ~]# groupadd group1  <-- 建立群組
    [root@localhost ~]# gpasswd group1   <-- 設定密碼吧!
    Changing the password for group group1
    New Password:
    Re-enter new password:
    [root@localhost ~]# gpasswd -A lamp group1  <==加入群組管理員為 lamp
    [root@localhost ~]# grep "group1" /etc/group /etc/gshadow
    /etc/group:group1:x:506:
    /etc/gshadow:group1:$1$I5ukIY1.$o5fmW.cOsc8.K.FHAFLWg0:lamp:
    

    可以看到,此時 lamp 使用者即為 group1 群組的管理員。

    【例 2】

    #以lamp使用者登陸系統,並將使用者 lamp 和 lamp1 加入group1群組。
    [lamp@localhost ~]#gpasswd -a lamp group1
    [lamp@localhost ~]#gpasswd -a lamp1 group1
    [lamp@localhost ~]#grep "group1" /etc/group
    group1:x:506:lamp,lamp1
    

    前面講過,使用 usermod -G 命令也可以將使用者加入群組,但會產生一個問題,即使用此命令將使用者加入到新的群組後,該使用者之前加入的那些群組都將被清空。例如:

    #新建立一個群組group2
    [root@localhost ~]# groupadd group2
    [root@localhost ~]# usermod -G group2 lamp
    [root@localhost ~]# grep "group2" /etc/group
    group2:x:509:lamp
    [root@localhost ~]# grep "group1" /etc/group
    group1:x:506:lamp1
    

    對比例 2 可以發現,雖然使用 usermod 命令成功地將 lamp 使用者加入在 group2 群組中,但 lamp 使用者原本在 group1 群組中,此時卻被移出,這就是使用 usermod 命令造成的。

    因此,將使用者加入或移出群組,最好使用 gpasswd 命令。

七、總結

記住!!有關於刪除的一定要三思而後行!!!!

相關文章