#!/bin/bash ######################################################################## ## Script : ldap-adduser:.sh ## Name : LDAP にユーザーを追加します。 ## Version : 0.0.1 ## Copyright : 2019 Nomura Kei ## License : BSD-2-Clause ## Usage: ## |使用法) ldap-adduser.sh [オプション] uid ## | ## | LDAPにユーザーを追加します。 ## | /etc/passwd, /etc/shadow に uid にマッチする情報があればデフォルト値として使用されます。 ## | デフォルト値を使用しない場合は、--nodefault を指定してください。 ## | ## |uid ## | ユーザーIDを指定します。 ## | ## |[オプション] ## | --password arg 管理者パスワードを指定します。 ## | --nodefault デフォルト値 ## | --sn arg 姓を指定します。 ## | --cn arg 名前(Full Name)を指定します。 ## | --uidNumber arg UID番号を指定します。 ## | --gidNumber arg GID番号を指定します。 ## | --homeDirectory arg ホームディレクトリを指定します。 ## | --loginShell arg ログインシェルを指定します。 ## | --userPassword arg ユーザーパスワードを指定します。 ## | --shadowLastChange arg 最終パスワード変更日時を指定します。 ## | --shadowMin arg パスワード変更不能日数を指定します。 ## | --shadowMax arg パスワード変更要求までの日数を指定します。 ## | --shadowWarning arg パスワード期限満了警告日数を指定します。 ## | --shadowInactive arg アカウント無効までの日数を指定します。 ## | --shadowExpire arg アカウント期限満了の日付 ## | --shadowFlag arg 予約 ## | --mail arg メールアドレスを指定します。 ## | -h,--help 使用法を表示します。 ## | -v,--version バージョンを表示します。 ## | ## |[詳細] ## | 次のようなエントリを生成します。 ## | ## | dn: uid=<ユーザーID>,ou=User,<ドメインのDN> ## | objectClass: inetOrgPerson ## | objectClass: posixAccount ## | objectClass: shadowAccount ## | sn: <姓> ## | cn: <名> ## | uid: <ユーザーID> ## | uidNumber: <UID> ## | gidNumber: <GID> ## | gecos: <その他情報> ## | homeDirectory: <ホームディレクトリ> ## | loginShell: <ログインシェル> ## | userPassword: <(ハッシュ化された)ユーザーパスワード> ## | shadowLastChange: <パスワードの最終更新日> ## | shadowMin: <変更可能最短期間> ## | shadowMax: <未変更可能最長期間> ## | shadowWarning: <警告日> ## | shadowInactive: <インアクティブ> ## | shadowExpire: <失効日> ## | shadowFlag: <フラグ> ## | mail: <メールアドレス> ## | ## ######################################################################## SCRIPT_FILE=${0} SCRIPT_DIR=`dirname ${SCRIPT_FILE}` LIB_DIR=${SCRIPT_DIR}/../lib ######################################################################## ## ## ライブラリのロード ## [ -f "${LIB_DIR}/functions.sh" ] && . ${LIB_DIR}/bash-utils.sh [ -f "${SCRIPT_DIR}/ldap-util.sh" ] && . ${SCRIPT_DIR}/ldap-util.sh ######################################################################## ## ## デフォルト値 ## DOMAIN_DN=`getDomainDN` ROOT_DN=`getRootDN` ROOT_PW= NODEFAULT=0 P_SN= P_CN= P_UID= P_UID_NUMBER= P_GID_NUMBER= P_GECOS= P_HOME_DIRECTORY= P_LOGIN_SHELL= P_USER_PASSWORD= P_SHADOW_LAST_CHANGE= P_SHADOW_MIN= P_SHADOW_MAX= P_SHADOW_WARNING= P_SHADOW_INACTIVE= P_SHADOW_EXPIRE= P_SHADOW_FLAG= P_MAIL= ######################################################################## ## ## 関数群 ## # ====================================================================== # 指定された UID に関する情報を /etc/passwd, /etc/shadow より抽出し、 # 各変数にセットします。 # ※既に値が設定されている変数にはセットしません。 # # @param $1 uid # ====================================================================== function load_default_info() { P_UID=$1 ETC_PASSWD=/etc/passwd ETC_SHADOW=/etc/shadow [ "$P_UID_NUMBER" = "" ] && P_UID_NUMBER=` grep -e "^${P_UID}:" ${ETC_PASSWD} | awk -F ':' {'print $3'}` [ "$P_GID_NUMBER" = "" ] && P_GID_NUMBER=` grep -e "^${P_UID}:" ${ETC_PASSWD} | awk -F ':' {'print $4'}` [ "$P_GECOS" = "" ] && P_GECOS=` grep -e "^${P_UID}:" ${ETC_PASSWD} | awk -F ':' {'print $5'}` [ "$P_HOME_DIRECTORY" = "" ] && P_HOME_DIRECTORY=` grep -e "^${P_UID}:" ${ETC_PASSWD} | awk -F ':' {'print $6'}` [ "$P_LOGIN_SHELL" = "" ] && P_LOGIN_SHELL=` grep -e "^${P_UID}:" ${ETC_PASSWD} | awk -F ':' {'print $7'}` [ "$P_USER_PASSWORD" = "" ] && P_USER_PASSWORD=` grep -e "^${P_UID}:" ${ETC_SHADOW} | awk -F ':' {'print "{CRYPT}" $2'}` [ "$P_SHADOW_LAST_CHANGE" = "" ] && P_SHADOW_LAST_CHANGE=`grep -e "^${P_UID}:" ${ETC_SHADOW} | awk -F ':' {'print $3'}` [ "$P_SHADOW_MIN" = "" ] && P_SHADOW_MIN=` grep -e "^${P_UID}:" ${ETC_SHADOW} | awk -F ':' {'print $4'}` [ "$P_SHADOW_MAX" = "" ] && P_SHADOW_MAX=` grep -e "^${P_UID}:" ${ETC_SHADOW} | awk -F ':' {'print $5'}` [ "$P_SHADOW_WARNING" = "" ] && P_SHADOW_WARNING=` grep -e "^${P_UID}:" ${ETC_SHADOW} | awk -F ':' {'print $6'}` [ "$P_SHADOW_INACTIVE" = "" ] && P_SHADOW_INACTIVE=` grep -e "^${P_UID}:" ${ETC_SHADOW} | awk -F ':' {'print $7'}` [ "$P_SHADOW_EXPIRE" = "" ] && P_SHADOW_EXPIRE=` grep -e "^${P_UID}:" ${ETC_SHADOW} | awk -F ':' {'print $8'}` [ "$P_SHADOW_FLAG" = "" ] && P_SHADOW_FLAG=` grep -e "^${P_UID}:" ${ETC_SHADOW} | awk -F ':' {'print $9'}` } # ====================================================================== # 指定された属性を出力します。 # 属性値が空文字の場合は、何も出力しません。 # # @param $1 属性 # @param $2 属性値 # ====================================================================== print_attr() { if [ "$2" != "" ]; then echo "$1: $2" fi } # ====================================================================== # ユーザーを登録するための ldif 形式のデータを標準出力します。 # # @param $1 ドメイン(DN形式) # ====================================================================== mkldif_for_add_user() { DOMAIN_DN=$1 print_attr dn "uid=${P_UID},ou=User,${DOMAIN_DN}" print_attr objectClass "inetOrgPerson" print_attr objectClass "posixAccount" print_attr objectClass "shadowAccount" print_attr sn "${P_SN}" print_attr cn "${P_CN}" print_attr uid "${P_UID}" print_attr uidNumber "${P_UID_NUMBER}" print_attr gidNumber "${P_GID_NUMBER}" print_attr gecos "${P_GECOS}" print_attr homeDirectory "${P_HOME_DIRECTORY}" print_attr loginShell "${P_LOGIN_SHELL}" print_attr userPassword "${P_USER_PASSWORD}" print_attr shadowLastChange "${P_SHADOW_LAST_CHANGE}" print_attr shadowMin "${P_SHADOW_MIN}" print_attr shadowMax "${P_SHADOW_MAX}" print_attr shadowWarning "${P_SHADOW_WARNING}" print_attr shadowInactive "${P_SHADOW_INACTIVE}" print_attr shadowExpire "${P_SHADOW_EXPIRE}" print_attr shadowFlag "${P_SHADOW_FLAG}" print_attr mail "${P_MAIL}" echo "" } ######################################################################## ## ## メイン処理 ## for OPT in "$@"; do case "${OPT}" in '--passwd') ROOT_PW="$2"; shift 2 ;; '--nodefault') NODEFAULT=1; shift 1 ;; '--sn') P_SN="$2"; shift 2 ;; '--cn') P_CN="$2"; shift 2 ;; '--uidNumber') P_UID_NUMBER="$2"; shift 2 ;; '--gidNumber') P_GID_NUMBER="$2"; shift 2 ;; '--homeDirectory') P_HOME_DIRECTORY="$2"; shift 2 ;; '--loginShell') P_LOGIN_SHELL="$2"; shift 2 ;; '--userPassword') P_USER_PASSWORD="$2"; shift 2 ;; '--shadowLastChange') P_SHADOW_LAST_CHANGE="$2"; shift 2 ;; '--shadowMin') P_SHADOW_MIN="$2"; shift 2 ;; '--shadowMax') P_SHADOW_MAX="$2"; shift 2 ;; '--shadowWarning') P_SHADOW_WARNING="$2"; shift 2 ;; '--shadowInactive') P_SHADOW_INACTIVE="$2"; shift 2 ;; '--shadowExpire') P_SHADOW_EXPIRE="$2"; shift 2 ;; '--shadowFlag') P_SHADOW_FLAG="$2"; shift 2 ;; '--mail') P_LDAP_MAIL="$2"; shift 2 ;; '-h'|'--help') usage; exit 1 ;; '-v'|'--version') version; exit 1 ;; -*) usage exit 1 ;; *) if [[ ! -z "$1" ]] && [[ ! "$1" =~ ^-+ ]]; then P_UID=("$1") shift 1 fi ;; esac done # デフォルト値ロード if [ ${NODEFAULT} -eq 0 ]; then load_default_info ${P_UID} fi # ---------------------------------------------------------------------- # 引数整理 # ---------------------------------------------------------------------- [ "${ROOT_PW}" = "" ] && read -s -p "Root Password > " ROOT_PW; echo "" [ "${P_SN}" = "" ] && read -p "SN (Surname) > " P_SN [ "${P_CN}" = "" ] && read -p "CN (Common Name) > " P_CN [ "${P_UID_NUMBER}" = "" ] && read -p "UID Number > " P_UID_NUMBER [ "${P_GID_NUMBER}" = "" ] && read -p "GID Number > " P_GID_NUMBER [ "${P_HOME_DIRECTORY}" = "" ] && read -p "HOME Directory > " P_HOME_DIRECTORY [ "${P_MAIL}" = "" ] && read -p "Mail > " P_MAIL if [ "${P_USER_PASSWORD}" = "" ]; then confirm_password "User Password > " "Re-type Password > " if [ $? -ne 0 ]; then echo "password verification error" exit 1 fi P_USER_PASSWORD=`slappasswd -h '{CRYPT}' -c '$6$' -s ${CONFIRM_PASSWORD}` fi # ---------------------------------------------------------------------- # 一時ファイルの生成 # ---------------------------------------------------------------------- TMP_LDIF=$(mktemp /tmp/ldap-adduser.XXXXXXXXXXXX.ldif) trap 'rm -f /tmp/ldap-adduser.*.ldif; exit 1' 1 2 3 15 # ---------------------------------------------------------------------- # ユーザー登録 # ---------------------------------------------------------------------- echo "### --- Add User (uid=${P_UID}) ---" mkldif_for_add_user ${DOMAIN_DN} > ${TMP_LDIF} ldapadd -D ${ROOT_DN} -f ${TMP_LDIF} -w ${ROOT_PW} # ---------------------------------------------------------------------- # 結果出力 # ---------------------------------------------------------------------- USER_DN="ou=User,${DOMAIN_DN}" ldapsearch -D ${ROOT_DN} -b ${USER_DN} -w ${ROOT_PW} "(uid=${P_UID})" rm -f /tmp/ldap-*.*.ldif