用戶和組文件介紹
1.用戶賬號文件:passwd
passwd命令用於設置用戶的認證信息,包括用戶密碼、密碼過期時間等。系統管理者則能用它管理系統用戶的密碼。只有管理者可以指定用戶名稱,一般用戶只能變更自己的密碼。
選項
-d:刪除密碼,僅有系統管理者才能使用; -f:強制執行; -k:設置只有在密碼過期失效后,方能更新; -l:鎖住密碼; -s:列出密碼的相關信息,僅有系統管理者才能使用; -u:解開已上鎖的帳號。
知識擴展
與用戶、組賬戶信息相關的文件
存放用戶信息:
/etc/passwd /etc/shadow
存放組信息:
/etc/group /etc/gshadow
用戶信息文件分析(每項用:
隔開)
例如:jack:X:503:504:::/home/jack/:/bin/bash
jack //用戶名
X //口令、密碼
503 //用戶id(0代表root、普通新建用戶從500開始)
504 //所在組
: //描述
/home/jack/ //用戶主目錄
/bin/bash //用戶缺省Shell
組信息文件分析
例如:jack:$!$:???:13801:0:99999:7:*:*: jack //組名 $!$ //被加密的口令 13801 //創建日期與今天相隔的天數 0 //口令最短位數 99999 //用戶口令 7 //到7天時提醒 * //禁用天數 * //過期天數
實例
如果是普通用戶執行passwd只能修改自己的密碼。如果新建用戶后,要為新用戶創建密碼,則用passwd用戶名,注意要以root用戶的權限來創建。
[root@localhost ~]# passwd linuxde //更改或創建linuxde用戶的密碼; Changing password for user linuxde. New UNIX password: //請輸入新密碼; Retype new UNIX password: //再輸入一次; passwd: all authentication tokens updated successfully. //成功;
普通用戶如果想更改自己的密碼,直接運行passwd即可,比如當前操作的用戶是linuxde。
[linuxde@localhost ~]$ passwd Changing password for user linuxde. //更改linuxde用戶的密碼; (current) UNIX password: //請輸入當前密碼; New UNIX password: //請輸入新密碼; Retype new UNIX password: //確認新密碼; passwd: all authentication tokens updated successfully. //更改成功;
比如我們讓某個用戶不能修改密碼,可以用-l
選項來鎖定:
[root@localhost ~]# passwd -l linuxde //鎖定用戶linuxde不能更改密碼;
Locking password for user linuxde.
passwd: Success //鎖定成功;
[linuxde@localhost ~]# su linuxde //通過su切換到linuxde用戶;
[linuxde@localhost ~]$ passwd //linuxde來更改密碼;
Changing password for user linuxde.
Changing password for linuxde
(current) UNIX password: //輸入linuxde的當前密碼;
passwd: Authentication token manipulation error //失敗,不能更改密碼;
再來一例:
[root@localhost ~]# passwd -d linuxde //清除linuxde用戶密碼; Removing password for user linuxde. passwd: Success //清除成功; [root@localhost ~]# passwd -S linuxde //查詢linuxde用戶密碼狀態; Empty password. //空密碼,也就是沒有密碼;
注意:當我們清除一個用戶的密碼時,登錄時就無需密碼,這一點要加以注意。
/etc/passwd每一個分段的含義:
1、賬戶名稱:
用來對應UID
2、密碼:
早起Unix系統的密碼就是防止這個字段上,但是英文這個檔案的特性是所有程序都能讀取,容易造成密碼數據被竊取
應此后來就將這個字段的密碼數據放到了/etc/shadow中了,所以這里使用【X】,
3、UID:
這就是使用者標示符,UId有以下限制:
ID 該ID使用的者特性
0 UID是0時,代表這個賬號是【系統管理員】!所以當你的其他啊賬號名稱也具有root
的權限是,就將該賬號的UID改為0即可,一個系統上面的系統管理不見得只有root,
不過不建議有多個UID為0的賬號。
1~499 保留給系統使用的ID,默認500以下的數字給系統作為保利賬號只是一個習慣。
由於系統上面啟動的服務希望使用較小的權限去運行,應此不希望使用root的身份去執行
這些服務,所以我們就得要提供這些運行中的程序的擁有者賬號才行,這些系統賬號通常是不可登陸的,
所以才會有/sbin/nologin這個特殊的shell的存在。
500~ 一般使用者
4、GID:
這個與/etc/group有關!其實/etc/group的觀念與/etc/passwd差不多,應用來規范組名
5、用戶信息說明欄:
6、家目錄:
root的家目錄在/root,所以當root登陸的之后,就會立刻跑到/root目錄里頭,如果壞、這個賬號需要使用
特別大的空間,就可以對這個字段進行修改,已移動到其他同硬盤。默認的用戶家目錄在/home/youIdname
/etc/shadow文件結構:
8、Shell:
定義用戶登陸系統使用什么shell,這里需要注意,有一個shell可以用來特帶成讓賬戶無法取得shell環境的登陸動作!
那就是/sbin/nologin這個特殊東西,也可以用來制作pop郵件賬號者的數據。(Post Office Protocol)
通過查看“/etc/passwd”文件,可以得到如下完整的系統賬號文件
2.用戶影子文件——shadow
/etc/shadow
由於shadow文件的權限,所以,只有root可以讀
vi /etc/shadow
一共有九列信息:
第一列表示用戶名;
第二列表示經過加密之后的密碼,如果密碼是!!或者*,表示沒有密碼,不能登錄;
第三列表示密碼的最后一次修改日期,使用1970.1.1作為標准時間,每過一天時間戳+1;
第四列表示兩次密碼的修改間隔;
第五列表示密碼的有效期;
第六列表示密碼到期之前的警告時間;
第七列表示密碼過期之后的寬限天數(0表示到期后立即失效,-1則永久不失效);
第八列表示賬號失效時間,要用時間戳表示,時間戳換算為日期:date -d "1970-01-01 18382 days",日期換算為時間戳:echo $(($(date --date="2020/05/13" +%s)/86400+1));
第九列保留
3.用戶組賬號文件——group和gshadow
group:
/ect/group 文件是用戶組配置文件,即用戶組的所有信息都存放在此文件中。
此文件是記錄組 ID(GID)和組名相對應的文件。前面講過,etc/passwd 文件中每行用戶信息的第四個字段記錄的是用戶的初始組 ID,那么,此 GID 的組名到底是什么呢?就要從 /etc/group 文件中查找。
/etc/group 文件的內容可以通過 Vim 看到:
可以看到,此文件中每一行各代表一個用戶組。在前面章節中,我們曾創建 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 文件中提取和這個用戶相匹配的密碼。
gshadow:
前面講過,/etc/passwd 文件存儲用戶基本信息,同時考慮到賬戶的安全性,將用戶的密碼信息存放另一個文件 /etc/shadow 中。本節要將的 /etc/gshadow 文件也是如此,組用戶信息存儲在 /etc/group 文件中,而將組用戶的密碼信息存儲在 /etc/gshadow 文件中。
首先,我們借助 Vim 命令查看一下此文件中的內容
文件中,每行代表一個組用戶的密碼信息,各行信息用 ":" 作為分隔符分為 4 個字段,每個字段的含義如下:
組名:加密密碼:組管理員:組附加用戶列表
組名
同 /etc/group 文件中的組名相對應。
組密碼
對於大多數用戶來說,通常不設置組密碼,因此該字段常為空,但有時為 "!",指的是該群組沒有組密碼,也不設有群組管理員。
組管理員
從系統管理員的角度來說,該文件最大的功能就是創建群組管理員。那么,什么是群組管理員呢?
考慮到 Linux 系統中賬號太多,而超級管理員 root 可能比較忙碌,因此當有用戶想要加入某群組時,root 或許不能及時作出回應。這種情況下,如果有群組管理員,那么他就能將用戶加入自己管理的群組中,也就免去麻煩 root 了。
不過,由於目前有 sudo 之類的工具,因此群組管理員的這個功能已經很少使用了。
組中的附加用戶
該字段顯示這個用戶組中有哪些附加用戶,和 /etc/group 文件中附加組顯示內容相同。
4.使用pwck和grpck命令驗證用戶和組文件
pwck:
pwck命令用來驗證系統認證文件/etc/passwd
和/etc/shadow
的內容和格式的完整性。
選項
-q:僅報告錯誤信息; -s:以用戶id排序文件“/etc/passwd”和“/etc/shadow”; -r:只讀方式運行指令。
實例pwck /etc/passwd
user 'lp': directory '/var/spool/lpd' does not exist user 'news': directory '/var/spool/news' does not exist user 'uucp': directory '/var/spool/uucp' does not exist user 'www-data': directory '/var/www' does not exist user 'list': directory '/var/list' does not exist user 'irc': directory '/var/run/ircd' does not exist user 'gnats': directory '/var/lib/gnats' does not exist user 'nobody': directory '/nonexistent' does not exist user 'syslog': directory '/home/syslog' does not exist user 'couchdb': directory '/var/lib/couchdb' does not exist user 'speech-dispatcher': directory '/var/run/speech-dispatcher' does not exist user 'usbmux': directory '/home/usbmux' does not exist user 'haldaemon': directory '/var/run/hald' does not exist user 'pulse': directory '/var/run/pulse' does not exist user 'saned': directory '/home/saned' does not exist user 'hplip': directory '/var/run/hplip' does not exist pwck:無改變
grpck:
grpck命令用於驗證組文件的完整性,在驗證之前,需要先鎖定(lock)組文件/etc/group
和/etc/shadow
。
grpck命令檢查數據是否正確存放,每條記錄是否都包含足夠的信息,是否有一個唯一的組名,是否包含正確的用戶,是否正確設置了組的管理員等。grpck檢查發現錯誤以后,在命令行提示用戶是否刪除錯誤的記錄。如果用戶沒有明確回答刪除記錄,grpck終止運行。
選項
-r:只讀模式; -s:排序組id。
實例
對組賬號和影子文件進行驗證:
grpck //必須以管理員身份運行 grpck /etc/group /etc/gshadow //后面兩句一樣,如果沒有輸出信息,則表示沒有錯誤。
測試錯誤的實例:
echo check_user:x: >> /etc/group //添加一行錯誤的格式數據 cat /etc/group | grep check_user check_user:x: //這兒GID字段為空,是錯誤的。 grpck /etc/group invalid group file entry delete line 'check_user:x:'? y //提示是否刪除 grpck: the files have been updated //這時已經刪除了錯誤的行,提示文件已經更新。 cat /etc/group | grep check_user //沒有查到,已經刪除了。
5.使用useradd命令添加用戶
useradd命令用於Linux中創建的新的系統用戶。useradd可用來建立用戶帳號。帳號建好之后,再用passwd設定帳號的密碼.而可用userdel刪除帳號。使用useradd指令所建立的帳號,實際上是保存在/etc/passwd
文本文件中。
在Slackware中,adduser指令是個script程序,利用交談的方式取得輸入的用戶帳號資料,然后再交由真正建立帳號的useradd命令建立新用戶,如此可方便管理員建立用戶帳號。在Red Hat Linux中,adduser命令則是useradd命令的符號連接,兩者實際上是同一個指令。
選項
-c<備注>:加上備注文字。備注文字會保存在passwd的備注欄位中; -d<登入目錄>:指定用戶登入時的啟始目錄; -D:變更預設值; -e<有效期限>:指定帳號的有效期限; -f<緩沖天數>:指定在密碼過期后多少天即關閉該帳號; -g<群組>:指定用戶所屬的群組; -G<群組>:指定用戶所屬的附加群組; -m:自動建立用戶的登入目錄; -M:不要自動建立用戶的登入目錄; -n:取消建立以用戶名稱為名的群組; -r:建立系統帳號; -s<shell>:指定用戶登入后所使用的shell; -u<uid>:指定用戶id。
實例
新建用戶加入組:
useradd –g sales jack –G company,employees //-g:加入主要組、-G:加入次要組
建立一個新用戶賬戶,並設置ID:
useradd caojh -u 544
需要說明的是,設定ID值時盡量要大於500,以免沖突。因為Linux安裝后會建立一些特殊用戶,一般0到499之間的值留給bin、mail這樣的系統賬號。
應用實例
建立一個新用戶賬戶testuser1,並設置UID為544,主目錄為/usr/testuser1,屬於users組:
- #useradd -u 544 -d /usr/testuser1 -g users -m testuser1 //加-m 如果主目錄不存在則自動創建
示例
使用管理員賬號登陸系統,建立用戶tmp_3452 密碼3sdt5:Eawhg
- 添加用戶命令:
- adduser tmp_3452
- 修改密碼命令:
- passwd tmp_3452
在系統出現提示輸入密碼是輸入密碼:3sdt5:Eawhg 系統提示輸入確認密碼后再輸入一次。OK添加成功。
6.使用usermod命令修改用戶信息
usermod命令用於修改用戶的基本信息。usermod命令不允許你改變正在線上的使用者帳號名稱。當usermod命令用來改變user id,必須確認這名user沒在電腦上執行任何程序。你需手動更改使用者的crontab檔。也需手動更改使用者的at工作檔。采用NIS server須在server上更動相關的NIS設定。
選項
-c<備注>:修改用戶帳號的備注文字; -d<登入目錄>:修改用戶登入時的目錄; -e<有效期限>:修改帳號的有效期限; -f<緩沖天數>:修改在密碼過期后多少天即關閉該帳號; -g<群組>:修改用戶所屬的群組; -G<群組>;修改用戶所屬的附加群組; -l<帳號名稱>:修改用戶帳號名稱; -L:鎖定用戶密碼,使密碼無效; -s<shell>:修改用戶登入后所使用的shell; -u<uid>:修改用戶ID; -U:解除密碼鎖定。
實例
將newuser2添加到組staff中:
usermod -G staff newuser2
修改newuser的用戶名為newuser1:
usermod -l newuser1 newuser
鎖定賬號newuser1:
usermod -L newuser1
解除對newuser1的鎖定:
usermod -U newuser1
7.使用userdel命令刪除用戶
userdel命令用於刪除給定的用戶,以及與用戶相關的文件。若不加選項,則僅刪除用戶帳號,而不刪除相關文件。
選項
-f:強制刪除用戶,即使用戶當前已登錄; -r:刪除用戶的同時,刪除與用戶相關的所有文件。
實例
userdel命令很簡單,比如我們現在有個用戶linuxde,其家目錄位於/var
目錄中,現在我們來刪除這個用戶:
userdel linuxde //刪除用戶linuxde,但不刪除其家目錄及文件; userdel -r linuxde //刪除用戶linuxde,其家目錄及文件一並刪除;
請不要輕易用-r
選項;他會刪除用戶的同時刪除用戶所有的文件和目錄,切記如果用戶目錄下有重要的文件,在刪除前請備份。
其實也有最簡單的辦法,但這種辦法有點不安全,也就是直接在/etc/passwd
中刪除您想要刪除用戶的記錄;但最好不要這樣做,/etc/passwd
是極為重要的文件,可能您一不小心會操作失誤。
除了使用 userdel 命令刪除用戶,還可以手動方式刪除,畢竟通過前面的學習,我們已經知道與用戶相關信息的存儲位置。雖然這樣做沒有實際意義,但對於初學者來說,可以加深對 userdel 命令的理解。
手動刪除指定用戶的具體操作如下:
#建立新 lamp 用戶
[root@localhost ~]# useradd lamp
[root@localhost ~]# passwd lamp
#為 lamp 用戶設置密碼,由此 lamp 用戶才算是創建成功
#下面開始手動刪除 lamp
[root@localhost ~]# vi /etc/passwd
lamp:x:501:501::/home/lamp:/bin/bash <--刪除此行
#修改用戶信息文件,刪除lamp用戶行
[root@localhost ~]#vi /etc/shadow
lamp:$6$KoOYtcOJ $56Xk9vp3D2vMRBxibNOn.21cVJ9onbW8IHx4WrOx6qBqfGa9U3mjMsGjqYnj L/4t3zt3YxElce2X8rbb12x4a0:15716:0:99999:7::: <--刪除此行
#修改影子文件,刪除lamp用戶密碼行,注意,這個文件的權限是000,所以要強制保存
[root@localhost ~]#vi /etc/group
lamp:x:501: <--刪除此行
#修改組信息文件,刪除lamp群組信息
[root@localhost ~]#vi /etc/gshadow
lamp:!:: <--刪除此行
#修改組影子文件,刪除lamp群組密碼信息。同樣注意需要強制保存
[root@localhost ~]# rm -rf /var/spod/mail/lamp #刪除用戶郵箱
[root@localhost ~]# rm -rf/home/lamp/ #刪除用戶的家目錄
#至此,用戶徹底刪除,再新建用戶lamp。如果可以正常建立,則說明我們手工刪除干凈了
[root@localhost ~]# useradd lamp
[root@localhost ~]# passwd lamp
#重新建立同名用戶,沒有報錯,說明前面的手工刪除是可以完全刪除用戶的
手動刪除用戶,僅是為了讓讀者對 userdel 命令理解地更透徹,實際使用中,使用 userdel 刪除用戶更方便。
最后需要大家注意的是,如果要刪除的用戶已經使用過系統一段時間,那么此用戶可能在系統中留有其他文件,因此,如果我們想要從系統中徹底的刪除某個用戶,最好在使用 userdel 命令之前,先通過find -user 用戶名
命令查出系統中屬於該用戶的文件,然后在加以刪除。
8.使用groupadd命令創建用戶組
groupadd命令用於創建一個新的工作組,新工作組的信息將被添加到系統文件中。
選項
-f,--force 如果指定的組已經存在,此選項將失明了僅以成功狀態退出。當與-g一起使用,並且指定的GID_MIN已經存在時,選擇另一個唯一的GID(即-g關閉)。
-g,--gid GID 這個值必須是唯一的,除非使用-o選項。但必須是非負的。默認值是使用大於或等於GID_MIN的最小值,並且大於每個其他組。
-K,--key KEY=VALUE 重寫/etc/login.defs默認值(GID_MIN,GID_MAX和其他)。可以指定多個K選項。示例:-K GID_MIN=100 –KGID_MAX=499。注意:-K GID_MIN=10,GID_MAX=499不能工作。
-o,--non-unique 此選項允許添加一個非唯一的GID值。
-p,--password PASSWORD 為新組使用此加密過的密碼。默認為禁用密碼。注意:不推薦使用這個選項,因為密碼(或加密過的密碼)會被用戶通過列出這個過程而看到。您應該確保密碼符合系統的密碼政策。
-r,--system 創建一個系統組。新的系統組數字標識符在SYS_GID_MIN到SYS_GID_MAX范圍內選擇,定義在login.defs中而不是GID_MIN到GID_MAX。
-R,--root CHROOT_DIR 將修改應用到CHROOT_DIR目錄,並使用配置。
實例
建立一個新組,並設置組ID加入系統:
groupadd -g 344 linuxde
此時在/etc/passwd
文件中產生一個組ID(GID)是344的項目。
8.使用groupmod命令修改用戶屬性
groupmod命令更改群組識別碼或名稱。需要更改群組的識別碼或名稱時,可用groupmod指令來完成這項工作。
選項
-g<群組識別碼>:設置欲使用的群組識別碼; -o:重復使用群組識別碼; -n<新群組名稱>:設置欲使用的群組名稱。
實例
修改組名
[root@runoob.com ~]# groupadd linuxso [root@runoob.com ~]# tail -1 /etc/group linuxso:x:500: [root@runoob.com ~]# tail -1 /etc/group linuxso:x:500: [root@runoob.com ~]# groupmod -n linux linuxso [root@runoob.com ~]# tail -1 /etc/group linux:x:500:
9.使用groupdel命令刪除用戶組
groupdel命令用於刪除指定的工作組,本命令要修改的系統文件包括/ect/group和/ect/gshadow。若該群組中仍包括某些用戶,則必須先刪除這些用戶后,方能刪除群組。
實例
groupadd damon //創建damon工作組 groupdel damon //刪除這個工作組
[root@linuxprobe home]# tail -n 3 /etc/group
apache:x:48:
grouptest01:x:1001:
grouptest02:x:7777:
[root@linuxprobe home]# groupdel grouptest02 ## 刪除用戶組grouptest02
[root@linuxprobe home]# tail -n 3 /etc/group
linuxprobe:x:1000:
apache:x:48:
grouptest01:x:1001:
[root@linuxprobe home]# groupdel grouptest01 ##刪除用戶組grouptest01
[root@linuxprobe home]# tail -n 3 /etc/group
tcpdump:x:72:
linuxprobe:x:1000:
apache:x:48:
以上是用戶與用戶組管理的大致用法!