(四)Linux之用戶管理(用戶和用戶組)

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 文件目標用戶的加密密碼欄位前添加 “!”,使密碼失效;反之,解鎖用戶就是將添加的 “!” 去掉。

  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 命令。

七、總結

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

Tags: