- 论坛徽章:
- 0
|
使用者身份切換:
什麼?在 Linux 系統當中還要作身份的變換?這是為啥?
- 系統平日操作的好習慣:
事實上,為了安全的緣故, 我們大家都會建議您,操作 Linux 時,盡量以一般身份使用者來操作,等到需要設定系統環境時, 才變換身份成為 root 來進行系統管理,相對比較安全啦!避免作錯一些嚴重的指令~~
- 用較低權限啟動系統服務
相對於系統安全,有的時候,我們必須要以某些系統帳號來進行程序的進行。 舉例來說, Linux 主機上面的一套軟體,名稱為 apache ,我們可以額外建立一個名為 apache 的使用者來啟動 apache 啊,如此一來,如果這個程序被攻破,至少系統還不至於就損毀了~
- 軟體本身的限制
這裡有個很有趣的問題要來跟大家分享一下,還記得在古老的年代裡面,還沒有 ssh 的時候,我們都是使用 telnet 登入系統的,偏偏系統預設是不開啟 root 以 telnet 登入,那麼好了!我們要怎樣遠端操控我們的 Linux 主機呀!? 因為由前面的介紹我們不難發現,系統當中最特殊的帳號就是 UID 為 0 的使用者了,他具有至高無上的權力!而且是系統管理員必須要具備的身份, 否則怎樣操控主機呢?您說是吧!好了,那麼 telnet 將 root 的登入權限關掉了,而如果我們在製作一個使用者,並將其 UID 變為 0 的話又如何?嘿嘿!很抱歉, telnet 就是認 UID 的,所以肯定還是進不了系統, 這個時候要怎麼辦呀!?就是變換身份呀!將一般使用者的身份變成了 root 就行了! 但是怎樣變換身份呀?怎麼說呢?就是說,一般而言,我們都不希望以 root 的身份登入主機,以避免被怪客入侵了!但是一部主機又不可能完全不進行修補或者是設定等動作! 這個時候要如何將一般使用者的身份變成 root 呢?主要有兩種方式,分別是:
- 以 su 直接將身份變成 root 即可,但是這個指令卻需要 root 的密碼,也就是說,如果你要以 su 變成 root 的話,你的一般使用者就必須要有 root 的密碼才行;
- 所以當有很多人同時管理一部主機的時候,那麼 root 的密碼不就很多人知道了?不是很好吧?所以,如果不想要將 root 的密碼流出去呢?呵呵!可以使用 sudo 來進行工作呦!
底下我們就來說一說 su 跟 sudo 的用法啦!
![]()
su
[root@linux ~]# su [-lcm] [username]
參數:
- :如果執行 su - 時,表示該使用者想要變換身份成為 root ,且使用 root 的
環境設定參數檔,如 /root/.bash_profile 等等。
-l :後面可以接使用者,例如 su -l dmtsai ,這個 -l 好處是,可使用欲變換身份者
他的所有相關環境設定檔。
-m :-m 與 -p 是一樣的,表示『使用目前的環境設定,而不重新讀取新使用者的設定檔。』
-c :僅進行一次指令,所以 -c 後面可以加上指令喔!
範例:
範例一:由原本的 dmtsai 這個使用者,變換身份成為 root 。
[dmtsai@linux ~]$ su
Password:
[root@linux ~]# env
USER=dmtsai
USERNAME=root
MAIL=/var/spool/mail/dmtsai
LOGNAME=dmtsai
# 注意到了嗎?如果使用 su 沒有加上 - 的話,那麼很多原本使用者的相關設定會繼續存在,
# 這也會造成後來的 root 身份在執行時的困擾。最常見的就是 PATH 這個變數的問題!
[root@linux ~]# exit
[dmtsai@linux ~]$ su -
Password:
[root@linux ~]# env
USER=root
MAIL=/var/spool/mail/root
LOGNAME=root
# 瞭解差異了吧?!所以,下次在變換成為 root 時,記得最好使用 su - 喔!
範例二:使用 root 的身份,執行 head -n 3 /etc/shadow
[dmtsai@linux ~]$ su - -c "head -n 3 /etc/shadow"
Password:
root:$1$jaldj9843u29jlj9u839jljlcghjlE/:12959:0:99999:7:::
bin:*:12959:0:99999:7:::
daemon:*:12959:0:99999:7:::
範例三:原本是 dmtsai 這個使用者,想要變換身份成為 vbird 時?
[dmtsai@linux ~]$ su -l vbird
Password:
這個 su 指令可以讓你在不同的使用者之間切換身份,當 su 後面沒有加上使用者帳號時, 那麼預設就是以 root 作為你切換的那個身份啦!其實,這個指令最大的用途也是在這裡! 就是讓一般使用者變成 root 啦!而要特別留意的則是 su 的使用方式上, 由於『是否讀入欲切換的身份者的環境參數檔案』的不同, 所以您必須要留意喔!
- 如果只是想要使用 root 的身份來操作系統,但是原有的環境參數並不想要改變, 那麼可以使用『 su 』直接切換身份成為 root ,例如上面的範例一所示。 此時, MAIL/PATH/USER 等環境變數都還是原來那位登入者喔!所以要特別留意例如 PATH 這個可能影響到執行指令進行的變數才行!
- 如果您想要保留原有的環境參數,那麼環境變數當中,最麻煩的當屬 PATH 這個東西, 由於為了避免一般使用者使用了 root 的管理指令,所以通常 Linux 都會將指令分類放在兩個主要的目錄,分別是 /bin 與 /sbin !那個 /sbin 大多是 super user 就是 root 用來管理系統的指令啦!所以,可能的話,將你習慣操作的那個帳號的 PATH 重新設定成為 root 的 PATH ,這樣也比較方便呀!
- 無論如何,還是建議您如果要切換成為某個身份,使用『 su - 』或者是『 su -l usename 』 會比較好一點~否則容易造成環境變數的差異~
- 另外,如果僅想要執行一次 root 的指令,那麼可以參考 -c "command" 這種 su 的使用方式喔!
- 當 root 使用 su 切換身份時,他並不需要輸入密碼喔!
雖然使用 su 很方便啦~不過,缺點是當我有很多管理員時,那麼是否每個人都需要知道 root 的密碼? 這樣很危險ㄟ! root 的密碼可能會外流~怎麼辦?沒關係,我們可以使用 sudo 來取代 su 喔。
![]()
sudo
使用 su 切換身份真的是很簡單啦~不過, su 卻有一個很嚴重的問題, 那就是.....我們必須要知道想要變成的那個人的登入密碼~ 舉例來說,如果我想要變成 root ,那麼就必須要知道 root 的密碼才行, 如果我想要變成 dmtsai 來工作,那麼除非我是 root ,否則就必須要知道 dmtsai 這個使用者的密碼才行~而眾所皆知的,如果多人管理一部主機的話, 大家都知道 root 的密碼,那......挺危險的,不是嗎?!
這個時候, sudo 就派的上用場囉~那麼 sudo 是怎樣工作的呢?
- 當使用者執行 sudo 時,系統會主動的去尋找 /etc/sudoers 檔案,判斷該使用者是否有執行 sudo 的權限;
- 若使用者具有可執行 sudo 的權限後,便讓使用者『輸入使用者自己的密碼』來確認;
- 若密碼輸入成功,便開始進行 sudo 後續接的指令;
- 不過, root 執行 sudo 時,不需要輸入密碼;
- 若欲切換的身份與執行者身份相同,那也不需要輸入密碼。
要注意的是,使用者『輸入的是自己的密碼,而不是欲切換成為他的那個身份的密碼!』 舉例來說,假設 dmtsai 具有執行 sudo 的權限,那麼當他以 sudo 執行 root 的工作時, 他需要輸入的是 dmtsai 自己的密碼,而不是 root 的密碼!嘿嘿!很棒吧! ^_^ 如此一來,大家可以使用自己的密碼執行 root 的工作,而不必知道 root 的密碼,安全多了。 此外,使用者能夠執行的指令是可以被限制的! 所以,我們可以設定 dmtsai 僅能進行 shutdown 的工作,或者是其他一些簡單的指令, 嘿嘿!是否很棒啊!
不過,由上面的說明當中,您也會瞭解,是否具有 sudo 的執行權限是很重要的, 而 sudo 的執行權限與 /etc/sudoers 這的檔案有關。在預設的情況下,只有 root 才能夠使用 sudo 呢!至於編輯 /etc/sudoers 則需要 visudo 這個指令。好了, 底下我們就來看一看 sudo 的語法先。
[root@linux ~]# sudo [-u [username|#uid]] command
參數:
-u :後面可以接使用者帳號名稱,或者是 UID。例如 UID 是 500 的身份,可以:
-u #500 來作為切換到 UID 為 500 的那位使用者。
範例:
範例一:一般身份使用者使用 sudo 在 /root 底下建立目錄:
[dmtsai@linux ~]$ sudo mkdir /root/testing
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
Password:
dmtsai is not in the sudoers file. This incident will be reported.
# 瞧!因為 dmtsai 不在 /etc/sudoers ,所以他就無法執行 sudo 喔!
範例二:假設 dmtsai 已經具有 sudo 的執行權限,如何在 /root 底下建立目錄?
[dmtsai@linux ~]$ sudo mkdir /root/testing
Password:
範例三:如何將 sudo 與 su 搭配使用?
[dmtsai@linux ~]$ sudo su -
範例四:dmtsai 想要切換身份成為 vbird 來進行 touch 時?
[dmtsai@linux ~]$ sudo -u vbird touch /home/vbird/test
上面我進行了四個範例,不過,要注意的是,若我是以 dmtsai 來進行的, 那麼除了第一次執行 sudo 需要輸入密碼,未來的時間內(在這次登入的狀況中)就不需要再重複輸入密碼了! 呼呼!真是很人性啊的設計啊~ ^_^
上面這四個範例我都是以 dmtsai 這個使用者來進行的,但是,在預設的情況中, 您的使用者應該是不能使用 sudo 的~這是因為我們上面提到的啊,還沒有去設定 /etc/sudoers 嘛! 所以囉,如果您要測試上面的範例之前,是需要將 /etc/sudoers 動動手腳的。 不過,因為 /etc/sudoers 需要一些比較特別的語法,因此,如果你直接以 vi 去編輯他時, 如果輸入的字句錯誤,可能會造成無法啟用 sudo 的困擾,因此,建議您一定要使用 visudo 去編輯 /etc/sudoers 喔!(註: visudo 必須要使用 root 的身份來執行!)
[root@linux ~]# visudo
# sudoers file.
# This file MUST be edited with the 'visudo' command as root.
# See the sudoers man page for the details on how to write a sudoers file.
#
# Host alias specification
# User alias specification
# Cmnd alias specification
# Defaults specification
# Runas alias specification
# User privilege specification
root ALL=(ALL) ALL
dmtsai ALL=(ALL) ALL
# Uncomment to allow people in group wheel to run all commands
# %wheel ALL=(ALL) ALL
# Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
# Samples
# %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users localhost=/sbin/shutdown -h now
使用 visudo 之後,其實就會出現一個 vi 的畫面啦!他就是以 vi 來開啟 /etc/sudoers , 不過,當我們儲存離開時, visudo 會額外去檢查 /etc/sudoers 內部的語法, 以避免使用者輸入錯誤的資訊了。我上面只有加入一行,就是讓那個 dmtsai 成為可以隨意使用 sudo 的身份而已。基本上, /etc/sudoers 的結構您可以使用 man sudoers 去查閱, 該說明內容說的很清楚,而且還有一些範例呢!鳥哥在這裡僅作一些簡單的說明就是了。 那一行『 dmtsai ALL=(ALL) ALL 』代表的意義是:
使用者帳號 登入的主機 = (可以變換的身份) 可以下達的指令 因此,我上面這一行的意義是:『 dmtsai 這個使用者,不論來自何方, 他可以變換成任何 Linux 本機上面有的所有帳號,並執行所有的指令』的意思啦! 假如您的系統裡面,有個 Web 的軟體是以 www 這個使用者來進行編輯的, 您想要讓 vbird2 這個使用者可以用 www 這個帳號進行編輯,那麼就應該寫成:
如果錯寫成:
亦即沒有加上身份宣告的話,那麼『預設是僅能進行 root 的身份切換』而已喔! ^_^ 這可是很重要的一個觀念呢!另外,如果想要以使用者的群組來進行規範的話,那麼在 『使用者帳號』的欄位,前面加上『 % 』時,就代表是群組 (group) 的身份了。 舉例來說,我想要讓系統裡面所有屬於 wheel 這個群組的使用者都能夠進行 sudo 時,可以這樣寫:
而如果你還想要讓這個群組內的使用者在使用 sudo 時,不需要輸入密碼, 那麼可以在『可以下達的指令』那個欄位內多加入一個參數,名為『NOPASSWD:』即可,亦即:
%wheel ALL = (ALL) NOPASSWD: ALL 另外,除了單一個人或單一群組之外,我們還可以額外指定一些『帳號別名、主機別名、指令別名』 等等的資料來相互套用喔!真是好棒啊!不過,關於別名的使用上,『必須要使用大寫字元』才行喔! 好了,我們來做一些練習,讓您可以很清楚的知道如何進行 visudo 的設定吧!
例題:我想要建立一個可以幫忙系統管理員變更使用者密碼的群組,名稱為 ADMPW ( 注意,在 sudoers 內,這個別名的名稱一定要是大寫字元才行!)但是這個群組不能修改 root 的密碼喔!且他們執行 sudo 時,不需要密碼驗證。
答:
我以 root 的身份使用 visudo ,進入編輯畫面後,去設定成底下的模樣:User_Alias ADMPW = vbird, dmtsai, vbird1, vbird3
ADMPW ALL = NOPASSWD: !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, \
!/usr/bin/passwd root
上面的意思是說,我的系統上面有四個帳號,分別是 vbird, vbird1, vbird3 與 dmtsai 這四個帳號加入 sudo 內的 ADMPW 群組中,這四個帳號可以使用 sudo 進行『 /usr/bin/passwd * 』密碼的更改動作,但是不能 (在指令前面加入 ! 代表不可) 使用 /usr/bin/passwd 或 /usr/bin/passwd root ,如此一來,就讓該 ADMPW 可以更改使用者的密碼,但是不能變更 root 的密碼囉! ^_^
在 /etc/sudoers 裡頭加入別名有很多的好處,舉例來說,以上面的例子來講, 假設未來我有其他的使用者要加入該密碼管理的群組時,直接將帳號加入 ADMPW 那個群組中就好了,很簡單的使用吧! ^_^。再看看下一題:
例題:我的系統中有 DNS 服務,他的啟動指令在 /etc/init.d/named ,如果我想要建立一個 DNSMASTER 的群組來管理他時?如何是好?
答:
我以 root 的身份使用 visudo ,進入編輯畫面後,去設定成底下的模樣:User_Alias DNSMASTER = vbird, dmtsai
Cmnd_Alias DNSCMD = /etc/init.d/named, /usr/bin/vim /var/named/*
DNSMASTER ALL = DNSCMD
看的懂嗎?嘿嘿!因為 DNS 的設定檔大多在 /var/named 裡面,所以,我也允許相關帳號用 vi 去處理 DNS 的設定檔啦!很簡單對吧! ^_^
好了,我們知道 sudo 可以搭配 su 來進行一堆系統的工作對吧! 因為 sudo 僅能進行一次指令,很麻煩,如果我能夠將 sudo 與 su 搭配在一起,不就很棒了嗎? 這個時候,我可以利用上面已經建立好的 ADMPW 群組來新增這一行:
如此一來,在 ADMPW 內的使用者,就可以利用『 sudo su - 』來切換身份成為 root 囉~ 真是棒得不得了啊! ^_^
![]()
使用者的特殊 shell 與 PAM 模組
我們前面一直談到的大多是一般身份使用者與系統管理員 (root) 的相關操作, 而且大多是討論關於可登入系統的帳號來說。那麼換個角度想,如果我今天想要建立的, 是一個『僅能使用 mail server 相關郵件服務的帳號,而該帳號並不能登入 Linux 主機』呢? 如果不能給予該帳號一個密碼,那麼該帳號就無法使用系統的各項資源,當然也包括 mail 的資源, 而如果給予一個密碼,那麼該帳號就可能可以登入 Linux 主機啊!呵呵~傷腦筋吧~ 所以,底下讓我們來談一談這些有趣的話題囉!
![]()
特殊的 shell, /sbin/nologin
如果你曾經仔細的看過 /etc/shells 這個系統可用的 shell 檔案,以及 /etc/passwd 這個檔案的內容時,你應該會發現,嘿嘿!怎麼有個怪怪的 /sbin/nologin 啊! 這是什麼 shell 呢?呵呵!趕緊利用 man nologin 就可以知道啦~
其實,這個 shell 通常是給系統帳號使用的,因為這個 /sbin/nologin 事實上並無法給予帳號實際登入, 如果你利用 usermod 修改了 dmtsai 這個使用者的 shell 成為 /sbin/nologin 之後, 再次想要以 dmtsai 重新登入系統時,他在螢幕上會出現這樣的訊息:
This account is currently not available.
嘿嘿!它說的是『這個帳號並不能被允許登入啦!』不過,這個帳號卻可以進行其他的工作喔! 舉例來說,各個系統帳號,列印工作由 lp 這個帳號在管理, WWW 服務由 apache 這個帳號在管理, 他們都可以進行系統程序的工作,但是『就是無法登入主機』而已啦!^_^
換個角度來想,如果我的 Linux 主機提供的是郵件服務,所以說,在這部 Linux 主機上面的帳號, 其實大部分都是用來收受主機的信件而已,並不需要登入主機的呢! 這個時候,我們就可以考慮讓單純使用 mail 的帳號以 /sbin/nologin 做為他們的 shell , 這樣,最起碼當我的主機被嘗試想要登入系統時,可以拒絕該帳號呢!
另外,如果我想要讓某個具有 /sbin/nologin 的使用者知道,他們不能登入主機時, 其實我可以建立『 /etc/nologin.txt 』這個檔案, 並且在這個檔案內說明不能登入的原因,那麼下次當這個使用者想要登入系統時, 螢幕上出現的就會是 /etc/nologin.txt 這個檔案的內容,而不是預設的內容了!
![]()
PAM 模組:/etc/nologin, /etc/securetty
當一個使用者想要登入 Linux 主機時,他受到什麼限制呢?我們說, 他除了必須要通過 /etc/passwd 及 /etc/shadow 的驗證並取得相關的權限資料, 最後獲得一個 shell 之外,事實上,他在登入系統之前,就得要通過 PAM (Pluggable Authentication Modules, 嵌入式模組) 的驗證才行。
PAM 模組的用途非常的多,除了可以在使用者登入時進行身份的驗證之外, 也可以輔助一些應用程式的驗證之用喔!舉例來說,我們前面提到的密碼修改程式『 passwd 』 ,當我們執行密碼修訂的時候,這個程式不是會告訴我們您輸入的密碼是否合於規範嗎? 如果是記錄在字典當中的密碼,或者是與帳號相同的密碼,那麼就會被 PAM 模組打回票, 也就無法通過驗證了!
那麼 PAM 怎麼運作呢?我們同樣以 /usr/bin/passwd 這支程式來作為簡單的說明好了:
使用者開始執行 /usr/bin/passwd 這支程式,並輸入密碼;
passwd 開始呼叫 PAM 模組,PAM 模組會搜尋 passwd 程式的 PAM 相關設定檔案, 這個設定檔一般是在 /etc/pam.d/ 裡面的與程式同名的檔案,所以,在本例中, PAM 會去搜尋 /etc/pam.d/passwd 這個設定檔;
經由 /etc/pam.d/passwd 設定檔的資料,取用 PAM 所提供的相關模組來進行驗證;
將驗證結果回傳給 passwd 這支程式,而 passwd 這支程式會根據 PAM 回傳的結果決定下一個動作 (重新輸入新密碼或者通過驗證!)這個過程提供我們幾個重要的資訊:
- PAM 的設定檔放置在 /etc/pam.d/ 這個目錄中;
- 至於更多的環境相關設定則放置在 /etc/security/* 內;
- PAM 是透過自己提供的相關模組來進行驗證,模組放置在 /lib/security/* 內。
至於 PAM 相關模組的運作,有興趣的話,您可以前往您 Linux 主機的: /usr/share/doc/pam* 目錄去瞧一瞧,裡面有相當多豐富的資訊可以提供給你參考。 我們這裡僅就使用者登入相關的模組來進行一些簡單的說明而已喔。
PAM 的設定檔設定範例:
反正 PAM 模組就是讓程式呼叫用的,而當程式呼叫時, PAM 就會利用相對應的設定檔來進行一些驗證就是了。我們還是舉 passwd 為例好了, 如果你去觀察一下 /etc/pam.d/passwd 的內容時,他是這樣的:
[root@linux ~]# cat /etc/pam.d/passwd
#%PAM-1.0
auth required pam_stack.so service=system-auth
account required pam_stack.so service=system-auth
password required pam_stack.so service=system-auth
基本上,在這個檔案內,每一行都是一個動作,而每個動作都分為四個欄位,分別是:
驗證的類別 驗證的控制標準 使用的PAM模組 該模組的能使用的參數 驗證的類別 (Module type) 共分為四種類,分別說明:
- auth
這種類別主要用來檢驗使用者的身份驗證,所以這種類別通常是需要密碼來檢驗的。
- account
這種類別則主要在檢驗使用者是否具有正確的使用權限,舉例來說,當你使用一個過期的密碼來登入時, 當然就無法正確的登入了。
- session
這種類別主要在管理當使用者正確的使用該程式時的環境設定。舉例來說,我們登入 Linux 其實使用的是 /bin/login 這個程式的相關功能的,所以,當實際登入後,在操作 shell 的過程中,都是受 session 這種類別的設定所控制的喔!另外,如果使用 session 這種類別時, 則該程式在正式使用之前與使用結束之後,都會有相關紀錄被記到登錄檔當中喔!
- password
至於這種類別,則主要在提供驗證的修訂工作,舉例來說,就是修改/變更密碼啦! 那麼『驗證的控制標準(control flag)』又是什麼?簡單的說,他就是『驗證通過的標準』啦! 總共也有四種方式,分別是:
- required
當模組設定為這種控制標準時,該模組的驗證必須要成功,否則就會回傳一個 failure 的訊息。 不過,不論此一動作的模組是否成功,接下去的模組都還會繼續動作! 而若有 failure 的訊息時,也會在後續的動作都進行完畢之後,才會回傳給原程式。 比底下的 requisite 還要優秀的地方,在於該模組底下的動作可能具有登錄檔紀錄 (log) 的舉動,則錯誤的訊息才會被紀錄起來喔!
- requisite
當模組設定為 requisite 時,該模組的認證要求同樣的需要成功才行。 不過,如果該模組沒有通過驗證,那麼 PAM 會『立刻』回報程式一個 failure 的值, 也就是說,若該次動作的模組後續還有其他模組時,其他模組的動作將不會被啟用。
- optional
這個模組控制項目大多是在顯示訊息而已,並不是用在驗證方面的。
- sufficient
這個模組控制標準也挺有趣的,相對於 requisite 是『發生錯誤時,立刻回報原執行程式 failure , 並且中斷 PAM 的運作』, sufficient 則是『順利通過驗證時,立刻回報原程式通過的訊息, 並且中斷 PAM 的運作』。呵呵!完全相反喔!\n 至於 PAM 的模組方面,目前我們的 FC4 提供的 PAM 模組真的夠多了, 這些模組實際上都放置在 /lib/security/ 目錄中,FC4 相關的 PAM 說明文件則放置在 /usr/share/doc/pam-*/* 裡面,您可以根據每個不同的模組去討論他的用途, 鳥哥在這裡僅針對我們登入時所使用的 login 這個程式的 PAM 設定檔,也就是 /etc/pam.d/login 這個檔案的內容來稍做說明:
[root@linux ~]# cat /etc/pam.d/login
#%PAM-1.0
auth required pam_securetty.so
auth required pam_stack.so service=system-auth
auth required pam_nologin.so
account required pam_stack.so service=system-auth
password required pam_stack.so service=system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_stack.so service=system-auth
session optional pam_console.so
# pam_selinux.so open should be the last session rule
session required pam_selinux.so multiple open
在我們登入 Linux 的時候,使用到的 login 這個程式時,他使用的 PAM 設定檔大多是 required 的控制標準,所以必須要通過上述的幾個 PAM 模組的驗證後,才能夠判定是否登入 Linux 。 需要留意的是,我們會看到 session 的模組類型,這表示我們在實際使用 Linux 的資源之前,以及登出 Linux 主機後,相關的資料都會被紀錄到登錄檔當中。 嘿嘿!所以囉,如果您仔細的看過 /var/log/messages 與 /var/log/secure , 就能夠發現你的一舉一動其實是有被紀錄下來的喔! ^_^
另外,在上面表格當中的模組中,比較有趣的是被鳥哥註明特殊字體的部分, 這兩個模組: pam_securetty.so 及 pam_nologin 是挺有趣的喔! 我們就額外來談一談這兩個關於登入環境的驗證模組吧!
/etc/securetty
這個 pam_securetty 模組是幹嘛用的?其實他最主要的功能就是在預防不安全的登入環境啦! 而且主要是針對 root 這個使用者的身份喔! 這個模組在被啟用時,會去讀取 /etc/securetty 這個檔案, 我們『可以將被認定是安全的終端機 (terminal) 環境寫入這個檔案中, 則 root 僅可以在那幾個終端機環境下登入』的啦!
一般來說,我們會認定在主機前面的環境是安全的,而使用網路登入的環境則比較危險。 因此,一般 /etc/securetty 的內容大多是這樣:
tty1
tty2
tty3
tty4
...
而沒有 pts/0 這類的網路登入的終端介面。這也就是說, root 僅能經由 tty1 這種終端機登入的啦!支援 login 程式的軟體有 telnet 服務與本機前面的 tty1~tty6 的 login, 這也是我們提到的,為何使用傳統的 telnet 連線主機連線到 Linux 時,預設無法使用 root 身份登入的主要原因囉。
那麼如何克服呢?其實也很簡單啦,就將這個模組的驗證移除即可! 主要有兩種方式:
- 將 /etc/pam.d/login 內,關於 pam_securetty.so 模組的那一行註解掉;
- 將 /etc/securetty 這個檔案移除。
如此一來,當我們使用 telnet 連線到 Linux 主機時,就能夠直接使用 root 的身份登入了。 不過,鳥哥不建議這麼做喔!不過或許您又會問啦,那為什麼我使用 ssh 連線時, 就可以直接使用 root 登入呢?呵呵!這是因為 ssh 沒有用到這個模組ㄇㄟ! 不相信嗎?仔細自己去查閱一下 /etc/pam.d/sshd 就知道啦! ^_^。
/etc/nologin
那麼 pam_nologin 又是在搞什麼咚咚啊?其實,這個模組也是在控制使用者登入用的。 不過,這個模組只針對一般身份使用者有效,對 root 是沒有效果的。這個模組必須要與 /etc/nologin 搭配使用,注意喔,是 /etc/nologin ,而不是 /etc/nologin.txt , 這兩個檔案的用途是不相同的喔! ^_^。
當 /etc/nologin 檔案存在時,則任何一個一般身份帳號在嘗試登入時, 都僅會獲得 /etc/nologin 內容的資訊,而無法登入主機。舉例來說,當我建立 /etc/nologin ,並且內容設定為『This Linux server is maintaining....』, 那麼任何人嘗試登入時,都僅會看到上面提到的這段訊息,而且無法登入喔! 一直要到 /etc/nologin 被移除後,一般身份使用者才能夠再次的登入啊!
/etc/security/*
事實上,更多的 PAM 模組設定資訊您可以參考 /etc/security/* 裡面的檔案設定, 尤其是針對使用者利用 Linux 系統資源的 limits.conf 以及時間的 time.conf 。 我們知道使用者利用系統資源的指令是 ulimit ,那麼假如我想要讓 dmtsai 僅能存取 10MBytes (10240KBytes) 的檔案大小,那麼我可以這樣做:
[root@linux ~]# vi /etc/security/limits.conf
# 新增這兩行
dmtsai hard fsize 10240
@users hard fsize 10240
# 注意到,帳號前面加上 @ 表示為『群組!』
那麼下次 dmtsai 或者是屬於 users 的群組的使用者登入這個 Linux 主機時, 你可以利用 ulimit -a 去察看一下,嘿嘿!他們能用的資源就減小很多了! 更多的用法您可以自行參考一下該檔案內的說明啊! ^_^ (記得測試完畢要將資料改回來~否則....以後就麻煩了!)
![]()
Linux 系統上使用者的對談與 mail 的使用:
談了這麼多的系統帳號問題,總是該要談一談,那麼如何針對系統上面的使用者進行查詢吧?! 想幾個狀態,如果你在 Linux 上面操作時,剛好有其他的使用者也登入主機,你想要跟他對談,該如何是好? 你想要知道某個帳號的相關資訊,該如何查閱?呼呼!底下我們就來聊一聊~
![]()
查詢使用者: w, who, last, lastlog
如何查詢一個使用者的相關資料呢?這還不簡單,我們之前就提過了 w, who, finger 等指令了, 都可以讓您瞭解到一個使用者的相關資訊啦!那麼想要知道使用者到底啥時候登入呢? 最簡單可以使用 last 檢查啊!這個玩意兒我們也在 bash shell 那個章節提過了, 您可以自行前往參考啊!簡單的很。不過, last 僅有列出這個月份的資料而已喔。
另外,如果您想要知道每個帳號的最近登入的時間,則可以使用 lastlog 這個指令喔! lastlog 會去讀取 /var/log/lastlog 檔案,結果將資料輸出,如下表:
[root@linux ~]# lastlog
Username Port From Latest
root tty1 Tue Aug 16 18:06:20 +0800 2005
bin **Never logged in**
daemon **Never logged in**
....以下省略.....
這樣就能夠知道每個帳號的最近登入的時間囉~ ^_^
![]()
使用者對談: talk, mesg, wall
那麼我是否可以跟系統上面的使用者談天說地呢?當然可以啦! 利用 talk 這個指令即可!不過, talk 需要額外的啟動一些網路服務, 對於目前的 Linux distribution 以及網路環境,嘿嘿!咱們還是不要玩這個東西啦~ 如果您確定想要玩這個玩意兒,那麼請自行 man talk , 同時考慮啟動 ntalk 這個服務看看囉~
除了直接線上對談 (talk) 之外,有沒有其他訊息傳送的功能啊? 有啊!利用 write 是不錯的方式啦!他可以直接將訊息傳給接收者囉! 舉例來說,我們的 Linux 目前有 vbird 與 dmtsai 兩個人在線上:
[vbird@linux ~]$ w
16:50:39 up 1:58, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
vbird pts/0 vbird 4:37pm 0.00s 0.06s 0.01s w
dmtsai pts/1 dmtsai 4:38pm 1:51 0.07s 0.01s man write
我以 vbird 傳送一個訊息給 dmtsai 時,可以這樣做:
[vbird@linux ~]$ write dmtsai
Hi, How are you doing today....
Nothing.... just say hello to you!
此時,另一端的 dmtsai 在他的終端介面上就會出現如下所示:
[dmtsai@linux ~]$
Hi, How are you doing today....
Nothing.... just say hello to you!
EOF
怪怪~立刻會有訊息回應給 dmtsai ㄟ!不過......當時 dmtsai 正在查資料,哇! 這些訊息會立刻打斷 dmtsai 原本的工作喔!所以,如果 dmtsai 這個人不想要接受任何訊息, 直接下達這個動作:
[dmtsai@linux ~]$ mesg n
所以,當 vbird 再次下達 write 時,就會出現:
[vbird@linux ~]$ write dmtsai
write: dmtsai has messages disabled
呼呼!瞭解乎?而如果想要解開的話,再次下達『 mesg y 』就好啦!想要知道目前的 mesg 狀態,直接下達『 mesg 』即可!瞭呼?
相對於 write 是僅針對一個使用者來傳『簡訊』,我們還可以『對所有系統上面的使用者傳送簡訊』哩~ 如何下達?呼呼!用 wall 即可啊!他的語法也是很簡單的喔!
[root@linux ~]# wall "I will shutdown the linux server about 5m later.
> If you still have to login, please tell me.
> Or I will do it....."
那麼除非您的 mesg 狀態是 n ,否則,嘿嘿!就能夠收到這個廣播訊息囉! ^_^
![]()
使用者郵件信箱: mail
使用 wall, write 畢竟要等到使用者在線上才能夠進行,有沒有其他方式來聯絡啊? 不是說每個 Linux 主機上面的使用者都具有一個 mailbox 嗎? 我們可否寄信給使用者啊!呵呵!當然可以啊!我們可以寄、收 mailbox 內的信件呢! 一般來說, mailbox 都會放置在 /var/spool/mail 裡面,一個帳號一個 mailbox (檔案)。 舉例來說,我的 dmtsai 就具有 /var/spool/mail/dmtsai 這個 mailbox 喔!
那麼我該如何寄出信件呢?嗯!就直接使用 mail 這個指令即可! 這個指令的用法很簡單的,直接這樣下達:『 mail username@localhost -s "郵件標題" 』即可! 一般來說,如果是寄給本機上的使用者,基本上,連『 @localhost 』都不用寫啦! 舉例來說,我以 vbird 寄信給 dmtsai ,信件標題是『 nice to meet you 』,則:
[vbird@linux ~]$ mail dmtsai -s "nice to meet you"
Hello, D.M. Tsai
Nice to meet you in the network.
You are so nice. byebye!
.
Cc:
[vbird@linux ~]$
呼呼!如此一來,你就已經寄出一封信給 dmtsai 這位使用者囉,而且,該信件標題為: nice to meet you,信件內容就如同上面提到的。不過,你或許會覺得 mail 這個程式不好用~ 因為在信件編寫的過程中,如果寫錯字而按下 Enter 進入次行,前一行的資料很難刪除ㄟ! 那怎麼辦?沒關係啦!我們使用資料流重導向啊!呵呵!利用那個小於的符號 (
例題:請將你的家目錄下的環境變數檔 (~/.bashrc) 寄給自己!
答:
mail -s "bashrc file content" vbird
剛剛上面提到的是關於『寄信』的問題,那麼如果是要收信呢?呵呵!同樣的使用 mail 啊! 假設我以 dmtsai 的身份登入主機,然後輸入 mail 後,會得到什麼?
[dmtsai@linux ~]$ mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/dmtsai": 1 message 1 new
>N 1 vbird@linux.site Fri Sep 2 23:53 16/552 "nice to meet you"
&
在 mail 當中的提示字元是 & 符號喔,別搞錯了~輸入 mail 之後,我可以看到我有一封信件, 這封信件的前面那個 > 代表目前處理的信件,而在大於符號的左邊那個 N 代表該封信件尚未讀過, 如果我想要知道這個 mail 內部的指令有哪些,可以在 & 之後輸入『 ? 』,就可以看到如下的畫面:
& ?
Mail Commands
t type messages
n goto and type next message
e edit messages
f give head lines of messages
d delete messages
s file append messages to file
u undelete messages
R reply to message senders
r reply to message senders and all recipients
pre make messages go back to /usr/spool/mail
m mail to specific users
q quit, saving unresolved messages in mbox
x quit, do not remove system mailbox
h print out active message headers
! shell escape
cd [directory] chdir to directory or home if none given
指的是每封郵件的左邊那個數字啦!而幾個比較常見的指令是:
指令
意義
h
將信件的標題列出來。如果想要查閱 40 封信件左右處的所有信件標頭,可以輸入『 h 40 』
d
刪除啦~假設我要刪除第10封信,可以『 d10 』,假如我想要刪除 20-40 封信,可以『 d20-40 』,不過,這個動作要生效的話,必須要配合 q 這個指令才行(參考底下說明)!
s
將信件儲存成為檔案。舉例來說,我要將第 5 封信件的內容存成 ~/mail.file 的話,可以:『 s 5 ~/mail.file 』喔!
x
或者輸入 exit 都可以。這個是『不作任何動作離開 mail 程式』的意思。不論你剛剛刪除了什麼信件,或者讀過什麼,使用 exit 都會直接離開 mail,所以剛剛進行的刪除與閱讀工作都會無效。如果您只是查閱一下郵件而已的話,一般來說,建議使用這個離開啦!除非你真的要刪除某些信件。
q
相對於 exit 是不動作離開, q 則會進行兩項動作: 1. 將剛剛刪除的信件移出 mailbox 之外; 2. 將剛剛有閱讀過的信件存入 ~/mbox ,且移出 mailbox 之外。鳥哥通常不很喜歡使用 q 離開,因為,很容易忘記讀過什麼咚咚~導致信件給他移出 mailbox 說~
mail 這個指令內容還有很多可以玩的,不過,我們這裡僅是介紹給您如何讓一般身份使用者來使用 mail 而已,所以就介紹到此囉~ ^_^
![]()
手動增加使用者:
一般來說,我們不很建議大家使用手動的方式來新增使用者,為什麼呢? 因為使用者的建立涉及到 GID/UID 等權限的關係,而且,與檔案/目錄的權限也有關係, 使用 useradd 可以幫我們自動設定好 UID/GID 家目錄以及家目錄相關的權限設定, 但是,手動來增加的時候,有可能會忘東忘西,結果導致一些困擾的發生。
不過,要瞭解整個系統,最好還是手動來修改過比較好,至少我們的帳號問題可以完全依照自己的意思去修訂, 而不必遷就於系統的預設值啊!但是,還是要告誡一下朋友們,要手動設定帳號時, 您必須要真的很瞭解自己在作什麼,尤其是與權限有關的設定方面喔! 好吧!底下就讓我們來玩一玩囉~ ^_^
![]()
一些檢查工具
既然要手動修改帳號的相關設定檔,那麼一些檢查群組、帳號相關的指令就不可不知道啊~ 尤其是那個密碼轉換的 pwconv 及 pwuconv 這兩個玩意~可重要的很呢! 底下我們稍微介紹一下這些指令吧!
- pwck
pwck 這個指令在檢查 /etc/passwd 這個帳號設定檔內的資訊,與實際的家目錄是否存在等資訊, 還可以比對 /etc/passwd /etc/shadow 的資訊是否一致,另外, 如果 /etc/passwd 內的資料欄位錯誤時,會提示使用者修訂。 一般來說,我只是利用這個玩意兒來檢查我的輸入是否正確就是了。
[root@linux ~]# pwck
user adm: directory /var/adm does not exist
user news: directory /etc/news does not exist
user uucp: directory /var/spool/uucp does not exist
瞧!上面僅是告知我,這些帳號並沒有家目錄,由於那些帳號絕大部分都是系統帳號, 確實也不需要家目錄的,所以,那是『正常的錯誤!』呵呵!不理他。 ^_^。 相對應的群組檢查可以使用 grpck 這個指令的啦!
- pwconv
這個指令主要的目的是在『將 /etc/passwd 內的帳號與密碼,移動到 /etc/shadow 當中!』 早期的 Unix 系統當中並沒有 /etc/shadow 呢,所以,使用者的登入密碼早期是在 /etc/passwd 的第二欄,後來為了系統安全,才將密碼資料移動到 /etc/shadow 內的。 使用 pwconv 後,可以:
- 比對 /etc/passwd 及 /etc/shadow ,若 /etc/passwd 內存在的帳號並沒有對應的 /etc/shadow 密碼時,則 pwconv 會去 /etc/login.defs 取用相關的密碼資料,並建立該帳號的 /etc/shadow 資料;
- 若 /etc/passwd 內存在加密後的密碼資料時,則 pwconv 會將該密碼欄移動到 /etc/shadow 內,並將原本的 /etc/passwd 內相對應的密碼欄變成 x !
一般來說,如果您正常使用 useradd 增加使用者時,使用 pwconv 並不會有任何的動作,因為 /etc/passwd 與 /etc/shadow 並不會有上述兩點問題啊! ^_^。 不過,如果手動設定帳號,這個 pwconv 就很重要囉!
- pwunconv
相對於 pwconv , pwunconv 則是『將 /etc/shadow 內的密碼欄資料寫回 /etc/passwd 當中, 並且刪除 /etc/shadow 檔案。』這個指令說實在的,最好不要使用啦! 因為他會將你的 /etc/shadow 刪除喔!如果你忘記備份,又不會使用 pwconv 的話, 粉嚴重呢!
- chpasswd
chpasswd 是個挺有趣的指令,他可以『讀入未加密前的密碼,並且經過加密後, 將加密後的密碼寫入 /etc/shadow 當中。』這個指令很常被使用在大量建置帳號的情況中喔! 他可以由 Standard input 讀入資料,每筆資料的格式是『 username:password 』。 舉例來說,我的系統當中有個使用者帳號為 dmtsai ,我想要更新他的密碼 (update) , 假如他的密碼是 abcdefg 的話,那麼我可以這樣做:
[root@linux ~]# echo "dmtsai:abcdefg" | chpasswd
神奇吧!這樣就可以更新了呢!在預設的情況中, chpasswd 使用的是 DES 加密方法來加密, 我們可以使用 chpasswd -m 來使用 FC4 預設的 MD5 加密方法,不過, FC4 似乎怪怪的,我老是無法使用 -m 來達成這個指令。無論如何, 還是可以直接使用 chpasswd 來應用 DES 加密喔! 使用 DES 方法加密後,在 /etc/shadow 的密碼欄內,他的密碼位數為 13 位, 瞭乎??
![]()
特殊帳號,如純數字帳號的建立
在我們瞭解了 UID/GID 與帳號的關係之後,基本上,您應該瞭解了,為啥我們不建議使用純數字的帳號了! 因為很多時候,系統會搞不清楚那組數字是『帳號』還是『UID』,這不是很好啦~ 也因此,在早期某些版本底下,是沒有辦法使用數字來建立帳號的。例如在 Red Hat 9 的環境中, 使用『 useradd 1234 』他會顯示『 useradd: invalid user name '1234' 』呼呼!瞭解了嗎?! (不過,這個問題在 FC4 卻不存在!因為 FC4 可以建立純數字的帳號說~)
不過,有的時候,長官的命令難為啊~有時還是得要建立這方面的帳號的,那該如何是好? 呵呵!當然可以手動來建立這樣的帳號啦!不過,為了系統安全起見,鳥哥還是不建議使用純數字的帳號的啦! 因此,底下的範例當中,我們使用手動的方式來建立一個名為 normaluser 的帳號, 而且這個帳號屬於 normalgroup 這個群組。OK!那麼整個步驟該如何是好呢? 由前面的說明來看,您應該瞭解了帳號與群組是與 /etc/group, /etc/shadow, /etc/passwd, /etc/gshadow 有關,因此,整個動作是這樣的:
- 先建立所需要的群組 ( vi /etc/group );
- 將 /etc/group 與 /etc/gshadow 同步化 ( grpconv );
- 建立帳號的各個屬性 ( vi /etc/passwd );
- 將 /etc/passwd 與 /etc/shadow 同步化 ( pwconv );
- 建立該帳號的密碼 ( passwd accountname );
- 建立使用者家目錄 ( cp -a /etc/skel /home/accountname );
- 更改使用者家目錄的屬性 ( chown -R accountname.group /home/accountname )。 夠簡單的咯吧!讓我們來玩一玩囉~
1. 建立群組 normalgroup ,假設 520 這個 GID 沒有被使用!並且同步化 gshadow
[root@linux ~]# vi /etc/group
# 在最後一行加入底下這一行!
normalgroup:x:520:
[root@linux ~]# grpconv
[root@linux ~]# grep 'normalgroup' /etc/group /etc/gshadow
/etc/group:normalgroup:x:520:
/etc/gshadow:normalgroup:x::
# 簡單!搞定群組囉! ^_^
2. 建立 normaluser 這個帳號,假設 UID 700 沒被使用掉!
[root@linux ~]# vi /etc/passwd
# 在最後一行加入底下這一行!
normaluser:x:700:520::/home/normaluser:/bin/bash
3. 同步化密碼,並且建立該使用者的密碼
[root@linux ~]# pwconv
[root@linux ~]# grep 'normaluser' /etc/passwd /etc/shadow
/etc/passwd:normaluser:x:700:520::/home/normaluser:/bin/bash
/etc/shadow:normaluser:x:13030:0:99999:7:::
# 呵呵!沒錯沒錯!已經建立妥當囉~但是密碼還不對~
[root@linux ~]# passwd normaluser
Changing password for user normaluser.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
4. 建立使用者家目錄,並且修訂權限!
[root@linux ~]# cp -a /etc/skel /home/normaluser
[root@linux ~]# chown -R normaluser:normalgroup /home/normaluser
別懷疑!這樣就搞定了一個帳號的設定了! 從此以後,你可以建立任何名稱的帳號囉~不過,還是不建議您設定一些很怪很怪的帳號名稱啦!
![]()
不開放終端機登入的帳號 (ex>mail acccount)
剛剛我們上面建立的這個帳號是『可以登入系統的帳號』,如果想要建立一個不能登入系統的帳號, 例如單純使用郵件收發信件而已的帳號,那麼又該如何設定呢?很簡單啦~ 你可以這樣想:
- 因為不需要登入系統,所以建議 shell 欄位給予 /sbin/nologin ;
- 因為不需要登入,所以家目錄也可以先不建立。
也就是說,其實所有的步驟與剛剛上頭提到的動作都一樣,不過,少掉了很多與家目錄有關的設定行為就是了。 底下我假設我的系統裡面有個叫做 mail 的群組 (/etc/group) ,他的 GID 是 12 (以 FC4 為例), 另外,這個使用者的帳號為 popuser ,假設 UID 為 720 ,那麼該如何建立呢?
1. 修改帳號屬性
[root@linux ~]# vi /etc/passwd
popuser:x:720:12::/home/popuser:/sbin/nologin
2. 密碼同步,並且給予密碼!
[root@linux ~]# pwconv
[root@linux ~]# passwd popuser
這樣就又 OK 了~哇!真是太簡單了傑克~....
那麼又該如何刪除這些帳號呢?啊!還是建議利用 userdel 啦~簡單~乾脆又俐落~ 如果想要暫時移除而已的話,那麼利用 passwd -l 及 passwd -u 吧! ^_^。 如果真的那麼想要手動來移除這個帳號的話,就這樣做:
- 先以 find / -user account 找出所有的帳號檔案,並將他刪除;
- 將 /etc/passwd 與 /etc/shadow 的相關資料刪除;
- 將 /etc/group 及 /etc/gshadow 相關資料刪除;
- 將 /home 底下關於該帳號的目錄刪除;
- 到 /var/spool/mail 以及 /var/spool/cron 裡面將相關的使用者檔案刪除。這樣就手動刪除啦~
![]()
一個大量建置帳號的範例
不要懷疑,很多時候,我們都可能需要大量的建置帳號的, 舉例來說,學校要幫同學建立他們的帳號,那就很可能需要啦~ 一般來說,建立帳號要進行的前製工作很多,包括要建立帳號名稱與該帳號的密碼對應表~ 這個是最討厭的啦~而且還要決定需要使用哪一個群組~呼呼~好討厭的感覺那~
目前很多網站都有提供大量建立帳號的工具,例如台南縣網中心的臥龍大師:
提供的好用的 cmpwd 程式, 不過,其實我們也可以利用簡單的 script 來幫我們達成喔!例如底下這支程式, 他的執行結果與臥龍大師提供的程式差不多啦~ 但是因為我是直接以 useradd 來新增的, 所以,即使不瞭解 UID ,也是可以適用的啦~
整支程式的特色是:
- 預設不允許使用純數字方式建立帳號;
- 可加入年級來區分帳號;
- 可設定帳號的起始號碼與帳號數量;
- 有兩種密碼建立方式,可以與帳號相同或程式自行以亂數建立密碼檔。
執行方法也簡單的要命~請自行參考的啦!不再多說~ 使用時請注意,不要在公家使用的主機上面進行測試,因為..... 這支程式會大量建立帳號嘛!^_^
#!/bin/bash
#
# 這支程式主要在幫您建立大量的帳號之用,
# 更多的使用方法請參考:
# http://linux.vbird.org/linux_basic/0410accountmanager.php#manual_amount
#
# 本程式為鳥哥自行開發,在 FC4 上使用沒有問題,
# 但不保證絕不會發生錯誤!使用時,請自行負擔風險~
#
# History:
# 2005/09/05 VBird 剛剛才寫完,使用看看先~
PATH=/sbin:/usr/sbin:/bin:/usr/bin; export PATH
accountfile="user.passwd"
# 1. 進行帳號相關的輸入先!
read -p "帳號開頭代碼 ( Input title name, ex> std )======> " username_start
read -p "帳號層級或年級 ( Input degree, ex> 1 or enter )=> " username_degree
read -p "起始號碼 ( Input start number, ex> 520 )========> " nu_start
read -p "帳號數量 ( Input amount of users, ex> 100 )=====> " nu_amount
read -p "密碼標準 1) 與帳號相同 2)亂數自訂 ==============> " pwm
if [ "$username_start" == "" ]; then
echo "沒有輸入開頭的代碼,不給你執行哩!" ; exit 1
fi
testing1=`echo $nu_amount | grep '[^0-9]' `
testing2=`echo $nu_start | grep '[^0-9]' `
if [ "$testing1" != "" ] || [ "$testing2" != "" ]; then
echo "輸入的號碼不對啦!有非為數字的內容!" ; exit 1
fi
if [ "$pwm" != "1" ]; then
pwm="2"
fi
# 2. 開始輸出帳號與密碼檔案!
[ -f "$accountfile" ] && mv $accountfile "$accountfile"`date +%Y%m%d`
nu_end=$(($nu_start+$nu_amount-1))
for (( i=$nu_start; i這支程式可以在底下連結下載:
![]()
本章習題練習
( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
- root 的 UID 與 GID 是多少?而基於這個理由,我要讓 test 這個帳號具有 root 的權限,應該怎麼作?
root 的 UID 與 GID 均為 0 ,所以要讓 test 變成 root 的權限,那麼就將 /etc/passwd 裡面, test 的 UID 與 GID 欄位變成 0 即可!
- 假設我是一個系統管理員,我有一個用戶最近不乖,所以我想暫時將他的帳號停掉, 讓他近期無法進行任何動作,等到未來他乖一點之後,我再將他的帳號啟用,請問:我可以怎麼作比較好??
由於這個帳號是暫時失效的,所以不能使用 userdel 來刪除,否則很麻煩!那麼應該如何設定呢?再回去瞧一瞧 /etc/shadow 的架構,可以知道有這幾個可使用的方法:
- 將 /etc/passwd 的 shell 欄位寫成 /sbin/nologin ,即可讓該帳號暫時無法登入主機;
- >將 /etc/shadow 內的密碼欄位,增加一個 * 號在最前面,這樣該帳號亦無法登入!
- >將 /etc/shadow 的第八個欄位關於帳號取消日期的那個,設定小於目前日期的數字,那麼他就無法登入系統了!
- 在設定密碼的時候,是否可以隨便設定呢?
最好不要隨便設定密碼!最好可以仔細的參考一下本章內容提到的部分!
- 我在使用 useradd 的時候,新增的帳號裡面的 UID, GID 還有其他相關的密碼控制,都是在哪幾個檔案裡面設定的?
在 /etc/login.defs 還有 /etc/default/useradd 裡面規定好的!
- 我希望我在設定每個帳號的時候( 使用 useradd ),預設情況中,他們的家目錄就含有一個名稱為 www 的子目錄,我應該怎麼作比較好?
由於使用 useradd 的時候,會自動以 /etc/skel 做為預設的家目錄,所以,我可以在 /etc/skel 裡面新增加一個名稱為 www 的目錄即可!
- pwconv 這個指令有什麼功能呢?
pwconf 可以讓 passwd 裡面的帳號,設定一份密碼到 /etc/shadow 當中!
- 簡單說明系統帳號與一般使用者帳號的差別?
一般而言,為了讓系統能夠順利以較小的權限運作,系統會有很多帳號, 例如 mail, bin, adm 等等。而為了確保這些帳號能夠在系統上面具有獨一無二的權限, 一般來說 Linux 都會保留一些 UID 給系統使用。在 FC4 上面,小於 500 以下的帳號 (UID) 即是所謂的 System account。
- 簡單說明,為何 FC4 建立使用者時,他會主動的幫使用者建立一個群組,而不是使用 /etc/default/useradd 的設定?
不同的 linux distributions 對於使用者 group 的建立機制並不相同。主要的機制分為:
- Public group schemes: 使用者將會直接給予一個系統指定的群組,一般來說即是 users , 可以 SuSE Server 9 為代表;
- Private group schemes: 系統會建立一個與帳號一樣的群組名稱!以 FC4 為例!
- 如何建立一個使用者名稱 alex, 他所屬群組為 alexgroup, 預計使用 csh, 他的全名為 "Alex Tsai", 且他還得要加入 users 群組當中!
groupadd alexgroup
useradd -c "Alex Tsai" -g alexgroup -G users -m alex
務必先建立群組,才能夠建立使用者喔!
- 由於種種因素,導致你的使用者家目錄以後都需要被放置到 /account 這個目錄下。 請問,我該如何作,可以讓使用 useradd 時,預設的家目錄就指向 /account ?
最簡單的方法,編輯 /etc/default/useradd ,將裡頭的 HOME=/home 改成 HOME=/account 即可。
- 我想要讓 dmtsai 這個使用者,加入 vbird1, vbird2, vbird3 這三個群組,該如何動作?
usermod -G vbird1,vbird2,vbird3 dmtsai
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/20647/showart_396889.html |
|