花了幾天時間,終於把新增使用者的script給寫好了。小弟容易眼花又手殘,所以對於新增資料的部份做了很多的判斷,導致越寫越多... :'(
其實有一點不太想PO出來,因為寫的太爛了,大大們看了應該很想笑,不過這部份也在當初決定要寫份LDAP的筆記時就決定好了,所以....還是能懇請大大們給予指導,看看哪裡可以再寫的精簡一點,雖然這份script爛歸爛,可總算還是能正常運作,讓小弟欣慰點....

主要架構還是一樣,不過有修改GROUP的gidNumber部份,d10=1001,d20=1002,d30=1003
使用者的uidNumber小弟想從1101開始,如user1=1101、user2=1102 等
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 #!/bin/bash
2 if [ $UID -ne 0 ]
#line1~6,雞肋.... 
3 then
#只是在判斷是不是root 4 echo "請使用root身份執行"
5 exit 0
6 fi
7
8 userid ()
9 {
10 read -p "使用者名稱(ex:niko_wang) : " USERID
11 while [ -z $USERID ]
12 do
13 read -p "不可為空白,請重新輸入 : " USERID
14 done
15
16 CHKUID=$(ldapsearch -x -h ldap1 -b "dc=split,dc=com,dc=tw" uid=$USERID | grep uid: | cut -d " " -f2)
17 }
18
19 userid
#function userid 主要是在判斷不可以輸入空白,"$CHKUID"則是去找輸入的名字裡有沒有在LDAP中 20
21 chkid ()
22 {
23 while [ "$USERID" == "$CHKUID" ]
24 do
25 echo "帳號("$USERID")已存在,請重新輸入"
26 userid
27 done
28 ENNAME=$(echo $USERID | tr "[a-z]" "[A-Z]")
29 }
30
31 chkid
#function chkid 用來檢查有沒有重覆,用 "$USERID" == "$CHKUID"來做判斷 32
#如果一直手殘輸入空白或已經有帳號存在了,就會一直卡在這 33 UIDSEARCH=$(ldapsearch -x -h ldap1 -b "dc=split,dc=com,dc=tw" uidNumber=* | grep uidNumber: | grep 11.* | cut -d " " -f2 | sort -n | tail -1)
34
35 if [ -z $UIDSEARCH ]
36 then
37 UIDSEARCH="1100"
38 fi
39
40 UIDNUM=$(expr $UIDSEARCH + 1)
#line 33~40,先去抓uidNumber的最後一個數字,如果沒有,預設就是1100然後加1,一直累加下去 41
42 firname ()
43 {
44 read -p "中文姓氏 : " FIRNAME
45 while [ -z $FIRNAME ]
46 do
47 read -p "不可為空白,請重新輸入 : " FIRNAME
48 done
49 }
50
51 firname
#執行function firname 52
53 secname ()
54 {
55 read -p "中文名字 : " SECNAME
56 while [ -z $SECNAME ]
57 do
58 read -p "不可為空白,請重新輸入 : " SECNAME
59 done
60 }
61
62 secname
#執行function secname 63
64 group ()
65 {
66 read -p "請選擇主群組 (1)D10 (2)D20 (3)D30 : " GROUP
67 until [ "$GROUP" == "1" ] || [ "$GROUP" == "2" ] || [ "$GROUP" == "3" ]
68 do
69 echo "輸入錯誤,找不到群組編號"
70 read -p "請選擇主群組 (1)D10 (2)D20 (3)D30 : " GROUP
71 done
#line 67~71,判斷是否輸入1、2、3,不是的話就重新輸入 72 case $GROUP in
73 "1")
74 GROUP="d10"
75 GROUPNUM="1001"
76 ;;
77 "2")
78 GROUP="d20"
79 GROUPNUM="1002"
80 ;;
81 "3")
82 GROUP="d30"
83 GROUPNUM="1003"
84 ;;
85 esac
86 }
87
88 group
#執行function group 89
90 show()
91 {
92 echo "*************************"
93 echo " 使用者資料"
94 echo "*************************"
95 echo "使用者帳號 : ""$USERID"
96 echo "英文名字 : ""$ENNAME"
97 echo "中文姓氏 : ""$FIRNAME"
98 echo "中文名字 : ""$SECNAME"
99 echo "群組名稱 : ""$GROUP"
100 echo "*************************"
101 read -p "資料是否正確(y/n) : " YN
102 echo " "
103 until [ "$YN" == "y" ] || [ "$YN" == "Y" ] || [ "$YN" == "n" ] || [ "$YN" == "N" ]
104 do
105 read -p "請輸入y(Y)或n(N) : " YN
106
107 done
108 }
109
110 show
#執行function show111
112 edit()
113 {
114 echo "(1)使用者帳號 : ""$USERID"
115 echo "(2)中文姓氏 : ""$FIRNAME"
116 echo "(3)中文名字 : ""$SECNAME"
117 echo "(4)群組名稱 : ""$GROUP"
118 read -p "請選擇要修改的編號 : " EDITNUM
119 until [ "$EDITNUM" == "1" ] || [ "$EDITNUM" == "2" ] || [ "$EDITNUM" == "3" ] || [ "$EDITNUM" == "4" ]
120 do
121 read -p "輸入錯誤,請輸入編號(1~4) : " EDITNUM
122 done
123 case $EDITNUM in
124 "1")
125 userid
126 chkid
127 show
128 ;;
129 "2")
130 firname
131 show
132 ;;
133 "3")
134 secname
135 show
136 ;;
137 "4")
138 group
139 show
140 ;;
141 esac
142 }
143
#function edit主要用意是如發現先前的資料有錯誤,就可以利用它來做之前的修改144 while [ "$YN" == "n" ] || [ "$YN" == "N" ]
145 do
146 edit
147 done
148
#判斷資料是否正確,如果一直輸入n/N,就會進入edit149 ldif()
150 {
151 cat > /tmp/$USERID.ldif << EOF
152 dn: cn=$ENNAME $FIRNAME$SECNAME,ou=People,dc=split,dc=com,dc=tw
153 objectClass: posixAccount
154 objectClass: top
155 objectClass: person
156 objectClass: inetOrgPerson
157 objectClass: shadowAccount
158 objectClass: sambaSamAccount
159 cn: $ENNAME $FIRNAME$SECNAME
160 uid: $USERID
161 sn: $FIRNAME
162 uidNumber: $UIDNUM
163 givenName: $SECNAME
164 gidNumber: $GROUPNUM
165 shadowLastChange: 15609
166 shadowMax: 99999
167 shadowWarning: 7
168 loginShell: /bin/bash
169 homeDirectory: /home/$USERID
170 mail: $USERID@split.com.tw
171 sambaAcctFlags: [U ]
172 sambasid: S-1-5-21-861616483-343575355-114807000-$UIDNUM
173 sambaPrimaryGroupSID: S-1-5-21-861616483-343575355-114807000-513
174 EOF
175 }
176
177 ldif
#先寫好一個ldif檔,暫存在/tmp下178
179 echo " "
180 echo "***************************************************************************"
181 echo " "$USERID"的LDIF檔資訊"
182 echo "***************************************************************************"
183 cat /tmp/$USERID.ldif
184 echo "***************************************************************************"
185 read -p "是否要開始進行匯入? (y)匯入 (n)取消並刪除檔案 : " YN2
186 echo " "
187
188 until [ "$YN2" == y ] || [ "$YN2" == Y ] || [ "$YN2" == n ] || [ "$YN2" == N ]
189 do
190 read -p "請輸入y(Y)或n(N) : " YN2
#檢查有無輸入錯誤191
192 done
193
194 if [ "$YN2" == "y" ] || [ "$YN2" == "Y" ]
195 then
196 ldapmodify -h ldap1 -D "cn=admin,dc=split,dc=com,dc=tw" -W -x -v -a -f /tmp/$USERID.ldif
197 ECHO=$(echo $?)
198 while [ "$ECHO" == "49" ] || [ "$ECHO" == "53" ]
#error:49代表的是密碼錯誤,error:53則是手殘忘了打密碼 ="=199 do
200 echo "密碼輸入錯誤"
201 ldapmodify -h ldap1 -D "cn=admin,dc=split,dc=com,dc=tw" -W -x -v -a -f /tmp/$USERID.ldif
202 ECHO=$(echo $?)
203 done
204
205 cat > /tmp/$GROUP.ldif << EOF
206 dn: cn=$GROUP,ou=Group,dc=split,dc=com,dc=tw
207 changetype: modify
208 add:
209 memberUid: $USERID
210 EOF
#line 205~210其實可不寫,雖然不影響group,但是不去修改memberUid的話在phpldapadmin裡會看不到,純粹爽度問題... 
211 echo " "
212 echo "新增至$GROUP的memberUid屬性中,請再次輸入LDAP密碼"
213 ldapmodify -h ldap1 -D "cn=admin,dc=split,dc=com,dc=tw" -W -x -v -f /tmp/$GROUP.ldif
214 ECHO2=$(echo $?)
215 while [ "$ECHO2" == "49" ] || [ "$ECHO2" == "53" ] #同上
216 do
217 echo "密碼輸入錯誤"
218 ldapmodify -h ldap1 -D "cn=admin,dc=split,dc=com,dc=tw" -W -x -v -f /tmp/$GROUP.ldif
219 ECHO2=$(echo $?)
220 done
221
222 smbldap-passwd $USERID
223 ECHO3=$(echo $?)
224 while [ "$ECHO3" == "255" ]
#error:255, 空白225 do
226 echo "密碼不可是空白"
227 smbldap-passwd $USERID
228 ECHO3=$(echo $?)
229 done
#line 222~229,建立user password230
231 echo " "
232 echo "\"$USERID\" 匯入完成"
233 echo " "
234 cp -r /etc/skel /home/$USERID
235 chown -R $USERID:$GROUP /home/$USERID
236 chmod 700 /home/$USERID
237 echo "\"$USERID\" 家目錄已建立"
238 echo " "
239 ssh -f mail "touch /var/spool/mail/$USERID ; chown $USERID:mail /var/spool/mail/$USERID ; chmod 6 60 /var/spool/mail/$USERID"
#先在mail server上建立好ssh-keygen,然後用這行指令去建mailbox240 echo "\"$USERID\" 信箱已建立"
241 echo " "
242 if [ ! -d "/var/ldif_bak" ]
243 then
244 mkdir /var/ldif_bak
245 fi
#line 242~245,建立ldif檔備份目錄,line 246 把檔丟進去246 mv /tmp/$USERID.ldif /var/ldif_bak ; rm -rf /tmp/$GROUP.ldif
247 echo "\"$USERID\" 建立完成"
248 echo " "
249 echo "\"$USERID\"的ldif備份檔存放位置為 : /var/ldif_bak/$USERID"
250 echo " "
251 else
252 rm -rf /tmp/$USERID.ldif
253 echo " "
254 echo "/tmp/$USERID.ldif 已刪除,如要建立使用者請重新執行script"
255 echo " "
256 fi
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上,就是小弟以自己的架構所寫的新增使用者script....