10分鐘Linux-用戶管理
了
解賬號的基本概念,掌握了創建、修改和刪除用戶賬號命令後。接下來介紹Linux本機賬號到底記錄了哪些信息以及賬號信息儲存的位置。
01
用戶賬號數據文件
本機的用戶賬號數據儲存於/etc/passwd文件中。與其他的配置文件一樣,passwd 也是一個文本文件,因此,你可以直接使用文字處理程序,例如:cat 或 less 瀏覽其中的內容。
以下是我這台主機上 /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
/etc/passwd 中每一行代表一個用戶的賬號數據,每一行又使用冒號(:)分隔出七個欄位,每個欄位的名稱如下所示:
USERNAME:PASSWORD:UID:GID:COMMENT:HOMEDIR:SHELL
每一個欄位詳細的解釋說明如下:
1
USERNAME:用戶名稱,用來表示用戶數據的識別名稱。用戶名稱最長為32 個字元,可以包含大小寫英文字母、下劃線 (_)、連接線 (-)和阿拉伯數字。其中阿拉伯數字不能作為用戶名稱的第一個字元,除此之外為了避免某些系統出現問題,我強烈建議你儘可能不要使用大寫英文字母。
由於用戶名稱是用戶登錄時必須提供的信息,因此,又稱為登錄名稱(Login Name),或是賬號名稱(Account Name)。
2
PASSWORD:這
個欄位儲存用戶的密碼數據。由於 /etc/passwd 文件的許可權規定必須為0644,也就是 rw-r--r--。因此,Linux 上的任何一個用戶都可以直接讀取 /etc/passwd 的內容。為了保護密碼的安全,這個欄位儲存到/etc/shadow密碼文件中。
如果這個欄位出現的是「x」字元,則代表該用戶的密碼被儲存到其他地方;
如果這個欄位是空的,則代表該用戶不需要密碼就可以通過 Linux 的驗證。
如果passwd欄位中的第一個字元是「*」的話,那麼,就表示該賬號被查封了,系統不允許持有該賬號的用戶登錄。
3
UID:UID是用戶標識符 (User ID)的縮寫,由於 Linux 以後的 UID 是一個32 位長度的數值,所以 UID 的範圍為 0 到4,294,967,296 之間的正整數。
在 Linux 中,每一個用戶都「應該」 要擁有一個唯一的 UID,Linux 系統是根據 UID 來判斷用戶的身份。如果有兩個使用者賬號的 UID 相同,即使賬號名稱不同,你的Linux 還是會認為這是同一個用戶。
4
GID:GID 是群組標識符 (Group ID)的縮寫 ,這個欄位記錄的是用戶的主要組的標識符 (Primary Group"s GID)。
5
COMMENT:這個欄位主要用來記錄用戶的全名 (Full Name) 與其他的批註數據,例如電話號碼、通訊地址...等等。
由於賬號中的用戶名稱不允許包含空格符,因此用戶名稱便不適合記錄其全名 ,所以 Linux 才會提供這個欄位,以便記錄用戶的全名。
6
HOMEDIR:這個欄位記錄用戶登錄系統後第一個要進入的目錄,通常是用戶的家目錄,所以這個欄位就被稱為家目錄路徑 (Home Directory Path),值得注意的是這個位置儲存的必須是絕對路徑 (Absolute Pathname)。
如果這個目錄不存在,用戶登錄時 Linux 會以根目錄 (Root Directory) 作為用戶暫時的主目錄。
7
SHELL:這個欄位儲存用戶登錄系統後要執行程序的完整路徑名稱 (Pathname)。你可以在這個欄位指定任何的程序,用戶登錄 Linux 時,Linux 就會去執行這個程序。由於大部分的用戶登錄後,都是執行某個 Shell 程序,因此,習慣上我們會稱呼這個欄位為 「Shell」。
當用戶登錄後,Linux 會去執行 SHELL 欄位中設置的程序;當這個程序執行完畢時,Linux 就會強迫用戶註銷系統。因此,若你希望某一個用戶不能登錄你的 Linux,那麼只需在 SHELL 欄位指定類似 /bin/false、/sbin/nologin...等一執行就馬上結束的程序即可。
舉個例子
根據之前的介紹,我們知道 /etc/passwd 文件儲存了本機的用戶賬號,你只要依照/etc/passwd的格式填入賬號的信息,就可以手動的建立、更改、甚至刪除用戶賬號了!不信?請看下列的例子:
# id jinlong
id: jinlong: No such user
# echo "jinlong::800:800::/home/jinlong:/bin/bash" >> /etc/passwd
# id jinlong
uid=800(jinlong) gid=800 groups=800
① 先用 id 命令查詢 jinlong 這個用戶賬號是否存在,id 命令告訴我:「No such user」,代表沒有 jinlong 這個用戶。
② 直接使用 echo 命令將符合 /etc/passwd 格式的 jinlong 賬號數據追加在/etc/passwd 文件後。
③ 再使用 id 命令查詢 jinlong 賬號,結果,就查詢到 jinlong 這個用戶了!
既然賬號已經創建出來,那我試著用jinlong賬號登錄Linux系統吧。
Red Hat Enterprise Linux Server release 6.7 (Santiago)
Kernel 2.6.32-573.el6.x86_64 on an x86_64
localhost login: jinlong ①
No directory /home/jinlong! Logging in with home = "/". ②
id: cannot find name for group ID 800 ③
-bash-4.1$ whoami ④
jinlong
-bash-4.1$ pwd ⑤
/
-bash-4.1$
① 使用 jinlong 登錄我的 Linux系統。
② 由於我只有添加 jinlong 的賬號數據,並沒有建立主目錄,所以 Linux 告訴我們,找不到 /home/jinlong/ 也就是 jinlong 的家目錄。最後,Linux 只好讓 jinlong 使用 / 作為主目錄。
③ 由於我只有添加 jinlong 的賬號數據,並沒有添加組賬號數據,所以,Linux提示我們說,找不到組ID 800對應的組名稱
④使用 whoami 工具,查詢「我是誰」?
⑤ 最後,使用 pwd 查看一下目前的工作目錄,pwd 響應說是 / (根目錄)。
02
組賬號數據文件
本機的組賬號數據被儲存在 /etc/group 文件中,與 /etc/passwd 一樣,這也是一個文本文件。以下是我的 /etc/group 前三行的內容:
root:x:0:
bin:x:1:bin,daemon
daemon:x:2:bin,daemon
這個文件與 /etc/passwd的格式類似,每一行代表一批群組賬號的資料。每一行的格式如下:
GROUPNAME:PASSWORD:GID:MEMBERS
每一行中包含四個欄位,每個欄位以冒號(:) 區隔開來,每個欄位的內容如下說明:
1
GROUPNAME:組名,與用戶名稱一樣,必須是以大小寫英文字母、阿拉伯數字、連接線(-)與下劃線(_) 符號所組成,其長度必須在 32 個字元以下。
2
PASSWORD:組密碼,也必須是加密後的密碼。如果這個欄位出現的是 「x」 字元,則代表該用戶的密碼被儲存到其他地方。
3
GID:組標識符 (GID, Group ID),與 UID 一樣,GID 也是 32 位長度的正整數,範圍從 0 到 4,294,967,296。
與用戶賬號一樣,每一個組都應該擁有一個唯一的組標識符,因此一個Linux 系統,可以建立 4,294,967,296 個組賬號。
4
MEMBERS:這個欄位儲存著組成員的清單。請特別注意,由於 Linux 不支持巢狀組(Nested Group) ,因此,這個欄位記錄的是用戶賬號的名稱,而不是組!
由於一個組可以擁有多個成員,所以在這個欄位中,你可以指定多個成員,只要以一個逗號(,)分隔開來即可。
提示
所謂的巢狀組,是指系統允許組可以作為其他組的成員。
Windows 系統支持巢狀組(嵌套組);但 UNIX/Linux 不支持。
舉個例子
由於剛才我只有添加 jinlong 的賬號數據,並沒有添加組賬號數據,所以,Linux提示我們說,找不到組ID 800對應的組名稱。接下來我們添加jinlong組賬號信息,例子如下:
# groups jinlong①
jinlong : groups: cannot find name for group ID 800
800
# echo "jinlong:x:800:" >> /etc/group ②
# groups jinlong ③
jinlong : jinlong
# su - jinlong ④
su: warning: cannot change directory to /home/jinlong: No such file or directory
-bash-4.1$
①先使用groups命令查詢jinlong這個組賬號是否存在,事實表明不存在
②直接使用echo命令,將符合/etc/group格式的組賬號數據追加到/etc/group文件後
③再次使用group命令查詢,結果表明已經有jinlong這個組賬號了。
④ 使用su命令切換賬號,發現Linux依然告訴我們找不到 /home/jinlong/ 也就是 jinlong 的家目錄
那麼,如何建立用戶的主家目錄呢?
Linux 的 /etc/skel/ 就是用戶主目錄的模板 (Template)。你可以直接把 /etc/skel/ 複製成為該用戶的主目錄即可。
具體操作過程如下:
# id jinlong
uid=800(jinlong) gid=800(jinlong) groups=800(jinlong) ①
# ls -ld ~jinlong
ls: cannot access /root/jinlong: No such file or directory ②
# cp -r /etc/skel/ /home/jinlong ③
# ls -ld ~jinlong
drwxr-xr-x 2 root root 4096 Jun 15 04:22 /home/jinlong ④
# su - jinlong ⑤
$
①查詢一下 jinlong 的賬號詳細數據,由此結果可以知道,jinlong 的主要組為 jinlong 組。
② 接著,使用 ls 確認一下有沒有 jinlong 的主目錄。
③ 下一步使用 cp,直接把 /etc/skel/ 目錄複製成為 ~jinlong/。
④ 查看目錄是否創建成功
⑤ 使用su命令切換測試
關注我們
雲運維聯盟
專註Linux雲平台運維
TAG:雲運維聯盟 |