酷!學園

技術討論區 => LDAP 討論區 => 主題作者是: Niko 於 2012-09-30 00:00

主題: 04.LDAP+Samba PDC 筆記(10/4 create_user,在三樓)
作者: Niko2012-09-30 00:00
總算完成了,這份筆記能夠成功生產下來也靠了netman大大與三子大大  ;D
先感謝這兩位大大,謝謝!!

在這兒也先祝各位中秋節快樂!! :D

小弟原先的想法是ldap1用NFS去掛"home" server,但是實作後發現在windows登入時會發生問題,所以,為了簡單點,samba PDC就直接做在"home" server那台上面。

LDAP使用原先的架構(請參考http://phorum.study-area.org/index.php/topic,67535.0.html (http://phorum.study-area.org/index.php/topic,67535.0.html)),其中"home" server小弟的OS更新為CentOS6.3_x64,其餘設定都沒變。

當初建立LDAP時並沒有把samba包含在內,所以我們首先要做的就是加入samba.schema,使LDAP支援"sambaSamAccount",另外LDAP server也加入到LDAP client中(加入方法請參考http://phorum.study-area.org/index.php/topic,67626.0.html (http://phorum.study-area.org/index.php/topic,67626.0.html))。
要特別注意,如果LDAP有做複製功能(Replication)的話,小弟建議是用MirrorMode的方式,這樣萬一"ldap1"掛掉了,我們還是可以用"ldap2"來做修改(設定方法請參考http://phorum.study-area.org/index.php/topic,67566.0.html (http://phorum.study-area.org/index.php/topic,67566.0.html))

LDAP 支援 samba 設定 (ldap1與ldap2相同設定) :
在目前版本中(2.4.23-26.el6),/etc/openldap/schema預設沒有samba.schema,必須要先安裝samba才可以
代碼: [選擇]
[root@ldap1 ~]# yum  install  -y  samba
安裝完後 /etc/openldap/schema應該就可以看到 samba.schema,如果沒有的話...
代碼: [選擇]
[root@ldap1 ~]# cp  /usr/share/doc/samba-*/LDAP/samba.schema   /etc/openldap/schema/

接下來修改slapd.conf
代碼: [選擇]
[root@ldap1 ~]# vim  /etc/openldap/slapd.conf===============================================================================
##新增紅色字體##
include         /etc/openldap/schema/samba.schema

access to attrs=userPassword,sambaLMPassword,sambaNTPassword
        by self write
        by anonymous auth
        by * none

### database definitions ###

index   sambaSID,sambaSIDList,sambaGroupType    eq,pres
===============================================================================

修改完後
代碼: [選擇]
[root@ldap1 ~]# cd  /etc/openldap/
[root@ldap1 openldap]# rm  -rf  slapd.d/*
[root@ldap1 openldap]# slaptest  -f  slapd.conf  -F  slapd.d
[root@ldap1 openldap]# chown  -R  ldap:ldap  slapd.d
[root@ldap1 openldap]# /etc/init.d/slapd restart

使用者的資料先前我沒有設定samba屬性 (attribute),為了節省麻煩,可以把先前的LDAP資料匯出,用slapcat  -l 或是用phpldapadmin的匯出功能;小弟是使用phpldapadmin的export,除了簡單好用之外,匯出的ldif檔也不會因為有中文關係而顯示亂碼。
匯出後,偷懶一點就直接使用phpldapadmin把People底下的NIKO和PING這兩個user直接刪除。

到此LDAP就算暫時完成了,但是請記得,因為兩台LDAP(ldap1、ldap2)現在是使用MirrorMode,所以雙方的資料要確保相同,避免稍後增加資料時產生雙方的資料錯誤無法同步。

Samba PDC (Primary Domain Controller) 設定
smabPDC server = hostname:home,ip:192.168.1.4

小叮嚀:要設定PDC之前必須先把server也加入到LDAP client中才可以喔!

安裝samba(版本為3.5.10-125) 與 smbldap-tools(版本為0.9.6-3)
##smbldap-tools需先安裝EPEL來源##
代碼: [選擇]
[root@home ~]# yum  -y  install  samba  smbldap-tools

設定sambaPDC
先備份原本的smb.conf
代碼: [選擇]
[root@home ~]# mv  /etc/samba/smb.conf  /etc/samba/smb.conf.bak
Copy smbldap-tools裡的smb.conf到 /etc/samba中
代碼: [選擇]
[root@home ~]# cp  /usr/share/doc/smbldap-tools-*/smb.conf  /etc/samba/smb.conf
設定smb.conf,這裡有不清楚的地方可以參考鳥哥的說明http://linux.vbird.org/ (http://linux.vbird.org/)
代碼: [選擇]
[root@home ~]# vim  /etc/samba/smb.conf ===============================================================================
##修改紅字部份##
[global]

workgroup = LDAP         
         
netbios name = home      

#min passwd length = 3      #密碼最小長度
         
ldap passwd sync = yes      #同步LDAP、NT、LM的密碼

Dos charset = CP950         

Unix charset = UTF-8            

logon home = \\%N\%U         

logon path = \\%N\%U\profiles      

passdb backend = ldapsam:"ldap://ldap1.split.com.tw/   ldap://ldap2.split.com.tw/"

ldap admin dn = cn=admin,dc=split,dc=com,dc=tw

ldap suffix = dc=split,dc=com,dc=tw            

ldap group suffix = ou=Groups,ou=Samba PDC      

ldap user suffix = ou=Users,ou=Samba PDC      
#smbldap-tools會增加許多與PDC有關的user和group,小弟是統一放進ou=Samba PDC,dc=split,dc=com,dc=tw裡面,LDAP要先建立好相對應的上一層,ou=Samba PDC。

delete group script = /usr/sbin/smbldap-groupdel "%g"     #約60行,取消註解

##約64行空白處新增##
ldap ssl = no               
   
smb ports = 139         

load printers = No   
#由於沒有要做印表機伺服器,以下的設定都先註解起來,經測試後如沒有註解掉當windows登入後會有問題

#約87行新增
[homes]
     comment   = Home Directories
     path          = /home/%U
     browsable = no
     read only   = no
     valid users = %S

[netlogon]
     path            = /home/sambPDC/netlogon/     #等等要自行建立資料夾
     browseable = No
     read only     = yes
     guest ok      = yes
#netlogon資料夾與前面的 logon script 有關,該程式放置在這裡
#以下其它設定可註解或刪除…
===============================================================================

設定完成後,檢查設定是否有錯誤及開啟PDC功能。
代碼: [選擇]
[root@home ~]# testparm Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Processing section "[homes]"
Processing section "[netlogon]"
Loaded services file OK.
Server role: ROLE_DOMAIN_PDC
Press enter to see a dump of your service definitions
#以下省略#

建立netlogon目錄與logon.bat
代碼: [選擇]
[root@home ~]# mkdir  -p  /home/sambaPDC/netlogon
[root@home ~]# cd  /home/sambaPDC/netlogon
[root@ home netlogon]# vim  logon.bat
net time \\home /set /yes         #與samba伺服器對時
net use H: \\home\home         #連到自已的家目錄

將logon.bat轉成DOS的斷行格式
代碼: [選擇]
[root@ home netlogon]# yum  -y  install  unix2dos
[root@ home netlogon]# unix2dos  logon.bat
[root@ home netlogon]# cat  -A  logon.bat
net time \\home /set /yes^M$   
net use H: \\home\home^M$

為niko製作profiles目錄
代碼: [選擇]
[root@ home netlogon]# cd  /home/niko
[root@ home niko]# mkdir  proflies
[root@ home niko]# chown  niko:d10  proflies
[root@ home niko]# chmod  755  proflies

啟動samba與smbldap-tools設定
代碼: [選擇]
[root@ home ~]# /etc/init.d/nmb  restart
[root@ home ~]# /etc/init.d/smb  restart
[root@ home ~]# chkconfig  nmb  on
[root@ home ~]# chkconfig  smb  on

加入LDAP管理員的密碼至samba
代碼: [選擇]
[root@ home ~]# smbpasswd  -W Setting stored password for "cn=admin,dc=split,dc=com,dc=tw" in
secrets.tdb
New SMB password:               #輸入LDAP admin的密碼
Retype new SMB password:

查看SID
代碼: [選擇]
[root@ home ~]# net  rpc  getsid Storing SID S-1-5-21-861616483-343575355-114807000 for Domain LDAP in secrets.tdb

設定smbldap-tools script configuration
代碼: [選擇]
[root@ home ~]# perl  /usr/share/doc/smbldap-tools-*/configure.pl
以下內容非常的多,幸好每個要設定的項目都已經有解釋了,所以小弟也就不囉嗦... :)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--
       smbldap-tools script configuration
       -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Before starting, check
 . if your samba controller is up and running.
 . if the domain SID is defined (you can get it with the 'net getlocalsid')

 . you can leave the configuration using the Ctrl-c key combination
. empty value can be set with the "." character
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Looking for configuration files...

Samba Configuration File Path [/etc/samba/smb.conf] >   #Enter

The default directory in which the smbldap configuration files are stored is shown.
If you need to change this, enter the full directory path, then press enter to continue.
Smbldap-tools Configuration Directory Path [/etc/smbldap-tools] >  #Enter
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Let's start configuring the smbldap-tools scripts ...

. workgroup name: name of the domain Samba acts as a PDC for
  workgroup name [LDAP] >      #Enter
. netbios name: netbios name of the samba controller
  netbios name [home] >      #Enter
. logon drive: local path to which the home directory will be connected (for NT Workstations). Ex: 'H:'
  logon drive [H:] >            #Enter
. logon home: home directory location (for Win95/98 or NT Workstation).
  (use %U as username) Ex:'\\home\%U'
  logon home (press the "." character if you don't want homeDirectory) [\\%N\%U] >           #Enter
. logon path: directory where roaming profiles are stored. Ex:'\\home\profiles\%U'
  logon path (press the "." character if you don't want roaming profiles) [\\%N\%U\profiles] >   #Enter
. home directory prefix (use %U as username) [/home/%U] >   #Enter
. default users' homeDirectory mode [700] >       #Enter
. default user netlogon script (use %U as username) [logon.bat] >  #Enter
  default password validation time (time in days) [45] > 99999 
. ldap suffix [dc=split,dc=com,dc=tw] >       #Enter
. ldap group suffix [ou=Groups,ou=Samba PDC] >       #Enter
. ldap user suffix [ou=Users,ou=Samba PDC] >       #Enter
. ldap machine suffix [ou=Computers] >       #Enter
. Idmap suffix [ou=Idmap] >       #Enter
. sambaUnixIdPooldn: object where you want to store the next uidNumber
  and gidNumber available for new users and groups
  sambaUnixIdPooldn object (relative to ${suffix}) [sambaDomainName=LDAP] >      #Enter
. ldap master server: IP address or DNS name of the master (writable) ldap server
  ldap master server [ldap1.split.com.tw] >      #Enter
. ldap master port [389] >   #Enter
. ldap master bind dn [cn=admin,dc=split,dc=com,dc=tw] >     #Enter
. ldap master bind password [] >          #輸入LDAP admin的密碼
. ldap slave server: IP address or DNS name of the slave ldap server: can also be the master one
  ldap slave server [ldap1.split.com.tw] > ldap2.split.com.tw
. ldap slave port [389] >       #Enter
. ldap slave bind dn [cn=admin,dc=split,dc=com,dc=tw] >       #Enter
. ldap slave bind password [] >          #輸入LDAP admin的密碼(ldap2)
. ldap tls support (1/0)
主題: Re: 04.LDAP+Samba PDC 筆記
作者: netman2012-10-01 21:39
讚!

可以開講了沒啊?  ^_^
主題: Re: 04.LDAP+Samba PDC 筆記
作者: Niko2012-10-02 10:45
讚!

可以開講了沒啊?  ^_^

netman大大不是已經帶給我們一部非常精采的影片了嗎?! 哈哈~~~
雖然已經能夠架設一台簡略可運作的LDAP server,但是總覺得基礎還不夠扎實,還有非常多的東西要學
小弟分享自己的筆記主要目的還是能夠讓各位大大們看看是否哪裡觀念有問題能夠鞭一下小弟... :P
還有還有,目前一直在想的問題就是,安全、可靠、以及備援...
主題: Re: 04.LDAP+Samba PDC 筆記
作者: Niko2012-10-04 22:06
花了幾天時間,終於把新增使用者的script給寫好了。小弟容易眼花又手殘,所以對於新增資料的部份做了很多的判斷,導致越寫越多... :'(
其實有一點不太想PO出來,因為寫的太爛了,大大們看了應該很想笑,不過這部份也在當初決定要寫份LDAP的筆記時就決定好了,所以....還是能懇請大大們給予指導,看看哪裡可以再寫的精簡一點,雖然這份script爛歸爛,可總算還是能正常運作,讓小弟欣慰點.... ;D

主要架構還是一樣,不過有修改GROUP的gidNumber部份,d10=1001,d20=1002,d30=1003
使用者的uidNumber小弟想從1101開始,如user1=1101、user2=1102 等

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  1   #!/bin/bash
  2   if [ $UID -ne 0 ]                                       #line1~6,雞肋.... :P
  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 show
111
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,就會進入edit
149  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裡會看不到,純粹爽度問題... :P
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 password
230
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,然後用這行指令去建mailbox
240          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....
主題: Re: 04.LDAP+Samba PDC 筆記(10/4 create_user,在三樓)
作者: Niko2013-07-26 14:25
先前修改好的V2版,稍微整理過也修改了一小部份,只不過一直沒時間放上來...獻醜了  :P
p.s : 把建立home和mail的部份先拿掉了

--------------------------------------------------------------------------------------------------------------------------------------------------------------
#!/bin/bash

chkldap ()
{
CHKLDAP=$(ldapsearch -x -b "dc=split,dc=com,dc=tw" > /dev/null 2>&1  ; echo $?)
if [ $CHKLDAP != "0" ]
then
        echo "無法連接LDAP SERVER"
        sleep 1
        exit 0
fi
}

userid ()
{
read -p "使用者名稱(ex:niko_wang) : " USERID
while [ -z $USERID ]
do
       read -p "不可為空白,請重新輸入 : " USERID
done
}

chkid ()
{
CHKUID=$(ldapsearch -x -b "dc=split,dc=com,dc=tw" uid=$USERID 2> /dev/null | grep uid: | cut -d " " -f2)
while [ "$USERID" == "$CHKUID" ]
do
        echo "帳號("$USERID")已存在,請重新輸入"
        userid
done
ENNAME=$(echo $USERID | tr "[a-z]" "[A-Z]")
}

firname ()
{
read -p "中文姓氏 : " FIRNAME
while [ -z $FIRNAME ]
do
       read -p "不可為空白,請重新輸入 : " FIRNAME
done
}

secname ()
{
read -p "中文名字 : " SECNAME
while [ -z $SECNAME ]
do
       read -p "不可為空白,請重新輸入 : " SECNAME
done
}

group ()
{
read -p "請選擇主群組 (1)D10 (2)D20 (3)D30 : " GROUP
until [ "$GROUP" == "1" ] || [ "$GROUP" == "2" ] || [ "$GROUP" == "3" ]
do
        echo "輸入錯誤,找不到群組編號"
        read -p "請選擇主群組 (1)D10 (2)D20 (3)D30 : " GROUP
done
case  $GROUP in
        "1")
                GROUP="d10"
                GROUPNUM="1001"
                ;;
        "2")
                GROUP="d20"
                GROUPNUM="1002"
                ;;
        "3")
                GROUP="d30"
                GROUPNUM="1003"
                ;;
esac
}

show()
{
echo "*************************"
echo "  使用者資料"
echo "*************************"
echo "使用者帳號 : ""$USERID"
echo "英文名字   : ""$ENNAME"
echo "中文姓氏   : ""$FIRNAME"
echo "中文名字   : ""$SECNAME"
echo "群組名稱   : ""$GROUP"
echo "*************************"
read -p "資料是否正確(y/n) : " YN
echo " "
until [ "$YN" == "y" ] || [ "$YN" == "Y" ] || [ "$YN" == "n" ] || [ "$YN" == "N" ]
do
        read -p "請輸入y(Y)或n(N) : " YN

done

while [ "$YN" == "n" ] || [ "$YN" == "N" ]
do
       edit
done
}

edit()
{
echo "(1)使用者帳號 : ""$USERID"
echo "(2)中文姓氏   : ""$FIRNAME"
echo "(3)中文名字   : ""$SECNAME"
echo "(4)群組名稱   : ""$GROUP"
read -p "請選擇要修改的編號 : " EDITNUM
until [ "$EDITNUM" == "1" ] || [ "$EDITNUM" == "2" ] || [ "$EDITNUM" == "3" ] || [ "$EDITNUM" == "4" ]
do
        read -p "輸入錯誤,請輸入編號(1~4) : " EDITNUM
done
case $EDITNUM in
        "1")
                userid
                chkid
                show
                ;;
        "2")
                firname
                show
                ;;
        "3")
                secname
                show
                ;;
        "4")
                group
                show
                ;;
