前言
大致上 LDAP 管理帳號整合 Mail 部份算是完成,不過接下來就是常會遇到的新增使用者的問題,雖然有 web 介面的管理軟體 (ex.phpmyadmin) 不過我希望的是能一次搞定常用的設定像建帳號時順便把該帳號加到所屬的 Mail Aliases 內,因此開始寫下面的 script 了。
請注意:以下 Script 只適合我的環境,若您取用請自行調整,恕不負損壞之責。
adduser_ldap.sh 達成如下需求:
- 建立 user LDIF 檔。
- 轉換 BIG5 LDIF 檔為 UTF-8 LDIF 檔。
- 加入 user 至 Mail Aliases 內並 Reload Aliases (加入前檢查是否有重複的使用者名稱)。
- 建立 user 家目錄 (建立前檢查是否有重複的家目錄名稱,避免覆蓋)。
- 建立 Maildir 目錄。
- 建立 user disk Quota。
- 建立 Samba 帳號及設定 Samba Password。
- 執行 slurpd One-shot 同步至 LDAP Slaver。
實作環境
- FreeBSD 6.1-STABLE
- dialog version 0.3
adduser_ldap.sh Script 內容如下
1 #!/bin/sh
2 #$Id: adduser_ldap.sh,v 1.6 2006/12/18 weithenn Exp $
3 #Add LDAP User Script
4
5 USERNAME=`mktemp /tmp/dialog.XXXXXX` || exit 1
6 PASSWORDP=`mktemp /tmp/dialog.XXXXXX` || exit 1
7 CN=`mktemp /tmp/dialog.XXXXXX` || exit 1
8 SN=`mktemp /tmp/dialog.XXXXXX` || exit 1
9 PHONE=`mktemp /tmp/dialog.XXXXXX` || exit 1
10 MOBILE=`mktemp /tmp/dialog.XXXXXX` || exit 1
11 UID=`mktemp /tmp/dialog.XXXXXX` || exit 1
12 GID=`mktemp /tmp/dialog.XXXXXX` || exit 1
13 LDAPUSER=`mktemp /tmp/dialog.XXXXXX` || exit 1
14 ALIASESUSER=`mktemp /tmp/dialog.XXXXXX` || exit 1
15 HOMEPATCH="/home/user"
16 ALIASES="/usr/local/etc/postfix/aliases"
17 TMPFILE="/tmp/dialog.aliases"
18 HOMEDIRECTORY="/root/sample"
19 MESSAGE="/root/message.txt"
20 MAIL="mail -s"
21 HELLO="致新進長官、同仁:Mail 功能介紹"
22 TITLE="建立 LDAP 使用者帳號"
23 DNBASE="dc=weithenn,dc=idv,dc=tw"
24 QUOTA="edquota -u -p coss3"
25 TODAY=`date +%Y%m%d`
26 M1="/tmp/dialog.m1"
27 M2="/tmp/dialog.m2"
28 M3="/tmp/dialog.m3"
29
30 dialog --title "$TITLE" --inputbox "請輸入使用者帳號" 8 60 "weithenn" 2>"$USERNAME"
31 dialog --title "$TITLE" --inputbox "請輸入使用者密碼" 8 60 "1qaz" 2>"$PASSWORDP"
32 dialog --title "$TITLE" --inputbox "請輸入區別-部門-姓名" 8 60 "北區-資訊部-使用者1" 2>"$CN"
33 dialog --title "$TITLE" --inputbox "請輸入使用者姓名" 8 60 "使用者1" 2>"$SN"
34 dialog --title "$TITLE" --inputbox "請輸入公司電話及分機" 8 60 "02-12345678-119" 2>"$PHONE"
35 dialog --title "$TITLE" --inputbox "請輸入手機號碼" 8 60 "0928-123-456" 2>"$MOBILE"
36 dialog --title "$TITLE" --inputbox "請輸入UID Number" 8 60 "11106" 2>"$UID"
37 dialog --title "$TITLE" --inputbox "請輸入GID Number" 8 60 "11100" 2>"$GID"
38
39 #Write User Password to nobody
40 pw usermod nobody -h 0 < "$PASSWORDP"
41 PASSWORDE=`grep nobody /etc/master.passwd | cut -d : -f 2`
42
43 #Read LDAP,aliases
44 ldapsearch -x | grep -o `cat "$USERNAME"` | head -1 > "$LDAPUSER"
45 grep -o `cat "$USERNAME"` ${ALIASES} | head -1 > "$ALIASESUSER"
46
47 #Check LDAP,HomeDirectory,Aliases
48 if `cat "$LDAPUSER"` = `cat "$USERNAME"` ; then
49 echo "【Warning】dn: uid=`cat "$USERNAME"`,ou=People... Entry exist!!" > $M1
50 else
51 echo "" > $M1
52 fi
53
54 if -d ${HOMEPATCH}/`cat "$USERNAME"` ; then
55 echo "【Warning】`cat "$USERNAME"` Home Directory exist!!" > $M2
56 else
57 echo "" > $M2
58 fi
59
60 if `cat "$ALIASESUSER"` = `cat "$USERNAME"` ; then
61 echo "【Warning】`cat "$USERNAME"` Mail Aliases exist!!" > $M3
62 else
63 echo "" > $M3
64 fi
65
66 dialog --title "$TITLE" --yesno "新增使用者【`cat "$USERNAME"`】資訊如下 \n\n帳號:`cat "$USERNAME"` \n密碼:`cat "$PASSWORDP"` \n職稱:`cat "$CN"` \n姓名:`cat "$SN"` \n分機:`cat "$PHONE"` \n手機:`cat "$MOBILE"` \nUID:`cat "$UID"` \nGID :`cat "$GID"` \n`cat "$M1"` \n`cat "$M2"` \n`cat "$M3"`" 18 60
67
68 #press yes create user ldif
69 if $? = "0" ; then
70 echo "dn: uid=`cat "$USERNAME"`,ou=People,${DNBASE}" >> user.ldif.`cat "$USERNAME"`
71 echo "uid: `cat "$USERNAME"`" >> user.ldif.`cat "$USERNAME"`
72 echo "cn: `cat "${CN}"`" >> user.ldif.`cat "$USERNAME"`
73 echo "sn: `cat "${SN}"`" >> user.ldif.`cat "$USERNAME"`
74 echo "objectClass: posixAccount" >> user.ldif.`cat "$USERNAME"`
75 echo "objectClass: top" >> user.ldif.`cat "$USERNAME"`
76 echo "objectClass: person" >> user.ldif.`cat "$USERNAME"`
77 echo "objectClass: inetOrgPerson" >> user.ldif.`cat "$USERNAME"`
78 echo "mail: `cat "$USERNAME"`@weithenn.org" >> user.ldif.`cat "$USERNAME"`
79 echo "loginShell: /bin/tcsh" >> user.ldif.`cat "$USERNAME"`
80 echo "telephoneNumber: `cat "${PHONE}"`" >> user.ldif.`cat "$USERNAME"`
81 echo "mobile: `cat "${MOBILE}"`" >> user.ldif.`cat "$USERNAME"`
82 echo "userPassword: {crypt}$PASSWORDE" >> user.ldif.`cat "$USERNAME"`
83 echo "uidNumber: `cat "${UID}"`" >> user.ldif.`cat "$USERNAME"`
84 echo "gidNumber: `cat "${GID}"`" >> user.ldif.`cat "$USERNAME"`
85 echo "homeDirectory: /home/user/`cat "$USERNAME"`" >> user.ldif.`cat "$USERNAME"`
86 #Transfer Big5 lidf to UTF-8 ldif
87 iconv -f BIG5 -t UTF-8 user.ldif.`cat "$USERNAME"` > user.ldif.`cat "$USERNAME"`.utf8
88 #ldapadd user account
89 ldapadd -x -D "cn=Manager,${DNBASE}" -W -f user.ldif.`cat "$USERNAME"`.utf8
90 #Modify Mail Aliases
91 sed -e 's/jtmail: /jtmail: '`cat "$USERNAME"`',/' ${ALIASES} > ${TMPFILE}
92 cp ${TMPFILE} ${TMPFILE}.${TODAY}
93 mv ${TMPFILE} ${ALIASES}
94 #PostAliases Mail Aliases
95 postalias ${ALIASES}
96 #Create User Home Directory,Send Mail,Setting Mail Quota
97 cp -r ${HOMEDIRECTORY} ${HOMEPATCH}/`cat "$USERNAME"`
98 chown -R `cat "$USERNAME"` ${HOMEPATCH}/`cat "$USERNAME"`
99 ${MAIL} "${HELLO}" `cat "$USERNAME"` < ${MESSAGE}
100 ${QUOTA} `cat "$USERNAME"`
101 cp /etc/master.passwd~ /etc/master.passwd
102 pwd_mkdb -p /etc/master.passwd
103 #Create Samba Account And Setting Password
104 (echo `cat "$PASSWORDP"` ; echo `cat "$PASSWORDP"`) | /usr/local/bin/smbpasswd -s -a `cat "$USERNAME"`
105 #Slurpd to FileCenter
106 /usr/local/etc/rc.d/slurpd start
107 dialog --title "$TITLE" --msgbox "Create【`cat "$USERNAME"`】Successful!! \n\nCreate Entry in dn:uid=`cat "$USERNAME"`ou=People,${DNBASE} \nCreate Home Directory And Config Mail Quota \nModify Mail Aliases And Reload Mail Aliases(postaliaes) \nCreate Samba Account And Password" 11 70
108 else
109 dialog --title "$TITLE" --msgbox "建立 【`cat "$USERNAME"`】失敗!!" 8 70
110 fi
解說 adduser_ldap.sh 內容:
- 5 ~ 28:定義參數。
- 30 ~ 37:呼叫 dialog 對話窗以便輸入 LDIF 欄位 (中文無法輸入,只能輸入英文),因此若像 CN、SN 這種中文欄位就改好預設值在執行吧。有人可以指點一下如何在 dialog 對話窗中輸入中文嗎?
- 40:為將剛才第 31 行 dialog 對話窗所輸入的密碼欄寫入至 $PASSWORDP (即密碼為明碼的暫存檔),並將密碼設定至 user account nobody。
- 41:抓取 /etc/master.passwd 內 nobody 的密碼欄位。
- 44:執行 ldapsearch 搜尋 LDAP 是否有您剛才第 30 行 dialog 對話窗中輸入的 username 存在,若存在只取第一個 usernmae 即可,並寫入 $LDAPUSER 暫存檔內。
- 45:搜尋 /usr/local/etc/postfix/aliases 內是否有您剛才第 30 行 dialog 對話窗中輸入的 username 存在,若存在只取第一個 usernmae 即可,並寫入 $ALIASESUSER 暫存檔內。
- 48 ~ 52:判斷搜尋 LDAP User 及輸入第 30 行 dialog 對話窗中輸入的 username 是否一樣,一樣則代表該使用者id已經存在於 LDAP 內,將警告訊息寫入 $M1 內。
- 54 ~ 58:判斷使用者家目錄是否存在,將警告訊息寫入 $M2 內。
- 60 ~ 64:判斷搜尋 Aliases 及輸入第 30 行 dialog 對話窗中輸入的 username 是否一樣,一樣則代表該使用者id已經存在於 Aliases 內,將警告訊息寫入 $M3 內。
- 66:跳出 dialog yes/no 對話窗,顯示剛才 30 ~ 37 行所輸入欲新增的 LDAP User 資訊,若 48 ~ 64 判斷使用者有存在則顯示警告訊息。
- 69 ~ 85:當第 66 行按下 yes 後先將剛才輸入資訊產生為 ldif 檔。
- 86:註解。
- 87:將產生的 BIG5 格式 ldif 檔轉換為 UTF-8 格式 ldif 檔。
- 88:註解。
- 89:匯入 ldif 檔至 LDAP,也就是新增 LDAP User (會跳出須輸入 LDAP Manager 密碼)。
- 90:註解。
- 91 ~ 93:我的 Aliases 開頭叫 jtmail,用意就是把 username 加入到 Aliases 內 jtmail: 的最前面並加上 , 以跟下一個 username 隔開。
- 94:註解。
- 95:Reload Aliases 讓剛才修改 Aliases 檔內容生效。
- 96:註解。
- 97 ~ 98:新增 username 個人家目錄,並設定該 username 的目錄權限。
- 99:寄 message.txt 內容給使用者(說明 Mail 使用說明)以便建立 MailDir Directory。
- 100:套用使用者 coss3 的 Disk Quota 設定至剛才新增的 username 上。
- 101 ~ 102:將 nobody 密碼欄改回預設無法登入。
- 103:註解。
- 104:建立 Samba Account 同時也把 Samba Password 寫入 (Samba 資訊會寫入 LDAP 該使用者 DN 內)。
- 105:註解。
- 104:執行 slurpd One-shot 同步至 LDAP Slaver。
- 107:當第 66 行按下 yes 後便執行 69 ~ 106 行的指令。
- 109:當第 66 行按下 no 後將不會執行任何動作並離開 dialog 對話窗。
參考