手動增加使用者 pwck

手動增加使用者

一般來說,我們不很建議大家使用手動的方式來新增使用者,爲什麼呢? 因爲使用者的建立涉及到 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 有關,因此,整個動作是這樣的:

   1. 先建立所需要的羣組 ( vi /etc/group );
   2. 將 /etc/group 與 /etc/gshadow 同步化 ( grpconv );
   3. 建立帳號的各個屬性 ( vi /etc/passwd );
   4. 將 /etc/passwd 與 /etc/shadow 同步化 ( pwconv );
   5. 建立該帳號的密碼 ( passwd accountname );
   6. 建立使用者家目錄 ( cp -a /etc/skel /home/accountname );
   7. 更改使用者家目錄的屬性 ( 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 吧! ^_^。 如果真的那麼想要手動來移除這個帳號的話,就這樣做:

   1. 先以 find / -user account 找出所有的帳號檔案,並將他刪除;
   2. 將 /etc/passwd 與 /etc/shadow 的相關資料刪除;
   3. 將 /etc/group 及 /etc/gshadow 相關資料刪除;
   4. 將 /home 底下關於該帳號的目錄刪除;
   5. 到 /var/spool/mail 以及 /var/spool/cron 裏面將相關的使用者檔案刪除。

這樣就手動刪除啦~

一個大量建置帳號的範例

不要懷疑,很多時候,我們都可能需要大量的建置帳號的, 舉例來說,學校要幫同學建立他們的帳號,那就很可能需要啦~ 一般來說,建立帳號要進行的前制工作很多,包括要建立帳號名稱與該帳號的密碼對應表~ 這個是最討厭的啦~而且還要決定需要使用哪一個羣組~呼呼~好討厭的感覺那~

目前很多網站都有提供大量建立帳號的工具,例如臺南縣網中心的臥龍大師:

      http://linux.tnc.edu.tw/techdoc/howto/howtouse_cmpwd.htm

提供的好用的 cmpwd 程式, 不過,其實我們也可以利用簡單的 script 來幫我們達成喔!例如底下這支程式, 他的執行結果與臥龍大師提供的程式差不多啦~ 但是因爲我是直接以 useradd 來新增的, 所以,即使不瞭解 UID ,也是可以適用的啦~

整支程式的特色是:

    * 預設不允許使用純數字方式建立帳號;
    * 可加入年級來區分帳號;
    * 可設定帳號的起始號碼與帳號數量;
    * 有兩種密碼建立方式,可以與帳號相同或程式自行以亂數建立密碼檔。

執行方法也簡單的要命~請自行參考的啦!不再多說~ 使用時請注意,不要在公家使用的主機上面進行測試,因爲..... 這支程式會大量建立帳號嘛!^_^

#!/bin/bash
#
# 這支程式主要在幫您建立大量的帳號之用,
# 更多的使用方法請參考:
# http://linux.vbird.org/linux_bas ... r.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<=$nu_end; i++ ))
do
        account=$username_start$username_degree$i
        if [ "$pwm" == "1" ]; then
                password="$account"
        else
                password=""
                test_nu=0
                until [ "$test_nu" == "8" ]
                do
                        temp_nu=$(($RANDOM*50/32767+30))
                        until [ "$temp_nu" != "60" ]
                        do
                                temp_nu=$(($RANDOM*50/32767+30))
                        done
                        test_nu=$(($test_nu+1))
                        temp_ch=`printf "\x$temp_nu"`
                        password=$password$temp_ch
                done
        fi
        echo "$account":"$password" | tee -a "$accountfile"
done

# 3. 開始建立帳號與密碼!
        cat "$accountfile" | cut -d':' -f1 | xargs -n 1 useradd -m
        chpasswd < "$accountfile"
        pwconv
    echo "OK!建立完成!"

這支程式可以在底下連結下載

      http://linux.vbird.org/download/index.php?action=download&amp;fileid=70
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章