Linux中國

掌握 Linux 用戶組

在 Linux 系統中用戶組起著重要作用。用戶組提供了一種簡單方法供一組用戶互相共享文件。用戶組也允許系統管理員更加有效地管理用戶許可權,因為管理員可以將許可權分配給用戶組而不是逐一分配給單個用戶。

儘管通常只要在系統中添加用戶賬戶就會創建用戶組,關於用戶組如何工作以及如何運用用戶組還有很多需要了解的。

一個用戶一個用戶組?

Linux 系統中多數用戶賬戶被設為用戶名與用戶組名相同。用戶 jdoe 會被賦予一個名為 jdoe 的用戶組,且成為該新建用戶組的唯一成員。如本例所示,該用戶的登錄名,用戶 id 和用戶組 id 在新建賬戶時會被添加到 /etc/passwd/etc/group 文件中:

$ sudo useradd jdoe
$ grep jdoe /etc/passwd
jdoe:x:1066:1066:Jane Doe:/home/jdoe:/bin/sh
$ grep jdoe /etc/group
jdoe:x:1066:

這些文件中的配置使系統得以在文本(jdoe)和數字(1066)這兩種用戶 id 形式之間互相轉換—— jdoe 就是 1006,且 1006 就是 jdoe

分配給每個用戶的 UID(用戶 id)和 GID(用戶組 id)通常是一樣的,並且順序遞增。若上例中 Jane Doe 是最近添加的用戶,分配給下一個新用戶的用戶 id 和用戶組 id 很可能都是 1067。

GID = UID?

UID 和 GID 可能不一致。例如,如果你用 groupadd 命令添加一個用戶組而不指定用戶組 id,系統會分配下一個可用的用戶組 id(在本例中為 1067)。下一個添加到系統中的用戶其 UID 會是 1067 而 GID 則為 1068。

你可以避免這個問題,方法是添加用戶組的時候指定一個較小的用戶組 id 而不是接受默認值。在下面的命令中我們添加一個用戶組並提供一個 GID,這個 GID 小於用於用戶賬戶的 GID 取值範圍。

$ sudo groupadd -g 500 devops

創建賬戶時你可以指定一個共享用戶組,如果這樣對你更合適的話。例如你可能想把新來的開發人員加入同一個 DevOps 用戶組而不是一人一個用戶組。

$ sudo useradd -g staff bennyg
$ grep bennyg /etc/passwd
bennyg:x:1064:50::/home/bennyg:/bin/sh

主要用戶組和次要用戶組

用戶組實際上有兩種: 主要用戶組 primary group 次要用戶組 secondary group

主要用戶組是保存在 /etc/passwd 文件中的用戶組,該用戶組在賬戶創建時配置。當用戶創建一個文件時,用戶的主要用戶組與此文件關聯。

$ whoami
jdoe
$ grep jdoe /etc/passwd
jdoe:x:1066:1066:John Doe:/home/jdoe:/bin/bash
             ^
             |
             +-------- 主要用戶組
$ touch newfile
$ ls -l newfile
-rw-rw-r-- 1 jdoe jdoe 0 Jul 16 15:22 newfile
                   ^
                   |
                   +-------- 主要用戶組

用戶一旦擁有賬戶之後被加入的那些用戶組是次要用戶組。次要用戶組成員關係在 /etc/group 文件中顯示。

$ grep devops /etc/group
devops:x:500:shs,jadep
          ^
          |
          +-------- shs 和 jadep 的次要用戶組

/etc/group 文件給用戶組分配組名稱(例如 500 = devops)並記錄次要用戶組成員。

首選的準則

每個用戶是他自己的主要用戶組成員,並可以成為任意多個次要用戶組成員,這樣的一種準則允許用戶更加容易地將個人文件和需要與同事分享的文件分開。當用戶創建一個文件時,用戶所屬的不同用戶組的成員不一定有訪問許可權。用戶必須用 chgrp 命令將文件和次要用戶組關聯起來。

