在 Linux 系統中管理用戶組並不費力,但相關命令可能比你所知的更爲靈活。html
在 Linux 系統中用戶組起着重要做用。用戶組提供了一種簡單方法供一組用戶互相共享文件。用戶組也容許系統管理員更加有效地管理用戶權限,由於管理員能夠將權限分配給用戶組而不是逐一分配給單個用戶。linux
儘管一般只要在系統中添加用戶帳戶就會建立用戶組,關於用戶組如何工做以及如何運用用戶組還有不少須要瞭解的。git
Linux 系統中多數用戶帳戶被設爲用戶名與用戶組名相同。用戶 jdoe
會被賦予一個名爲 jdoe
的用戶組,且成爲該新建用戶組的惟一成員。如本例所示,該用戶的登陸名,用戶 id 和用戶組 id 在新建帳戶時會被添加到 /etc/passwd
和 /etc/group
文件中:github
$ 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
。ruby
分配給每一個用戶的 UID(用戶 id)和 GID(用戶組 id)一般是同樣的,而且順序遞增。若上例中 Jane Doe 是最近添加的用戶,分配給下一個新用戶的用戶 id 和用戶組 id 極可能都是 1067。bash
UID 和 GID 可能不一致。例如,若是你用 groupadd
命令添加一個用戶組而不指定用戶組 id,系統會分配下一個可用的用戶組 id(在本例中爲 1067)。下一個添加到系統中的用戶其 UID 會是 1067 而 GID 則爲 1068。ui
你能夠避免這個問題,方法是添加用戶組的時候指定一個較小的用戶組 id 而不是接受默認值。在下面的命令中咱們添加一個用戶組並提供一個 GID,這個 GID 小於用於用戶帳戶的 GID 取值範圍。spa
$ sudo groupadd -g 500 devops
複製代碼
建立帳戶時你能夠指定一個共享用戶組,若是這樣對你更合適的話。例如你可能想把新來的開發人員加入同一個 DevOps 用戶組而不是一人一個用戶組。.net
$ sudo useradd -g staff bennyg
$ grep bennyg /etc/passwd
bennyg:x:1064:50::/home/bennyg:/bin/sh
複製代碼
用戶組實際上有兩種:主要用戶組和次要用戶組。code
主要用戶組是保存在 /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
命令並不必定爲新用戶添加一個家目錄家目錄。若你只有某些時候想爲用戶添加家目錄,你能夠在 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
文件中的所有設置。下面的 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: www.networkworld.com/article/340…
做者:Sandra Henry-Stocker 選題:lujun9972 譯者:0x996 校對:wxy