linux中與用戶管理、用戶組控制相關的主要的三個文件是 /etc/group
/etc/passwd
和/etc/shadow
。這三個文件中確定了系統中的所有用戶以及其所在組的信息,包括用戶名,用戶密碼,用戶組,用戶ID和組ID等等,直接通過修改這些文件就可以實現增加用戶等操作,而如adduser <username>
這樣的指令本質上最終也是在修改這些文件。下面對這個三個文件的內容做一個簡要分析。
/etc/group
使用vim打開該文件
vim /etc/group
可以看到文件中由多行組成,其中每行代表一個組的信息,以root組為例說明每一行的格式及含義:
root:x:0:
該行由四段組成,每一段間以:
區分,每段含義如下:
組名稱 | 組密碼 | 組ID | 組成員 |
---|---|---|---|
root | x | 0 |
- 其中組密碼均顯示為x,在unix的早期這里是直接顯示明文密碼的,后來出于安全考慮使用加密算法進行加密,并將加密后的值單獨使用一個文件進行保存
- 組成員如果顯示空缺則該組只有一個用戶且用戶名與組名相同,如果該組有多個用戶,則該字段顯示所有的用戶名,中間以
,
隔開
/etc/passwd
同樣使用vim打開該文件,可以看到該文件格式與group
類似由多行組成,每行代表了一個用戶的信息,依然以root用戶為例,該行顯示:
root:x:0:0:root:/root:/bin/bash
其中由7段組成,每段間以:
分隔,每段含義如下
用戶名 | 用戶密碼 | 用戶ID | 組ID | 備注 | 家目錄 | 啟動shell |
---|---|---|---|---|---|---|
root | x | 0 | 0 | root | /root | /bin/bash |
- 用戶密碼與上面的組密碼類似,都是為了與早期版本兼容而均顯示為x,實際的用戶密碼加密后將加密值存儲在
etc/shadow
文件中,即接下來要介紹的一個文件 - 用戶ID必須為非負數,同時0固定為root用戶,1~499為系統保留用戶,500以上則為普通用戶
- 備注為一行不含空格的字符串,用于簡要表明該用戶的信息
- 啟動shell為從該用戶登錄系統后所使用的shell程序,常用的shell有
sh
csh
ksh
tcsh
bash
等等,默認情況下為/bin/sh
,該段也可以為一個程序如python等,這樣從該用戶登錄系統后只能運行該程序,結束后退出
/etc/shadow
該文件保存用戶的密碼加密后的信息,打開該文件需要root權限,打開后第一行為root的密碼信息:
root:$id$salt$encrypted:17051:0:99999:7:::
由8個:
分割成9個字段,每個字段定義如下
用戶名 | 加密值 | 最近密碼修改時間 | 密碼最短使用天數 | 密碼最長使用天數 | n天前提示密碼即將過期 | 密碼非活動天數 | 密碼額定日期 | 保留字段 |
---|---|---|---|---|---|---|---|---|
root | $id$salt$encrypted | 17051 | 0 | 99999 | 7 |
對部分字段的說明:
- 加密值:上表中
$id$salt$encrypted
并不是實際顯示在文件中的值,而是由兩個$
符號隔開的三個字段- id:為加密方法
id | 加密方法 |
---|---|
1 | MPS |
2a | Blowfish |
5 | SHA-256 |
6 | SHA-512 |
- salt: 從[a-zA-Z0-9]中選若干字符用于進行擾亂算法
- encrpted:經過加密后的值
如果整個字段顯示!
則代表該用戶被鎖定,無法登陸,可以使用usermod -U <username
解鎖
- 最近密碼修改時間: 從1970年1月1日距密碼修改日期共經歷多少天
- 最短使用密碼使用天數:0為無限制
- 最長使用密碼使用天數:99999為無限制
- 密碼非活動天數:0表示過期立即鎖定,-1表示永不鎖定
關于這三個文件的常用bash指令
一般來說不建議直接修改這三個文件,因為這三個文件之間相互之間,以及與其他文件之間是有聯系關系的,單獨修改其中一個文件時還需要對其他關聯文件進行同步修改,而一些常用操作可以通過bash指令來完成,下面指令中<>
內為用戶定義的變量值。
- 用戶添加
useradd <usernamer>
- 用戶刪除
userdel <username>
- 用戶名修改
usermod -l <newname> <oldname>
注意這個操作僅僅只修改用戶名稱,家目錄名等需要手動更改 - 鎖定用戶
usermod -L <username>
鎖定后用戶無法登陸,需要root權限,會導致etc/passwd
的密碼字段顯示為!
- 解鎖用戶
usermod -U <sername>
解鎖后會去除etc/passwd
的密碼字段的!
- 用戶密碼修改
passwd <username>
- 更改用戶所在組
usermod -G <groups> <username>
這個指令會更改用戶到<groups>列表中的組中,如果用戶原先所在的組沒有寫入這個列表中,則用戶會自動從這個組退出,如果增加-a
選項,則不會從原先所在而沒有在<groups>中出現的的組中退出。