linux使用者及組相關檔案介紹

軟泥發表於2020-11-03

使用者和組檔案介紹

 

 

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組:

  1. #useradd -u 544 -d /usr/testuser1  -g users -m  testuser1     //加-m 如果主目錄不存在則自動建立

blob.png

示例

使用管理員賬號登陸系統,建立使用者tmp_3452 密碼3sdt5:Eawhg

  1. 新增使用者命令:
  2. adduser tmp_3452
  3. 修改密碼命令:
  4. passwd tmp_3452

 在系統出現提示輸入密碼是輸入密碼:3sdt5:Eawhg 系統提示輸入確認密碼後再輸入一次。OK新增成功。

blob.png

 

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:

以上是使用者與使用者組管理的大致用法!

相關文章