【BASH】回顧與知識點梳理 二十三
- 二十三. Linux 賬號管理(二)
- 23.1 賬號管理
- 新增與移除使用者: useradd, 相關配置文件, passwd, usermod, userdel
- usermod
- userdel
- 23.2 用戶功能(普通用戶可使用)
- id
- finger
- chfn
- chsh
- 23.3 新增與移除群組
- groupadd
- groupmod
- groupdel
- gpasswd:群組管理員功能
- 23.4 賬號管理實例
- 23.5 使用外部身份認證系統
該系列目錄 --> 【BASH】回顧與知識點梳理(目錄)
二十三. Linux 賬號管理(二)
23.1 賬號管理
接上章,我們繼續學習賬號管理相關內容
新增與移除使用者: useradd, 相關配置文件, passwd, usermod, userdel
usermod
所謂這『人有失手,馬有亂蹄』,您說是吧?所以啰,當然有的時候會『不小心手滑了一下』在 useradd 的時候加入了錯誤的設定數據。或者是,在使用 useradd 后,發現某些地方還可以進行細部修改。 此時,當然我們可以直接到 /etc/passwd 或 /etc/shadow 去修改相對應字段的數據, 不過,Linux 也有提供相關的指令讓大家來進行賬號相關數據的微調呢~那就是 usermod 啰
[root@study ~]# usermod [-cdegGlsuLU] username
選項與參數:
-c :后面接賬號的說明,即 /etc/passwd 第五欄的說明欄,可以加入一些賬號的說明。
-d :后面接賬號的家目錄,即修改 /etc/passwd 的第六欄;
-e :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 內的第八個字段數據啦!
-f :后面接天數,為 shadow 的第七字段。
-g :后面接初始群組,修改 /etc/passwd 的第四個字段,亦即是 GID 的字段!
-G :后面接次要群組,修改這個使用者能夠支持的群組,修改的是 /etc/group 啰~
-a :與 -G 合用,可『增加次要群組的支持』而非『設定』喔!
-l :后面接賬號名稱。亦即是修改賬號名稱, /etc/passwd 的第一欄!
-s :后面接 Shell 的實際文件,例如 /bin/bash 或 /bin/csh 等等。
-u :后面接 UID 數字啦!即 /etc/passwd 第三欄的資料;
-L :暫時將用戶的密碼凍結,讓他無法登入。其實僅改 /etc/shadow 的密碼欄。
-U :將 /etc/shadow 密碼欄的 ! 拿掉,解凍啦!
如果你仔細的比對,會發現 usermod 的選項與 useradd 非常類似! 這是因為 usermod 也是用來微調useradd 增加的使用者參數嘛!不過 usermod 還是有新增的選項, 那就是-L
與-U
,不過這兩個選項其實與 passwd 的 -l
, -u
是相同的!而且也不見得會存在所有的 distribution 當中!接下來,讓我們談談一些變更參數的實例吧!
# 范例一:修改使用者 vbird2 的說明欄,加上『VBird's test』的說明。
[root@study ~]# usermod -c "VBird's test" vbird2
[root@study ~]# grep vbird2 /etc/passwd
vbird2:x:1500:100:VBird's test:/home/vbird2:/bin/bash# 范例二:使用者 vbird2 這個賬號在 2015/12/31 失效。
[root@study ~]# usermod -e "2015-12-31" vbird2
[root@study ~]# chage -l vbird2 | grep 'Account expires'
Account expires : Dec 31, 2015# 范例三:我們建立 vbird3 這個系統賬號時并沒有給予家目錄,請建立他的家目錄
[root@study ~]# ll -d ~vbird3
ls: cannot access /home/vbird3: No such file or directory <==確認一下,確實沒有家目錄的存在!
[root@study ~]# cp -a /etc/skel /home/vbird3
[root@study ~]# chown -R vbird3:vbird3 /home/vbird3
[root@study ~]# chmod 700 /home/vbird3
[root@study ~]# ll -a ~vbird3
drwx------. 3 vbird3 vbird3 74 May 4 17:51 . <==用戶家目錄權限
drwxr-xr-x. 10 root root 4096 Jul 20 22:51 ..
-rw-r--r--. 1 vbird3 vbird3 18 Mar 6 06:06 .bash_logout
-rw-r--r--. 1 vbird3 vbird3 193 Mar 6 06:06 .bash_profile
-rw-r--r--. 1 vbird3 vbird3 231 Mar 6 06:06 .bashrc
drwxr-xr-x. 4 vbird3 vbird3 37 May 4 17:51 .mozilla
# 使用 chown -R 是為了連同家目錄底下的用戶/群組屬性都一起變更的意思;
# 使用 chmod 沒有 -R ,是因為我們僅要修改目錄的權限而非內部文件的權限!
userdel
這個功能就太簡單了,目的在刪除用戶的相關數據,而用戶的數據有:
- 用戶賬號/密碼相關參數:/etc/passwd, /etc/shadow
- 使用者群組相關參數:/etc/group, /etc/gshadow
- 用戶個人文件數據: /home/username, /var/spool/mail/username…
整個指令的語法非常簡單:
[root@study ~]# userdel [-r] username
選項與參數:
-r :連同用戶的家目錄也一起刪除# 范例一:刪除 vbird2 ,連同家目錄一起刪除
[root@study ~]# userdel -r vbird2
這個指令下達的時候要小心了!通常我們要移除一個賬號的時候,你可以手動的將/etc/passwd
與/etc/shadow
里頭的該賬號取消即可!一般而言,如果該賬號只是『暫時不啟用
』的話,那么將/etc/shadow
里頭賬號失效日期 (第八字段) 設定為 0 就可以讓該賬號無法使用,但是所有跟該賬號相關的數據都會留下來! 使用 userdel 的時機通常是『你真的確定不要讓該用戶在主機上面使用任何數據了!』
另外,其實用戶如果在系統上面操作過一陣子了,那么該用戶其實在系統內可能會含有其他文件的。舉例來說,他的郵件信箱 (mailbox) 或者是例行性工作排程 (crontab, 十五章) 之類的文件。 所以,如果想要完整的將某個賬號完整的移除,最好可以在下達 userdel -r username
之前, 先以『find / -user username
』查出整個系統內屬于 username 的文件,然后再加以刪除吧!
23.2 用戶功能(普通用戶可使用)
不論是useradd/usermod/userdel
,那都是系統管理員所能夠使用的指令
,如果我是一般身份使用者,那么我是否除了密碼之外,就無法更改其他的數據呢? 當然不是啦!這里我們介紹幾個一般身份用戶常用的賬號數據變更與查詢指令啰!
id
id 這個指令則可以查詢某人或自己的相關 UID/GID 等等的信息,他的參數也不少,不過,都不需要記~反正使用 id 就全部都列出啰! 另外,也回想一下,我們在前一章談到的循環時,就有用過這個指令喔! ^_^
[root@study ~]# id [username]
# 范例一:查閱 root 自己的相關 ID 信息!
[root@study ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:
s0-s0:c0.c1023
# 上面信息其實是同一行的數據!包括會顯示 UID/GID 以及支持的所有群組!
# 至于后面那個 context=... 則是 SELinux 的內容,先不要理會他!# 范例二:查閱一下 vbird1 吧~
[root@study ~]# id vbird1
uid=1003(vbird1) gid=1004(vbird1) groups=1004(vbird1)
[root@study ~]# id vbird100
id: vbird100: No such user <== id 這個指令也可以用來判斷系統上面有無某賬號!
finger
finger 的中文字面意義是:『手指』或者是『指紋』的意思。這個 finger 可以查閱很多用戶相關的信息喔! 大部分都是在 /etc/passwd 這個文件里面的信息啦!不過,這個指令有點危險,所以新的版本中已經默認不安裝這個軟件!好啦!現在繼續來安裝軟件先~記得第九章 dos2unix 的安裝方式!假設你已經將光驅或光盤映像文件掛載在 /mnt 底下了,所以:
[root@study ~]# df -hT /mnt
Filesystem Type Size Used Avail Use% Mounted on
/dev/sr0 iso9660 7.1G 7.1G 0 100% /mnt # 先確定是有掛載光盤的啦!
[root@study ~]# rpm -ivh /mnt/Packages/finger-[0-9]*
我們就先來檢查檢查用戶信息吧!
[root@study ~]# finger [-s] username
選項與參數:
-s :僅列出用戶的賬號、全名、終端機代號與登入時間等等;
-m :列出與后面接的賬號相同者,而不是利用部分比對 (包括全名部分)
# 范例一:觀察 vbird1 的用戶相關賬號屬性
[root@study ~]# finger vbird1
Login: vbird1 Name:
Directory: /home/vbird1 Shell: /bin/bash
Never logged in.
No mail.
No Plan.
由于 finger 類似指紋的功能,他會將用戶的相關屬性列出來!如上表所示,其實他列出來的幾乎都是 /etc/passwd 文件里面的東西。列出的信息說明如下:
- Login:為使用者賬號,亦即 /etc/passwd 內的第一字段;
- Name:為全名,亦即 /etc/passwd 內的第五字段(或稱為批注);
- Directory:就是家目錄了;
- Shell:就是使用的 Shell 文件所在;
- Never logged in.:figner 還會調查用戶登入主機的情況喔!
- No mail.:調查 /var/spool/mail 當中的信箱資料;
- No Plan.:調查 ~vbird1/.plan 文件,并將該文件取出來說明!
不過是否能夠查閱到 Mail 與 Plan 則與權限有關了!因為 Mail / Plan 都是與使用者自己的權限設定有關, root 當然可以查閱到用戶的這些信息,但是 vbird1 就不見得能夠查到 vbird3 的信息, 因為 /var/spool/mail/vbird3 與 /home/vbird3/ 的權限分別是 660, 700 ,那 vbird1 當然就無法查閱的到!這樣解釋可以理解吧?此外,我們可以建立自己想要執行的預定計劃,當然,最多是給自己看的!可以這樣做:
# 范例二:利用 vbird1 建立自己的計劃檔
[vbird1@study ~]$ echo "I will study Linux during this year." > ~/.plan
[vbird1@study ~]$ finger vbird1
Login: vbird1 Name:
Directory: /home/vbird1 Shell: /bin/bash
Last login Mon Jul 20 23:06 (CST) on pts/0
No mail.
Plan:
I will study Linux during this year.# 范例三:找出目前在系統上面登入的用戶與登入時間
[vbird1@study ~]$ finger
Login Name Tty Idle Login Time Office Office Phone Host
dmtsai dmtsai tty2 11d Jul 7 23:07
dmtsai dmtsai pts/0 Jul 20 17:59
在范例三當中,我們發現輸出的信息還會有 Office, Office Phone 等信息,那這些信息要如何記錄呢?底下我們會介紹 chfn 這個指令!來看看如何修改用戶的 finger 數據吧!
chfn
chfn 有點像是: change finger 的意思!這玩意的使用方法如下:
[root@study ~]# chfn [-foph] [賬號名]
選項與參數:
-f :后面接完整的大名;
-o :您辦公室的房間號碼;
-p :辦公室的電話號碼;
-h :家里的電話號碼!
# 范例一:vbird1 自己更改一下自己的相關信息!
[vbird1@study ~]$ chfn
Changing finger information for vbird1.
Name []: VBird Tsai test <==輸入你想要呈現的全名
Office []: DIC in KSU <==辦公室號碼
Office Phone []: 06-2727175#356 <==辦公室電話
Home Phone []: 06-1234567 <==家里電話號碼
Password: <==確認身份,所以輸入自己的密碼
Finger information changed.
[vbird1@study ~]$ grep vbird1 /etc/passwd
vbird1:x:1003:1004:VBird Tsai test,DIC in KSU,06-2727175#356,06-1234567:/home/vbird1:/bin/bash
# 其實就是改到第五個字段,該字段里面用多個『 , 』分隔就是了!
[vbird1@study ~]$ finger vbird1
Login: vbird1 Name: VBird Tsai test
Directory: /home/vbird1 Shell: /bin/bash
Office: DIC in KSU, 06-2727175#356 Home Phone: 06-1234567
Last login Mon Jul 20 23:12 (CST) on pts/0
No mail.
Plan:
I will study Linux during this year.
# 就是上面特殊字體呈現的那些地方是由 chfn 所修改出來的!
這個指令說實在的,除非是你的主機有很多的用戶,否則倒真是用不著這個程序!這就有點像是 bbs 里頭更改你『個人屬性』的那一個資料啦!不過還是可以自己玩一玩!尤其是用來提醒自己相關資料啦! ^_^
chsh
這就是 change shell 的簡寫!使用方法就更簡單了!
[vbird1@study ~]$ chsh [-ls]
選項與參數:
-l :列出目前系統上面可用的 shell ,其實就是 /etc/shells 的內容!
-s :設定修改自己的 Shell 啰
# 范例一:用 vbird1 的身份列出系統上所有合法的 shell,并且指定 csh 為自己的 shell
[vbird1@study ~]$ chsh -l
/bin/sh
/bin/bash
/sbin/nologin <==所謂:合法不可登入的 Shell 就是這玩意!
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh <==這就是 C shell 啦!
# 其實上面的信息就是我們在 bash 中談到的 /etc/shells 啦!
[vbird1@study ~]$ chsh -s /bin/csh; grep vbird1 /etc/passwd
Changing shell for vbird1.
Password: <==確認身份,請輸入 vbird1 的密碼
Shell changed.
vbird1:x:1003:1004:VBird Tsai test,DIC in KSU,06-2727175#356,06-1234567:/home/vbird1:/bin/csh
[vbird1@study ~]$ chsh -s /bin/bash
# 測試完畢后,立刻改回來!
[vbird1@study ~]$ ll $(which chsh)
-rws--x--x. 1 root root 23856 Mar 6 13:59 /bin/chsh
不論是 chfn 與 chsh ,都是能夠讓一般用戶修改 /etc/passwd 這個系統文件的!所以你猜猜,這兩個文件的權限是什么? 一定是 SUID 的功能啦!看到這里,想到前面! 這就是 Linux 的學習方法~^_^
23.3 新增與移除群組
OK!了解了賬號的新增、刪除、更動與查詢后,再來我們可以聊一聊群組的相關內容了。 基本上,群組的內容都與這兩個文件有關:/etc/group, /etc/gshadow。 群組的內容其實很簡單,都是上面兩個文件的新增、修改與移除而已, 不過,如果再加上有效群組的概念,那么newgrp 與 gpasswd 則不可不知呢!
groupadd
[root@study ~]# groupadd [-g gid] [-r] 組名
選項與參數:
-g :后面接某個特定的 GID ,用來直接給予某個 GID ~
-r :建立系統群組啦!與 /etc/login.defs 內的 GID_MIN 有關。
# 范例一:新建一個群組,名稱為 group1
[root@study ~]# groupadd group1
[root@study ~]# grep group1 /etc/group /etc/gshadow
/etc/group:group1:x:1503:
/etc/gshadow:group1:!::
# 群組的 GID 也是會由 1000 以上最大 GID+1 來決定!
groupmod
跟 usermod 類似的,這個指令僅是在進行 group 相關參數的修改而已。
[root@study ~]# groupmod [-g gid] [-n group_name] 群組名
選項與參數:
-g :修改既有的 GID 數字;
-n :修改既有的組名
# 范例一:將剛剛上個指令建立的 group1 名稱改為 mygroup , GID 為 201
[root@study ~]# groupmod -g 201 -n mygroup group1
[root@study ~]# grep mygroup /etc/group /etc/gshadow
/etc/group:mygroup:x:201:
/etc/gshadow:mygroup:!::
不過,還是那句老話,不要隨意的更動 GID ,容易造成系統資源的錯亂喔!
groupdel
呼呼! groupdel 自然就是在刪除群組的啰~用法很簡單:
[root@study ~]# groupdel [groupname]
# 范例一:將剛剛的 mygroup 刪除!
[root@study ~]# groupdel mygroup# 范例二:若要刪除 vbird1 這個群組的話?
[root@study ~]# groupdel vbird1
groupdel: cannot remove the primary group of user 'vbird1'
為什么 mygroup 可以刪除,但是 vbird1 就不能刪除呢?原因很簡單,『有某個賬號 (/etc/passwd) 的initial group 使用該群組!
』 如果查閱一下,你會發現在 /etc/passwd 內的 vbird1 第四欄的 GID 就是 /etc/group 內的 vbird1 那個群組的 GID ,所以啰,當然無法刪除~否則 vbird1 這個用戶登入系統后, 就會找不到 GID ,那可是會造成很大的困擾的!那么如果硬要刪除 vbird1 這個群組呢? 你『必須要確認 /etc/passwd 內的賬號沒有任何人使用該群組作為 initial group
』才行喔!所以,你可以:
- 修改 vbird1 的 GID ,
- 或者是刪除 vbird1 這個使用者。
gpasswd:群組管理員功能
如果系統管理員太忙碌了,導致某些賬號想要加入某個項目時找不到人幫忙!這個時候可以建立『群組管理員
』喔! 什么是群組管理員呢?就是讓某個群組具有一個管理員,這個群組管理員可以管理哪些賬號可以加入/移出該群組! 那要如何『建立一個群組管理員
』呢?就得要透過 gpasswd 啰!
# 關于系統管理員(root)做的動作:
[root@study ~]# gpasswd groupname
[root@study ~]# gpasswd [-A user1,...] [-M user3,...] groupname
[root@study ~]# gpasswd [-rR] groupname
選項與參數::若沒有任何參數時,表示給予 groupname 一個密碼(/etc/gshadow)
-A :將 groupname 的主控權交由后面的使用者管理(該群組的管理員)
-M :將某些賬號加入這個群組當中!
-r :將 groupname 的密碼移除
-R :讓 groupname 的密碼欄失效# 關于群組管理員(Group administrator)做的動作:
[someone@study ~]$ gpasswd [-ad] user groupname
選項與參數:
-a :將某位使用者加入到 groupname 這個群組當中!
-d :將某位使用者移除出 groupname 這個群組當中。
# 范例一:建立一個新群組,名稱為 testgroup 且群組交由 vbird1 管理:
[root@study ~]# groupadd testgroup <==先建立群組
[root@study ~]# gpasswd testgroup <==給這個群組一個密碼吧!
Changing the password for group testgroup
New Password:
Re-enter new password:
# 輸入兩次密碼就對了!
[root@study ~]# gpasswd -A vbird1 testgroup <==加入群組管理員為 vbird1
[root@study ~]# grep testgroup /etc/group /etc/gshadow
/etc/group:testgroup:x:1503:
/etc/gshadow:testgroup:$6$MnmChP3D$mrUn.Vo.buDjObMm8F2emTkvGSeuWikhRzaKHxpJ...:vbird1:
# 很有趣吧!此時 vbird1 則擁有 testgroup 的主控權喔!身份有點像板主啦!# 范例二:以 vbird1 登入系統,并且讓他加入 vbird1, vbird3 成為 testgroup 成員
[vbird1@study ~]$ id
uid=1003(vbird1) gid=1004(vbird1) groups=1004(vbird1) ...
# 看得出來,vbird1 尚未加入 testgroup 群組喔!
[vbird1@study ~]$ gpasswd -a vbird1 testgroup
[vbird1@study ~]$ gpasswd -a vbird3 testgroup
[vbird1@study ~]$ grep testgroup /etc/group
testgroup:x:1503:vbird1,vbird3
23.4 賬號管理實例
賬號管理不是隨意建置幾個賬號就算了!有時候我們需要考慮到一部主機上面可能有多個賬號在協同工作! 舉例來說,在大學任教時,我們學校的
專題生是需要分組的
,這些同一組的同學間必須要能夠互相修改對方的數據文件
, 但是同時這些同學又需要保留自己的私密數據
,因此直接公開家目錄是不適宜的
。那該如何是好? 為此,我們底下提供幾個例子來讓大家思考看看啰:
任務一:單純的完成上頭交代的任務,假設我們需要的賬號數據如下,你該如何實作?
賬號名稱 | 賬號全名 | 支援次要群組 | 是否可登入主機 | 密碼 |
---|---|---|---|---|
myuser1 | 1st user | mygroup1 | 可以 | password |
myuser2 | 2nd user | mygroup1 | 可以 | password |
myuser3 | 3rd user | 無額外支持 | 不可以 | password |
# 先處理賬號相關屬性的數據:
[root@study ~]# groupadd mygroup1
[root@study ~]# useradd -G mygroup1 -c "1st user" myuser1
[root@study ~]# useradd -G mygroup1 -c "2nd user" myuser2
[root@study ~]# useradd -c "3rd user" -s /sbin/nologin myuser3
# 再處理賬號的密碼相關屬性的數據:
[root@study ~]# echo "password" | passwd --stdin myuser1
[root@study ~]# echo "password" | passwd --stdin myuser2
[root@study ~]# echo "password" | passwd --stdin myuser3
要注意的地方主要有:myuser1 與 myuser2 都有支援次要群組,但該群組不見得會存在,因此需要先手動建立他! 然后 myuser3 是『不可登入系統』的賬號,因此需要使用 /sbin/nologin 這個 shell 來給予,這樣該賬號就無法登入啰! 這樣是否理解啊!接下來再來討論比較難一些的環境!如果是專題環境該如何制作?
任務二:我的使用者 pro1, pro2, pro3 是同一個項目計劃的開發人員,我想要讓這三個用戶在同一個目錄底下工作, 但這三個用戶還是擁有自己的家目錄與基本的私有群組。假設我要讓這個項目計劃在 /srv/projecta 目錄下開發, 可以如何進行?
# 1. 假設這三個賬號都尚未建立,可先建立一個名為 projecta 的群組,
# 再讓這三個用戶加入其次要群組的支持即可:
[root@study ~]# groupadd projecta
[root@study ~]# useradd -G projecta -c "projecta user" pro1
[root@study ~]# useradd -G projecta -c "projecta user" pro2
[root@study ~]# useradd -G projecta -c "projecta user" pro3
[root@study ~]# echo "password" | passwd --stdin pro1
[root@study ~]# echo "password" | passwd --stdin pro2
[root@study ~]# echo "password" | passwd --stdin pro3# 2. 開始建立此項目的開發目錄:
[root@study ~]# mkdir /srv/projecta
[root@study ~]# chgrp projecta /srv/projecta
[root@study ~]# chmod 2770 /srv/projecta
[root@study ~]# ll -d /srv/projecta
drwxrws---. 2 root projecta 6 Jul 20 23:32 /srv/projecta
但接下來有個困擾的問題發生了!假如任務一的 myuser1 是 projecta 這個項目的助理,他需要這個項目的內容, 但是他『不可以修改
』項目目錄內的任何數據!那該如何是好?你或許可以這樣做:
- 將 myuser1 加入 projecta 這個群組的支持,但是這樣會讓 myuser1 具有完整的 /srv/projecta 的權限,myuser1 是可以刪除該目錄下的任何數據的!這樣是有問題的;
- 將 /srv/projecta 的權限改為 2775 ,讓 myuser1 可以進入查閱數據。但此時會發生所有其他人均可進入該目錄查閱的困擾! 這也不是我們要的環境。
真要命!傳統的 Linux 權限無法針對某個個人設定專屬的權限嗎?其實是可以啦!接下來我們就來談談這個功能吧!
23.5 使用外部身份認證系統
有時候,除了本機的賬號之外,我們可能還會使用到其他外部的身份驗證服務器所提供的驗證身份的功能!舉例來說, windows
底下有個很有名的身份驗證系統,稱為 Active Directory (AD)
的東西,還有 Linux
為了提供不同主機使用同一組賬號密碼, 也會使用到LDAP, NIS
等服務器提供的身份驗證等等!
如果你的 Linux 主機要使用到上面提到的這些外部身份驗證系統時,可能就得要額外的設定一些數據了! 為了簡化用戶的操作流程,所以 CentOS 提供一只名為authconfig-tui
的指令給我們參考,這個指令的執行結果如下:
你可以在該畫面中使用 [tab] 按鈕在各個項目中間切換,不過,因為我們沒有適用的服務器可以測試,因此這里僅是提供一個參考的依據, 未來如果談到服務器章節時,你要如果談到服務器章節時,服器有印象,處理外部身份驗證的方式可以透過 authconfig-tui 就好了! 上圖中最多可供操作的,大概僅有支持 MD5 這個早期的密碼格式就是了!此外,不要隨便將已經啟用的項目 (上頭有星號 *的項目) 取消喔! 可能某些賬號會失效…
該系列目錄 --> 【BASH】回顧與知識點梳理(目錄)