一、用戶信息文件 : /etc/passwd
首先我們可以使用命令man 5 passwd查看以下 passwd 文件的格式
我們看出 passwd 文件的格式是由七個字段組成,每個字段通過冒號分隔,並且每一行代表一個用戶。下面我們將通過我個人的passwd文件作爲模板,詳細介紹每一個字段的含義。
第一字段 :用戶名稱(account)
這個字段沒什麼可說的,就是用戶個人的用戶名,不過,需要注意的是用戶在起名時要遵守相應規範。
第二字段 :密碼標識(password)
該字段若是 x ,則代表這個用戶設有密碼。x 不能省略,如果省略,系統在登錄時就不會去 /etc/shadow 中搜索真正的密碼,從而認爲這個用戶沒有密碼,於是直接登錄,很不安全。
真正的密碼並不存在於 passwd 文件,而是保存在/etc/shadow中,這裏保存的只是一個密碼標識。
第三字段 :UID
0 :表示該賬戶是超級用戶
1~499 : 表示該賬戶是系統用戶(僞用戶)。專門用來爲系統的啓動服務或啓動命令服務,一旦刪除這些僞用戶,系統會崩潰。
這些用戶不能登錄,其原因在於最後一個字段的 /sbin/nologin ,我們之後再談。
500及以上 : 普通用戶
當我們想把一個普通用戶變爲超級用戶,只需把該用戶的這個字段改爲 0 ,這樣,該用戶便擁有了超級用戶的權限。
注意 : 改變的只是該用戶的權限,其家目錄還是原來的位置。
第四字段 : GID(用戶初始組ID)
初始組:指用戶一登錄就立刻擁有這個用戶組的相關權限,每個用戶都必須有一個初始組,並且初始組只能有一個,一般就是和這個用戶的用戶名相同的組名作爲這個用戶的初始組。
附加組: 指用戶可以加入多個其他的用戶組,並擁有這些組的權限,附加組可以有多個
在 passwd 該字段下看到的 GID 是這個用戶的初始組 GID,那麼這個組到底指的是哪一個組呢?這時就需要匹配 /etc/group 文件,才能看到。我們不建議更改初始組,如果需要把用戶添加到其他組中,請使用附加組。
第五字段 : 用戶說明
該字段只是對本用戶的一個備註說明,用戶可以把一些重要信息保存在這裏,方便日後的查看。
第六字段 : 家目錄
普通戶 : /home/用戶名/
管理員 : /root/
第七字段 :登錄之後的 shell
shell :命令解釋器。我們需要通過 shell 才能與系統內核進行交流,shell有很多種,Linux 中的默認 shell 是 bash。
我們發現所有僞用戶在這個字段是 /sbin/nologin , 我們知道 log in 是登錄的意思,那麼no log in就是禁止登陸,所以,所有的僞用戶才無法登錄。
也就是說,如果我把某一普通用戶的這一字段由 /bin/bash 改爲 /sbin/nologin ,該用戶就會被禁用,無法登陸。
當然,如果粗心大意把這個字段的 shell 名字寫錯了,也會造成無法登陸的情況。
二 、影子文件 /etc/shadow
這個文件也是每一行代表一個用戶,而且它與 passwd 文件的內容是對應的。shadow 下的每一行由冒號分隔的九個字段組成。
我們依然進行詳細介紹。
第一字段 : 用戶名
不贅述。
第二字段 : 加密密碼
真正的密碼就是保存在這一字段,這裏是顯示的加密後的密碼。雖然經過加密,但我們還是不要輕易把這個文件傳給別人,因爲完全可以通過暴力破解來從加密密碼中得到真正的密碼。
如果這一字段是兩個感嘆號 !!或者一個星號 * ,表示該用戶沒有設置密碼,無法登錄。
第三字段 : 密碼最後一次的修改日期
該字段是用時間戳表示的。(以1970年1月1日爲起始時間,每過一天加一,得出來的數字稱爲時間戳。)
如果我們想通過命令行對時間戳進行換算,可以用以下命令:
時間戳換算日期
date -d “1970-01-01 17066 days”
日期換算時間戳
echo $(($(date --date=”2018/01/01”+%s)/86400+1))
第四字段 : 兩次密碼的修改時間間隔
該字段所謂的間隔是與上一字段相比較的。
如果該字段是 0,則可在任意時刻修改該用戶的密碼。
假如該字段是 10 ,則要求 10 天內不允許用戶修改密碼。
第五字段 : 密碼有效期
比如設置爲30,則每隔30天必須改密碼。如果到期,根據後面第六、第七字段來行動。
我這裏的這一字段顯示的是99999,是個相當長的時間,等同永遠不會失效。
第六字段 :修改密碼警告天數 n
當距離密碼有效期(第五字段)還剩 n 天時,系統每天都會提醒你修改密碼。
第七字段 :密碼到期後的寬限天數
0:代表密碼過期後立即失效
-1:代表密碼永遠不會失效
n :往後寬限 n 天
第八字段 :賬號失效時間
要用時間戳表示。該賬號到期立即失效。
第九字段 : 保留
三、組信息文件 /etc/group
該文件顯示的是用戶組的內容,有四個字段,每個字段的特性與前面的 passwd 和 shadow 的一些字段是相似的,所以這裏簡單介紹一下。
第一字段:組名
第二字段:組密碼標誌
與 passwd 中的第二字段特性相同,只是一個密碼標誌,真正的密碼在 /etc/gshadow 中。只是我們通常不給組設置密碼。
第三字段:GID
第四字段:組中附加用戶
我們發現這個字段是空的,說明我們沒有向其中添加其他用戶。並且在這一字段,我們是看不到初始用戶的,要想查看該組的初始用戶,則要通過 GID 來與 passwd 文件對照查看。也許有人疑惑用戶名和用戶組名不是一樣嗎,何必特意去查看呢?因爲這只是一般情況,有時候也會有人故意設置成不同的名字。
四、組密碼文件 /etc/gshadow
該文件每行也是四個字段,group 和 gshadow 是兩個對應的文件,但因爲我們也很少用到它,所以這裏也只是簡述。
第一字段 : 組名
第二字段 : 組密碼
第三字段 :組管理員的用戶名
第四字段 : 組中附加用戶
這四個字段我們從名字就可以瞭解其功能和特性,不在贅述。
五、用戶管理的相關文件
關於用戶,除了以上比較重要的四個配置文件,我們還需要了解一些其他相關文件。
1、家目錄
在前文提到過,在這裏溫習一下。
普通用戶: /home/用戶名/,所有者和所屬組都是此用戶,權限是700
超級用戶: /root/,所有者和所屬組都是root用戶,權限是550
2、用戶的郵箱 : /var/spool/mail/用戶名/
之後的學習會用到,這裏先做一瞭解。
3、用戶模板目錄 : /etc/skel
這裏解釋一下什麼叫模板目錄。當我們添加一個新用戶時,進入其家目錄會發現是空的,但其實不然,這裏面還有一些隱藏文件(見下圖),這些文件自然不會是憑空出現,而是從某個地方複製過來的,這個地方就是模板目錄。
所以,我們可以進入這個模板目錄中,創建一個名爲new的文件,這樣,每次當我們添加新用戶時,這個文件就會自動複製到該用戶的家目錄中。一般我們可以寫一些警告或者注意事項在裏面。
六、用戶管理命令及探究
1、添加用戶
useradd [選項] 用戶名
-u UID : 手工指定用戶的UID號
-d 家目錄 : 手工指定用戶的家目錄
-c 用戶說明 : 手工指定用戶的說明
-g 組名 : 手工指定用戶的初始組
-G 組名 : 指定用戶的附加組
-s shell : 手工指定用戶登錄的shell,默認是 /bin/bash
接下來我們思考一下,在添加一個新用戶時,系統都做了哪些操作呢?
由前面的配置文件我們知道,首先,它在passwd、shadow、group、gshadow中都添加了一行該用戶及其用戶組的信息,然後在 /home 下創建自己的家目錄,並且從模板目錄 /etc/skel 中複製文件到其家目錄,在 /var/spool/mail 中建立自己的郵箱。
我們其實可以通過手動更改這些文件達到添加用戶的目的,不過有點繁瑣罷了。
另外在我們創建新用戶時,許多值都是系統默認的,這些值大多被保存在以下兩個配置文件中。
第一個是 /etc/default/useradd
GROUP=100 用戶默認組(公有模式,我們用的是私人模式,所以不同)
HOME=/home 用戶家目錄
INACTIVE=-1 密碼過期寬限天數
EXPIRE= 密碼失效時間
SHELL=/bin/bash 默認shell
SKEL=/etc/skel 模板目錄
CREATE_MAIL_SPOLL=yes 是否建立郵箱
第二個是 /etc/login.defs
PASS_MAX_DAYS 99999 密碼有效期
PASS_MIN_DAYS 0 密碼修改間隔
PASS_MIN_LEN 5 密碼最小位數(由於太簡單了,所以這裏未生效,真正的位數定義在別的地方)
PASS_WARN_AGE 7 密碼到期時間
UID MIN 500 最小和最大UID範圍
UID_MAX 60000
GID MIN 500 最小和最大GID範圍
GID_MAX 60000
2、更改密碼
passwd [選項] 用戶名
-S 查詢用戶的密碼狀態 (root權限)
-l (小寫 L) 鎖定用戶(實際上是在shadow中的加密密碼字段前加了兩個感嘆號, root權限)
-u 解鎖用戶 (root權限)
--stdin 可通過管道符輸出的數據作爲用戶的密碼(echo “123” | passwd -–stdin 用戶名)
我們之前在介紹shadow配置文件時,曾說過其第二字段加密密碼,如果密碼位是 !! 或 * 代表沒有密碼,不能登錄。現在把這句更新一下,如果在該字段的加密密碼前有感嘆號,其效果也是一樣的。這樣用戶無法登陸,也就達到了鎖定用戶的結果。這就是 passwd -l 鎖定用戶和 passwd -u 解鎖用戶的原理。(詳見下圖)
3、修改用戶信息(針對已存在的用戶)
usermod [選項] 用戶名
-u 修改UID
-c 修改說明信息
-G 修改附加組
-L 鎖定用戶
(實際上是在 shadow 中的加密密碼字段前加了一個感嘆號,通過passwd鎖定用戶是加兩個感嘆號,其實作用都一樣)
-U 解鎖用戶
4、更改用戶密碼狀態
chage [選項] 用戶名
-l (小寫L) : 列出用戶詳細的密碼狀態
-d 日期 : 修改密碼的最後一次的修改日期
-m 天數 : 兩次密碼修改間隔(shadow字段4)
-M 天數 :密碼有效期(shadow字段5)
-w 天數 :密碼過期前警告天數(shadow字段6)
-I 天數 : 密碼過期後寬限天數(shadow字段7)
-E 日期 : 賬號失效時間(shadow字段8)
實際上,這些命令都可以通過修改配置文件 shadow 來達到,其實這個命令中最常用的一條命令爲
chage -d 0 用戶名
這個命令其實是把密碼修改日期歸零了,這樣用戶在一登錄就需要修改密碼,修改過後,shadow第三字段發生改變,該用戶以後就可以正常使用了。這條命令的作用常見於批量添加用戶後設置了一個極爲簡單的密碼,當某人使用其中的一個用戶第一次登錄時,就可以創建屬於自己的密碼。
5、刪除用戶
userdel [選項] 用戶名
-r 刪除用戶同時刪除用戶家目錄
相當於手動刪除這些文件:
/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow、/var/spool/mail/用戶名、/home/用戶名
6、切換用戶身份
su [選項] 用戶名
- : 連帶用戶的環境變量一起切換
-c :僅執行一次命令,而不切換用戶身份
如果我們只用用 su root 命令切換用戶身份,通過 env 命令查看環境變量時,發現一些信息根本沒變(見下圖)。既然已經切換了root,爲什麼有些地方還是看起來還是之前的普通用戶?這一問題通常會導致一些常見的錯誤發生。所以我們在切換用戶時,一定要使用 “-” 選項
su – root -c “useradd test_3”
不切換成root,只是利用root身份執行一個命令。
7、添加組
groupadd [選項] 組名
-g GID : 指定組id
8、修改組
groupmod [選項] 組名
-g GID : 修改組id
-n 新組名 :修改組名
例:group -n group2 group1 把組名從group1修改爲group2
9、刪除用戶組
groupdel 組名
如果該組中有初始用戶,該組是刪除不了的
如果該組中只有附加用戶,可以刪除
10、向組中添加用戶
gpasswd [選項] 組名
-a 用戶名 :把用戶加入組
-d 用戶名 : 把用戶從組中刪除