esac
}

chkuid()
{
UIDSEARCH=$(ldapsearch -x -b "dc=split,dc=com,dc=tw" uidNumber=* | grep uidNumber: | grep 11.* | cut -d " " -f2 | sort -n | tail -1)
if [ -z $UIDSEARCH ]
then
        UIDSEARCH="1100"
fi
UIDNUM=$(expr $UIDSEARCH + 1)
}

chksid()
{
SID=$(net getlocalsid 2> /dev/null | awk '{print $6}')
}

ldif()
{
cat > /tmp/$USERID.ldif << EOF
dn: cn=$ENNAME $FIRNAME$SECNAME,ou=People,dc=split,dc=com,dc=tw
objectClass: posixAccount
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: shadowAccount
objectClass: sambaSamAccount
cn: $ENNAME $FIRNAME$SECNAME
uid: $USERID
sn: $FIRNAME
uidNumber: $UIDNUM
givenName: $SECNAME
gidNumber: $GROUPNUM
shadowLastChange: 15609
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
homeDirectory: /home/$USERID
mail: $USERID@split.com.tw
sambaAcctFlags: [U ]
sambasid: $SID-$UIDNUM
sambaPrimaryGroupSID: $SID-513
EOF
}

adduser ()
{
echo " "
echo "***************************************************************************"
echo "                        "$USERID"的LDIF檔資訊"
echo "***************************************************************************"
        cat /tmp/$USERID.ldif
echo "***************************************************************************"
read -p "是否要開始進行匯入? (y)匯入 (n)取消並刪除檔案 : " YN2
echo " "

until [ "$YN2" == y ] || [ "$YN2" == Y ] || [ "$YN2" == n ] || [ "$YN2" == N ]
do
        read -p "請輸入y(Y)或n(N) : " YN2

done

if [ "$YN2" == "y" ] || [ "$YN2" == "Y" ]
then
        ldapmodify -D "cn=admin,dc=split,dc=com,dc=tw" -W -x -v -a -f /tmp/$USERID.ldif
        ECHO=$(echo $?)
        while [ "$ECHO" == "49" ] || [ "$ECHO" == "53" ]
        do
                echo "密碼輸入錯誤"
                ldapmodify -D "cn=admin,dc=split,dc=com,dc=tw" -W -x -v -a -f /tmp/$USERID.ldif
                ECHO=$(echo $?)
        done

cat > /tmp/$GROUP.ldif << EOF
dn: cn=$GROUP,ou=Group,dc=split,dc=com,dc=tw
changetype: modify
add: memberUid
memberUid: $USERID
EOF
        echo " "
        echo "新增至$GROUP的memberUid屬性中,請再次輸入LDAP密碼"
        ldapmodify -D "cn=admin,dc=split,dc=com,dc=tw" -W -x -v -f /tmp/$GROUP.ldif
        ECHO2=$(echo $?)
        while [ "$ECHO2" == "49" ] || [ "$ECHO2" == "53" ]
        do
                echo "密碼輸入錯誤"
                ldapmodify -D "cn=admin,dc=split,dc=com,dc=tw" -W -x -v -f /tmp/$GROUP.ldif
                ECHO2=$(echo $?)
        done

        smbldap-passwd $USERID
        ECHO3=$(echo $?)
        while [ "$ECHO3" == "255" ]
        do
                echo "密碼不可是空白"
                smbldap-passwd $USERID
                ECHO3=$(echo $?)
        done
        echo " "
        echo "\"$USERID\" 匯入完成"
        echo " "
        #cp -r /etc/skel /home/$USERID
        #chown -R $USERID:$GROUP /home/$USERID
        #chmod 700 /home/$USERID
        #echo "\"$USERID\" 家目錄已建立"
        #echo " "
        #ssh -f mail "touch /var/spool/mail/$USERID ; chown $USERID:mail /var/spool/mail/$USERID ; chmod 660 /var/spool/mail/$USERID"
        #echo "\"$USERID\" 信箱已建立"
        #echo " "
        if [ ! -d "/var/ldif_bak" ]
        then
                mkdir /var/ldif_bak
        fi
        mv /tmp/$USERID.ldif /var/ldif_bak
        rm -rf /tmp/$GROUP.ldif
        echo "\"$USERID\" 建立完成"
        echo " "
        echo "\"$USERID\"的ldif備份檔存放位置為 : /var/ldif_bak/$USERID"
        echo " "
else
        rm -rf /tmp/$USERID.ldif
        echo "/tmp/$USERID.ldif 已刪除,如要建立使用者請重新執行"$0""
        echo " "
fi
}

## main ##
if [ $UID -ne 0 ]
then
        echo "請使用root身份執行"
        sleep 1
        exit 0
fi

        chkldap
        userid
        chkid
        firname
        secname
        group
        show
        chkuid
        chksid
        ldif
        adduser
--------------------------------------------------------------------------------------------------------------------------------------------------------------
主題: Re: 04.LDAP+Samba PDC 筆記(10/4 create_user,在三樓)
作者: netman2013-07-26 22:42
哇~辛苦了!感謝分享~~!  ^_^