哪裡也不如自己的家目錄

添加新賬戶時一個重要的細節是 useradd 命令並不一定為新用戶添加一個 家目錄 /home 家目錄。若你只有某些時候想為用戶添加家目錄,你可以在 useradd 命令中加入 -m 選項(可以把它想像成「安家」選項)。

$ sudo useradd -m -g devops -c "John Doe" jdoe2

此命令中的選項如下:

  • -m 創建家目錄並在其中生成初始文件
  • -g 指定用戶歸屬的用戶組
  • -c 添加賬戶描述信息(通常是用戶的姓名)

若你希望總是創建家目錄,你可以編輯 /etc/login.defs 文件來更改默認工作方式。更改或添加 CREATE_HOME 變數並將其設置為 yes

$ grep CREATE_HOME /etc/login.defs
CREATE_HOME     yes

另一種方法是用自己的賬戶設置別名從而讓 useradd 一直帶有 -m 選項。

$ alias useradd=』useradd -m』

確保將該別名添加到你的 ~/.bashrc 文件或類似的啟動文件中以使其永久生效。

深入了解 /etc/login.defs

下面這個命令可列出 /etc/login.defs 文件中的全部設置。下面的 grep 命令會隱藏所有注釋和空行。

$ cat /etc/login.defs | grep -v "^#" | grep -v "^$"
MAIL_DIR        /var/mail
FAILLOG_ENAB            yes
LOG_UNKFAIL_ENAB        no
LOG_OK_LOGINS           no
SYSLOG_SU_ENAB          yes
SYSLOG_SG_ENAB          yes
FTMP_FILE       /var/log/btmp
SU_NAME         su
HUSHLOGIN_FILE  .hushlogin
ENV_SUPATH      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV_PATH        PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
TTYGROUP        tty
TTYPERM         0600
ERASECHAR       0177
KILLCHAR        025
UMASK           022
PASS_MAX_DAYS   99999
PASS_MIN_DAYS   0
PASS_WARN_AGE   7
UID_MIN                  1000
UID_MAX                 60000
GID_MIN                  1000
GID_MAX                 60000
LOGIN_RETRIES           5
LOGIN_TIMEOUT           60
CHFN_RESTRICT           rwh
DEFAULT_HOME    yes
CREATE_HOME         yes                 <===
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512

注意此文件中的各種設置會決定用戶 id 的取值範圍以及密碼使用期限和其他設置(如 umask)。

如何顯示用戶所屬的用戶組

出於各種原因用戶可能是多個用戶組的成員。用戶組成員身份給與用戶對用戶組擁有的文件和目錄的訪問許可權,有時候這種工作方式是至關重要的。要生成某個用戶所屬用戶組的清單,用 groups 命令即可。

$ groups jdoe
jdoe : jdoe adm admin cdrom sudo dip plugdev lpadmin staff sambashare

你可以鍵入不帶任何參數的 groups 命令來列出你自己的用戶組。

如何添加用戶至用戶組

如果你想添加一個已有用戶至別的用戶組,你可以仿照下面的命令操作:

$ sudo usermod -a -G devops jdoe

你也可以指定逗號分隔的用戶組列表來添加一個用戶至多個用戶組:

$ sudo usermod -a -G devops,mgrs jdoe

參數 -a 意思是「添加」,-G 指定用戶組列表。

你可以編輯 /etc/group 文件將用戶名從用戶組成員名單中刪除,從而將用戶從用戶組中移除。usermod 命令或許也有個選項用於從用戶組中刪除某個成員。

fish:x:16:nemo,dory,shark
           |
           V
fish:x:16:nemo,dory

提要

添加和管理用戶組並非特別困難,但長遠來看配置賬戶時的一致性可使這項工作更容易些。

via: https://www.networkworld.com/article/3409781/mastering-user-groups-on-linux.html

作者:Sandra Henry-Stocker 選題:lujun9972 譯者:0x996 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國