一、概述
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 種:
- 一對一:一個用戶可以存在一個組中,是組中的唯一成員;
- 一對多:一個用戶可以存在多個用戶組中,此用戶具有這多個組的共同權限;
- 多對一:多個用戶可以存在一個組中,這些用戶具有和組相同的權限;
- 多對多:多個用戶可以存在多個組中,也就是以上 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 程序提供了必要的驗證訪問權,該程序具有根權限但可由任何用戶運行。
/etc/passwd內容解釋
下圖是passwd文件內容:
可以看到,/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
/etc/shadow文件解析
/etc/shadow
文件,用於存儲 Linux 系統中用戶的密碼信息,又稱為“影子文件”。
/etc/shadow 文件只有 root 用戶擁有讀權限,其他用戶沒有任何權限,這樣就保證了用戶密碼的安全性。
同 /etc/passwd
文件一樣,文件中每行代表一個用戶,同樣使用 ":" 作為分隔符,不同之處在於,每行用戶信息被划分為 9 個字段。每個字段的含義如下:
用戶名:加密密碼:最后一次修改時間:最小修改時間間隔:密碼有效期:密碼需要變更前的警告天數:密碼過期后的寬限時間:賬號失效時間:保留字段
需要注意的是,加密密碼:
這里保存的是真正加密的密碼。目前 Linux 的密碼采用的是 SHA512 散列加密算法,原來采用的是 MD5 或 DES 加密算法。SHA512 散列加密算法的加密等級更高,也更加安全。
注意,這串密碼產生的亂碼不能手工修改,如果手工修改,系統將無法識別密碼,導致密碼失效。很多軟件透過這個功能,在密碼串前加上 "!"、"*" 或 "x" 使密碼暫時失效。
所有偽用戶的密碼都是 "!!" 或 "*",代表沒有密碼是不能登錄的。當然,新創建的用戶如果不設定密碼,那么它的密碼項也是 "!!",代表這個用戶沒有密碼,不能登錄。
/etc/group文件解析
/ect/group
文件是用戶組配置文件,即用戶組的所有信息都存放在此文件中。
此文件是記錄組 ID(GID)和組名相對應的文件。前面講過,etc/passwd
文件中每行用戶信息的第四個字段記錄的是用戶的初始組 ID,那么,此 GID 的組名到底是什么呢?就要從 /etc/group 文件中查找。
/etc/group 文件的內容可以通過 cat 看到:
此文件中每一行各代表一個用戶組。
各用戶組中,還是以 ":" 作為字段之間的分隔符,分為 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
文件中提取和這個用戶相匹配的密碼。
/etc/gshadow文件解析
/etc/passwd
文件存儲用戶基本信息,同時考慮到賬戶的安全性,將用戶的密碼信息存放另一個文件 /etc/shadow
中。/etc/gshadow
文件也是如此,組用戶信息存儲在/etc/group
文件中,而將組用戶的密碼信息存儲在/etc/gshadow
文件中。
cat命令查看一下此文件中的內容:
文件中,每行代表一個組用戶的密碼信息,各行信息用 ":" 作為分隔符分為 4 個字段,每個字段的含義如下:
組名:加密密碼:組管理員:組附加用戶列表
組名
同 /etc/group
文件中的組名相對應。
組密碼
對於大多數用戶來說,通常不設置組密碼,因此該字段常為空,但有時為 "!",指的是該群組沒有組密碼,也不設有群組管理員。
組管理員
從系統管理員的角度來說,該文件最大的功能就是創建群組管理員。那么,什么是群組管理員呢?
考慮到 Linux 系統中賬號太多,而超級管理員 root 可能比較忙碌,因此當有用戶想要加入某群組時,root 或許不能及時作出回應。這種情況下,如果有群組管理員,那么他就能將用戶加入自己管理的群組中,也就免去麻煩 root 了。
不過,由於目前有 sudo 之類的工具,因此群組管理員的這個功能已經很少使用了。
組中的附加用戶
該字段顯示這個用戶組中有哪些附加用戶,和 /etc/group
文件中附加組顯示內容相同。
五、用戶與組常用操作
新增用戶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 普通用戶。
修改用戶密碼 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 命令修改自己的密碼,而不能修改其他用戶的密碼。
修改用戶信息 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 文件目標用戶的加密密碼字段前添加 "!",使密碼失效;反之,解鎖用戶就是將添加的 "!" 去掉。
修改用戶密碼狀態 chage
除了 passwd -S
命令可以查看用戶的密碼信息外,還可以利用 chage 命令,它可以顯示更加詳細的用戶密碼信息,並且和 passwd 命令一樣,提供了修改用戶密碼信息的功能。
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 命令除了修改密碼信息的功能外,還可以強制用戶在第一次登錄后,必須先修改密碼,並利用新密碼重新登陸系統,此用戶才能正常使用。
刪除用戶 userdel
userdel 命令功能很簡單,就是刪除用戶的相關數據。此命令只有 root 用戶才能使用。
用戶的相關數據包含如下幾項:
- 用戶基本信息:存儲在 /etc/passwd 文件中;
- 用戶密碼信息:存儲在 /etc/shadow 文件中;
- 用戶群組基本信息:存儲在 /etc/group 文件中;
- 用戶群組信息信息:存儲在 /etc/gshadow 文件中;
- 用戶個人文件:主目錄默認位於 /home/用戶名,郵箱位於 /var/spool/mail/用戶名。
其實,userdel 命令的作用就是從以上文件中,刪除與指定用戶有關的數據信息。
userdel 命令的語法很簡單,基本格式如下:
[root@localhost ~]# userdel -r 用戶名
-r 選項表示在刪除用戶的同時刪除用戶的家目錄。
注意,在刪除用戶的同時如果不刪除用戶的家目錄,那么家目錄就會變成沒有屬主和屬組的目錄,也就是垃圾文件。
查看用戶的UID和GID id
id 命令可以查詢用戶的UID、GID 和附加組的信息。命令比較簡單,格式如下:
[root@localhost ~]# id 用戶名
[root@localhost ~]# id lamp uid=501(lamp) gid=501(lamp) groups=501(lamp) #能看到uid(用戶ID)、gid(初始組ID), groups是用戶所在組,這里既可以看到初始組,如果有附加組,則也能看到附加組
[root@localhost ~]# usermod -G root lamp #把用戶加入root組 [root@localhost ~]# id lamp uid=501(lamp) gid=501(lamp) groups=501(lamp),0(root) #發現root組中加入了lamp用戶的附加組信息
用戶間切換(包含su和su -的區別)
su 是最簡單的用戶切換命令,通過該命令可以實現任何身份的切換,包括從普通用戶切換為 root 用戶、從 root 用戶切換為普通用戶以及普通用戶之間的切換。
普通用戶之間切換以及普通用戶切換至 root 用戶,都需要知曉對方的密碼,只有正確輸入密碼,才能實現切換;從 root 用戶切換至其他用戶,無需知曉對方密碼,直接可切換成功。
su 命令的基本格式如下:
[root@localhost ~]# su [選項] 用戶名
選項 | 含義 |
---|---|
- | 當前用戶不僅切換為指定用戶的身份,同時所用的工作環境也切換為此用戶的環境(包括 PATH 變量、MAIL 變量等),使用 - 選項可省略用戶名,默認會切換為 root 用戶。 |
-l | 同 - 的使用類似,也就是在切換用戶身份的同時,完整切換工作環境,但后面需要添加欲切換的使用者賬號。 |
-p | 表示切換為指定用戶的身份,但不改變當前的工作環境(不使用切換用戶的配置文件)。 |
-m | 和 -p 一樣; |
-c 命令 | 僅切換用戶執行一次命令,執行后自動切換回來,該選項后通常會帶有要執行的命令。 |
[lamp@localhost ~]$ su - root 密碼: <-- 輸入 root 用戶的密碼 #"-"代表連帶環境變量一起切換,不能省略
su 和 su - 的區別
注意,使用 su 命令時,有 - 和沒有 - 是完全不同的,- 選項表示在切換用戶身份的同時,連當前使用的環境變量也切換成指定用戶的。我們知道,環境變量是用來定義操作系統環境的,因此如果系統環境沒有隨用戶身份切換,很多命令無法正確執行。
例如:普通用戶 lamp 通過 su 命令切換成 root 用戶,但沒有使用 - 選項,這樣情況下,雖然看似是 root 用戶,但系統中的 $PATH 環境變量依然是 lamp 的(而不是 root 的),因此當前工作環境中,並不包含 /sbin、/usr/sbin等超級用戶命令的保存路徑,這就導致很多管理員命令根本無法使用。不僅如此,當 root 用戶接受郵件時,會發現收到的是 lamp 用戶的郵件,因為環境變量 $MAIL 也沒有切換。
可以這樣理解它們之間的區別,即有 - 選項,切換用戶身份更徹底;反之,只切換了一部分,這會導致某些命令運行出現問題或錯誤(例如無法使用 service 命令)。
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 命令打印的仍舊是登陸系統時所用的用戶名。
添加用戶組 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:!::
修改用戶組 groupmod
groupmod 命令用於修改用戶組的相關信息,命令格式如下:
[root@localhost ~]# groupmod [選現] 組名
選項 | 含義 |
---|---|
-g GID | 修改組 ID; |
-n 新組名 | 修改組名; |
[root@localhost ~]# groupmod -n testgrp group1 #把組名group1修改為testgrp [root@localhost ~]# grep "testgrp" /etc/group testgrp:x:502: #注意GID還是502,但是組名已經改變
不過要注意,用戶名不要隨意修改,組名和 GID 也不要隨意修改,因為非常容易導致管理員邏輯混亂。如果非要修改用戶名或組名,則建議大家先刪除舊的,再建立新的。
刪除用戶組 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 命令成功刪除。
把用戶添加進組或從組中刪除 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 可以管理群組外,可設置多個普通用戶作為群組的管理員,但也只能做“將用戶加入群組”和“將用戶移出群組”的操作。
#創建新群組 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 群組的管理員。
#以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 命令。