From 60978852694966ee530a332c8e47e7a977c13139 Mon Sep 17 00:00:00 2001 From: asmeron Date: Sat, 27 Apr 2024 16:39:51 +0600 Subject: [PATCH] Fix accounts and any bugs --- ublinux/functions | 22 +++--- ublinux/rc.halt.pre/25-accounts-sync | 6 +- ublinux/rc.preinit.d/30-network-hostname | 10 +-- ublinux/rc.preinit.d/40-authpam | 8 +-- ublinux/rc.preinit/10-accounts | 87 +++++++++++++----------- ublinux/templates/ublinux-data.ini | 12 ++-- 6 files changed, 80 insertions(+), 65 deletions(-) diff --git a/ublinux/functions b/ublinux/functions index 848b116..1ee3fd7 100755 --- a/ublinux/functions +++ b/ublinux/functions @@ -783,19 +783,19 @@ user_remove_group(){ # - # Все пользователи диапазона # # Имя пользователя get_conf_useradd_from_system(){ - SOURCE=${SYSCONF}/users; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null - FILE_PASSWD="${ROOTFS}/etc/passwd" - FILE_SHADOW="${ROOTFS}/etc/shadow" - FILE_LOGINDEFS="${ROOTFS}/etc/login.defs" - DATA_FILE_PASSWD=$(cat ${FILE_PASSWD}) - DATA_FILE_SHADOW=$(cat ${FILE_SHADOW}) + local SOURCE=${SYSCONF}/users; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null + local FILE_PASSWD="${ROOTFS}/etc/passwd" + local FILE_SHADOW="${ROOTFS}/etc/shadow" + local FILE_LOGINDEFS="${ROOTFS}/etc/login.defs" + local DATA_FILE_PASSWD=$(cat ${FILE_PASSWD}) + local DATA_FILE_SHADOW=$(cat ${FILE_SHADOW}) # Загрузить файлы которые совпадают в каталогах /usr/lib/sysusers.d/ и /usr/share/ublinux-sysusers/. И загрузить которые уникальные в /usr/lib/sysusers.d/ - DATA_SYSUSERS=$(cat \ + local DATA_SYSUSERS=$(cat \ $(comm --nocheck-order -12 <(cd /usr/lib/sysusers.d/ && ls -v1 *.conf | sed "s/\.conf//g") <(cd /usr/share/ublinux-sysusers/ && ls -v1 *.sysusers | sed "s/\.sysusers//g") | sed 's|^|/usr/share/ublinux-sysusers/|;s|$|.sysusers|') \ $(comm --nocheck-order -23 <(cd /usr/lib/sysusers.d/ && ls -v1 *.conf | sed "s/\.conf//g") <(cd /usr/share/ublinux-sysusers/ && ls -v1 *.sysusers | sed "s/\.sysusers//g") | sed 's|^|/usr/lib/sysusers.d/|;s|$|.conf|') \ ) - DEFAULT_HOME="/home" - DEFAULT_SHELL="/bin/bash" + local DEFAULT_HOME="/home" + local DEFAULT_SHELL="/bin/bash" show_user(){ local SELECT_USER="$1" local SELECT_PLAINPASSWORD SELECT_UID SELECT_GROUP SELECT_GECOS SELECT_HOME SELECT_SHELL @@ -815,7 +815,9 @@ get_conf_useradd_from_system(){ #SELECT_EXTRAGROUPS=$(printf "%s\n" $(${CHROOT} id -nrG ${SELECT_USER}) | sort -u | xargs | tr " " ",") #SELECT_EXTRAGROUPS=${SELECT_EXTRAGROUPS//,nobody/}; SELECT_EXTRAGROUPS=${SELECT_EXTRAGROUPS//nobody/} - SELECT_EXTRAGROUPS=$(comm --nocheck-order -13 <(printf "%s\n" ${USERGROUPS//,/ } | sort -u) <(printf "%s\n" $(${CHROOT} id -nrG ${SELECT_USER}) | sort -u) | xargs | tr " " ",") + # У id убираем первую группу, это основная группа + + SELECT_EXTRAGROUPS=$(comm --nocheck-order -13 <(printf "%s\n" ${USERGROUPS//,/ } ${DEFAULTGROUP//,/ } | sort -u) <(printf "%s\n" $(${CHROOT} id -nrG ${SELECT_USER} | sed -E 's/([^ ]*) (.*)/\2/') | sort -u) | xargs | tr " " ",") #' [[ -n ${SELECT_HOME} && ${SELECT_HOME} != "${DEFAULT_HOME}/${SELECT_USER}" ]] && SELECT_OPTIONAL+=" --home-dir ${SELECT_HOME}" [[ -n ${SELECT_SHELL} && ${SELECT_SHELL} != ${DEFAULT_SHELL} ]] && SELECT_OPTIONAL+=" --shell ${SELECT_SHELL}" if [[ ${SELECT_PASSWORD} == "!*" ]]; then diff --git a/ublinux/rc.halt.pre/25-accounts-sync b/ublinux/rc.halt.pre/25-accounts-sync index 2cb6fb4..9dc37bd 100755 --- a/ublinux/rc.halt.pre/25-accounts-sync +++ b/ublinux/rc.halt.pre/25-accounts-sync @@ -26,8 +26,8 @@ exec_useradd_sync(){ local GET_USERSHADOW=$(get_conf_usershadow_from_system ${PARAM}) ${ROOTFS}/usr/bin/ubconfig --quiet --target global remove [users] ${GET_USERADD} ${ROOTFS}/usr/bin/ubconfig --quiet --target global remove [users] ${GET_USERSHADOW} - [[ -n ${GET_USERADD} ]] && ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] ${GET_USERADD} - [[ -n ${GET_USERSHADOW} ]] && ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] ${GET_USERSHADOW} + [[ -n ${GET_USERADD} ]] && eval ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] ${GET_USERADD} + [[ -n ${GET_USERSHADOW} ]] && eval ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] ${GET_USERSHADOW} } if [[ ${USERADD_SYNC} =~ 'shutdown@all' ]]; then set_ubconfig "@all" @@ -61,7 +61,7 @@ exec_groupadd_sync(){ local PARAM=$1 local GET_GROUPADD=$(get_conf_groupadd_from_system ${PARAM}) ${ROOTFS}/usr/bin/ubconfig --quiet --target global remove [users] GROUPADD[*] - [[ -n ${GET_GROUPADD} ]] && ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] ${GET_GROUPADD} + [[ -n ${GET_GROUPADD} ]] && eval ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] ${GET_GROUPADD} } if [[ ${GROUPADD_SYNC} =~ 'shutdown@all' ]]; then set_ubconfig "@all" diff --git a/ublinux/rc.preinit.d/30-network-hostname b/ublinux/rc.preinit.d/30-network-hostname index 52d8d27..87ad39c 100755 --- a/ublinux/rc.preinit.d/30-network-hostname +++ b/ublinux/rc.preinit.d/30-network-hostname @@ -33,9 +33,9 @@ set_hostname(){ # Если нет новой строки, то вставить tail -c1 -- ${ROOTFS}/etc/hosts | grep -qx $'\n' || echo >> ${ROOTFS}/etc/hosts - HOSTS_1="127.0.0.1 sb-ssl.l.google.com safebrowsing.clients.google.com safebrowsing.cache.l.google.com" + HOSTS_1="127.0.0.1 sb-ssl.l.google.com safebrowsing.clients.google.com safebrowsing.cache.l.google.com" grep -q "^\s*${HOSTS_1}\s*$" ${ROOTFS}/etc/hosts || echo "${HOSTS_1}" >> ${ROOTFS}/etc/hosts - HOSTS_2="127.0.0.1 ${SET_HOSTNAME%%.*}" + HOSTS_2="127.0.0.1 ${SET_HOSTNAME%%.*}" grep -q "^\s*${HOSTS_2}\s*$" ${ROOTFS}/etc/hosts || echo "${HOSTS_2}" >> ${ROOTFS}/etc/hosts echo "${SET_HOSTNAME}" > ${ROOTFS}/etc/hostname @@ -70,9 +70,9 @@ set_hostname_live(){ } exec_hostname(){ - DEFAULT_HOSTNAME="ublinux-live" + DEFAULT_HOSTNAME="ublinux-pc" KERNEL_HOSTNAME=$(cmdline_value hostname) - [[ ${KERNEL_HOSTNAME} == "" ]] || HOSTNAME=${KERNEL_HOSTNAME} + [[ -n ${KERNEL_HOSTNAME} ]] && HOSTNAME=${KERNEL_HOSTNAME} [[ -z ${HOSTNAME} ]] && HOSTNAME="${DEFAULT_HOSTNAME}" if [[ -n ${DOMAIN} ]]; then SET_HOSTNAME="${HOSTNAME%%.*}.${DOMAIN}" @@ -82,7 +82,7 @@ exec_hostname(){ # Если в имени хоста указан домен, то зададим на сеанс DOMAIN [[ ${HOSTNAME} != ${HOSTNAME#*.} ]] && SET_DOMAIN="${HOSTNAME#*.}" fi -# set_hostname "${SET_HOSTNAME}" "${SET_DOMAIN}" + set_hostname "${SET_HOSTNAME}" "${SET_DOMAIN}" # Если выполнение в initrd, то пропустить [[ -n ${ROOTFS} ]] || set_hostname_live "${SET_HOSTNAME}" "${SET_DOMAIN}" } diff --git a/ublinux/rc.preinit.d/40-authpam b/ublinux/rc.preinit.d/40-authpam index 759cea1..4cc8582 100755 --- a/ublinux/rc.preinit.d/40-authpam +++ b/ublinux/rc.preinit.d/40-authpam @@ -25,12 +25,12 @@ exec_authpam(){ [[ -n ${COMMAND} ]] || COMMAND="set=" [[ $(declare -p AUTHPAM 2>/dev/null) =~ "declare -A" ]] || declare -A AUTHPAM local PARAM="$@" - AUTHSELECT_LIST_ALL=$(${CMD_CHROOT} /usr/bin/authselect list) +# AUTHSELECT_LIST_ALL=$(${CMD_CHROOT} /usr/bin/authselect list) AUTHPAM_FEATURE=${AUTHPAM[${AUTHPAM[0]}]//,/ }; AUTHPAM_FEATURE=${AUTHPAM_FEATURE//;/ } if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]]; then - if [[ ${AUTHPAM[0]} != @(""|disable|no|none|off) ]] \ - && [[ ${AUTHSELECT_LIST_ALL} =~ (^|$'\n')([^$'\n'$])+[[:blank:]]+${AUTHPAM[0]}[[:blank:]]+([^$'\n'$])+($'\n'|$) ]] \ - && [[ ${PARAM} =~ '['${AUTHPAM[0]}']=' || ${PARAM} =~ ^'AUTHPAM='${AUTHPAM[0]}$ ]]; then + if [[ ${AUTHPAM[0]} != @(""|disable|no|none|off) ]]; then +# && [[ ${AUTHSELECT_LIST_ALL} =~ (^|$'\n')([^$'\n'$])+[[:blank:]]+${AUTHPAM[0]}[[:blank:]]+([^$'\n'$])+($'\n'|$) ]] \ +# && [[ ${PARAM} =~ '['${AUTHPAM[0]}']=' || ${PARAM} =~ ^'AUTHPAM='${AUTHPAM[0]}$ ]]; then ${CMD_CHROOT} /usr/bin/authselect select ${AUTHPAM[0]} ${AUTHPAM_FEATURE} --force --nobackup --quiet fi elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then diff --git a/ublinux/rc.preinit/10-accounts b/ublinux/rc.preinit/10-accounts index 1320ad1..810a7bf 100755 --- a/ublinux/rc.preinit/10-accounts +++ b/ublinux/rc.preinit/10-accounts @@ -89,22 +89,24 @@ shopt -s extglob # $3 # Если указано, то принудительно копировать /etc/skel в домашний каталог пользователя create_home(){ local SELECT_USERNAME="${1}" - local SELECT_GROUP="${2}" - local SELECT_FORCESKEL="${3}" + local SELECT_FORCESKEL="${2}" local ARG_RECURSIVE= - [[ ${SELECT_GROUP} == "" || ${SELECT_GROUP} == "-" ]] && SELECT_GROUP=${SELECT_USERNAME} - [[ ${SELECT_USERNAME} != "" ]] || return 1 - if [[ -d "${ROOTFS}${DEFAULT_HOME_USER}/${SELECT_USERNAME}" ]]; then - ${CMD_CHROOT} /usr/bin/chmod -f u+rw,g-rwx,o-rwx "${DEFAULT_HOME_USER}/${SELECT_USERNAME}" - [[ -z ${SELECT_FORCESKEL} ]] || cp -Taf ${ROOTFS}/etc/skel "${ROOTFS}${DEFAULT_HOME_USER}/${SELECT_USERNAME}" + local SELECT_GROUP="$(${CMD_CHROOT} /usr/bin/id -g ${SELECT_USERNAME})" + local SELECT_HOME="$(${CMD_CHROOT} getent passwd ${SELECT_USERNAME} | cut -d: -f6)" + [[ -n ${SELECT_USERNAME} && -n ${SELECT_GROUP} && -n ${SELECT_HOME} ]] || return 1 + if [[ -d "${ROOTFS}${SELECT_HOME}" ]]; then + ${CMD_CHROOT} /usr/bin/chown -f ${SELECT_USERNAME}:${SELECT_GROUP} "${SELECT_HOME}" + ${CMD_CHROOT} /usr/bin/chmod -f u+rw,g-rwx,o-rwx "${SELECT_HOME}" + if [[ -n ${SELECT_FORCESKEL} ]]; then + cp -Taf ${ROOTFS}/etc/skel "${ROOTFS}${SELECT_HOME}" + ${CMD_CHROOT} cd /etc/skel && find . -exec chown -f ${SELECT_USERNAME}:${SELECT_GROUP} ${SELECT_HOME}/{} \; + fi else - install -dm700 "${ROOTFS}${DEFAULT_HOME_USER}/${SELECT_USERNAME}" - cp -Taf ${ROOTFS}/etc/skel "${ROOTFS}${DEFAULT_HOME_USER}/${SELECT_USERNAME}" + ${CMD_CHROOT} install -dm700 -o ${SELECT_USERNAME} -g ${SELECT_GROUP} "${SELECT_HOME}" + cp -Taf ${ROOTFS}/etc/skel "${ROOTFS}${SELECT_HOME}" + ${CMD_CHROOT} chown -fR ${SELECT_USERNAME}:${SELECT_GROUP} ${SELECT_HOME} fi #rsync -rlpt --ignore-existing etc/skel/ "${ROOTFS}${DEFAULT_HOME_USER}/${SELECT_USERNAME}" - [[ -n ${ROOTFS} ]] && ARG_RECURSIVE="-R" || ARG_RECURSIVE= - ${CMD_CHROOT} /usr/bin/chown -f ${ARG_RECURSIVE} "${SELECT_USERNAME}" ${DEFAULT_HOME_USER}/"${SELECT_USERNAME}" - ${CMD_CHROOT} /usr/bin/chown -f ${ARG_RECURSIVE} :"${SELECT_GROUP}" "${DEFAULT_HOME_USER}/${SELECT_USERNAME}" } # Задаём пароль root пользователю @@ -197,7 +199,7 @@ exec_03_add_groups(){ >&2 echo "ERROR: '${SELECT_GROUP}' cannot be a group name" fi fi - done 3<<< "${GROUPADD_GROUPS//,/$'\n'}" + done 3< <(sort -V <<< "${GROUPADD_GROUPS//,/$'\n'}") fi } @@ -290,7 +292,7 @@ exec_04_groupadd(){ else LIST_GROUPADD_NOGID+="groupadd_local ${SELECT_GROUP}; " fi - done 3< <(printf "%s\n" "${!GROUPADD[@]}") + done 3< <(printf "%s\n" "${!GROUPADD[@]}" | sort -V) [[ -n ${LIST_GROUPADD_GID} ]] && eval "${LIST_GROUPADD_GID}" [[ -n ${LIST_GROUPADD_NOGID} ]] && eval "${LIST_GROUPADD_NOGID}" elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then @@ -309,7 +311,6 @@ exec_04_groupadd(){ fi } - # Создаем пользователей из ${NEEDEDUSERS} и добавляем в группы # $1 Команды set или remove с режимом, варианты: set=|set+=|set++=|set-=|set--=|remove # $2 Для команды set=|set+=|set++= параметр со значением, пример: @@ -378,7 +379,7 @@ exec_05_neededusers(){ if [[ ! -d ${ROOTFS}${DEFAULT_HOME_USER}/"${SELECT_USERNAME}" \ || ${UPDATEHOME[${SELECT_USERNAME}],,} == @(yes|y|enable) \ || ${UPDATEHOME,,} == @(yes|y|enable) ]]; then - create_home "${SELECT_USERNAME}" - force + create_home "${SELECT_USERNAME}" force fi done 3< <(tr ",;" "\n" <<< "${NEEDEDUSERS}") fi @@ -456,6 +457,8 @@ exec_06_useradd(){ local DATA_FILE_GROUP=$(cat ${FILE_GROUP}) useradd_local(){ local SELECT_USERNAME=$1 + local SELECT_GECOS= SELECT_UID= SELECT_GROUP= SELECT_EXTRAGROUPS= SELECT_OPTIONAL= SELECT_PASSWORD= NULL= + local SELECT_HOME= SELECT_SHELL= SELECT_MKHOME= # Проверяем существует ли пользователь в системе [[ ${DATA_FILE_PASSWD} =~ ($'\n'|^)+"${SELECT_USERNAME}": ]] && IS_USERNAME_PASSWD=yes || IS_USERNAME_PASSWD= # Проверяем отсутствие пользователя в системе или параметр принудительного обновления @@ -463,20 +466,35 @@ exec_06_useradd(){ IFS=: read -r SELECT_GECOS SELECT_UID SELECT_GROUP SELECT_EXTRAGROUPS SELECT_OPTIONAL SELECT_PASSWORD NULL <<< "${USERADD[${SELECT_USERNAME}]}" [[ ${NULL} == "" ]] || { >&2 echo "WARNING: Unnecessary processing of the ':' character. USERADD[${SELECT_USERNAME}]"; } #echo -e "\n===> exec_06_useradd: ${SELECT_USERNAME}=${SELECT_GECOS}:${SELECT_UID}:${SELECT_GROUP}:${SELECT_EXTRAGROUPS}:${SELECT_OPTIONAL}:${SELECT_PASSWORD}" + # ----------- + [[ ${SELECT_OPTIONAL,,} == "x" ]] && SELECT_OPTIONAL= + [[ ${SELECT_OPTIONAL} =~ ("--home-dir "|"-d ")([^' ']*)(' '|$) ]] && SELECT_HOME="${BASH_REMATCH[2]}" || SELECT_HOME="${DEFAULT_HOME_USER}/${SELECT_USERNAME}" + [[ ${SELECT_OPTIONAL} =~ ("--shell "|"-s ")([^' ']*)(' '|$) ]] && SELECT_SHELL="${BASH_REMATCH[2]}" || SELECT_SHELL="+" + [[ ${SELECT_OPTIONAL} =~ ("--no-create-home"|"-M") ]] && SELECT_MKHOME= || SELECT_MKHOME="yes" + # ----------- + [[ ${SELECT_PASSWORD} == @(""|"x") ]] && SELECT_PASSWORD="${DEFAULTPASSWD}" + [[ ${SELECT_PASSWORD} != @(""|'!*'|'!'|'!!'|'*') ]] && SELECT_PASSWORD="$(return_hash_password hash ${HASHPASSWD} ${SELECT_PASSWORD})" + # ----------- [[ ${SELECT_GECOS,,} == "x" ]] && SELECT_GECOS= # ----------- [[ ${SELECT_UID,,} == "x" || ${SELECT_UID} =~ ^[^0-9]+$ ]] && SELECT_UID= # Если существует домашний каталог пользователя, то UID берём от каталога if [[ -z ${SELECT_UID} && -d "${ROOTFS}${SELECT_HOME}" ]]; then SELECT_UID=$(stat -c %u "${ROOTFS}${SELECT_HOME}") - [[ ${DATA_FILE_PASSWD} =~ ($'\n'|^)+[^:]*:[^:]*:"${SELECT_UID}": ]] && SELECT_UID= + [[ ! ${DATA_FILE_PASSWD} =~ ($'\n'|^)+"${SELECT_USERNAME}":[^:]*:"${SELECT_UID}": ]] \ + && [[ ${DATA_FILE_PASSWD} =~ ($'\n'|^)+[^:]*:[^:]*:"${SELECT_UID}": ]] && SELECT_UID= + fi + if [[ -z ${SELECT_UID} && ${DATA_FILE_PASSWD} =~ ($'\n'|^)+"${SELECT_USERNAME}":[^:]*:([[:digit:]]+): ]]; then + # Если пользователь присутствует в списке, то берём его UID + SELECT_UID=${BASH_REMATCH[2]} fi # ----------- [[ ${SELECT_GROUP,,} == "x" ]] && SELECT_GROUP= # Если существует домашний каталог пользователя, то GID берём от каталога if [[ -z ${SELECT_GROUP} && -d "${ROOTFS}${SELECT_HOME}" ]]; then SELECT_GROUP=$(stat -c %g "${ROOTFS}${SELECT_HOME}") - [[ ${DATA_FILE_PASSWD} =~ ($'\n'|^)+[^:]*:[^:]*:[^:]*:"${SELECT_GROUP}": ]] && SELECT_GROUP= + [[ ! ${DATA_FILE_PASSWD} =~ ($'\n'|^)+"${SELECT_USERNAME}":[^:]*:[^:]*:"${SELECT_GROUP}": ]] \ + && [[ ${DATA_FILE_PASSWD} =~ ($'\n'|^)+[^:]*:[^:]*:[^:]*:"${SELECT_GROUP}": ]] && SELECT_GROUP= fi # Если указана основная группа, но она не создана, то создать if [[ -n ${SELECT_GROUP} && ${DATA_FILE_GROUP} =~ ($'\n'|^)+"${SELECT_GROUP}":[^$'\n']+:([[:digit:]]+):.*($'\n'|$) ]]; then @@ -486,7 +504,7 @@ exec_06_useradd(){ # Если группа имеет цифровое имя и присутствует в списке, то берём её GUID SELECT_GROUP=${SELECT_GROUP} elif [[ ${SELECT_OPTIONAL} =~ ("--no-user-group"|"-N") && ${DATA_FILE_GROUP} =~ ($'\n'|^)+"users":[^$'\n']+:([[:digit:]]+):.*($'\n'|$) ]]; then - # Если указан параметр не создавать группу по имени пользователя, то задаём GIT группы users + # Если указан параметр не создавать группу по имени пользователя, то задаём GID группы users SELECT_GROUP=${BASH_REMATCH[2]} elif [[ ${SELECT_OPTIONAL} =~ ("--system"|"-r") ]]; then # Если указан параметр создавать системную группу @@ -513,28 +531,21 @@ exec_06_useradd(){ fi fi # ----------- - [[ ${SELECT_OPTIONAL,,} == "x" ]] && SELECT_OPTIONAL= - [[ ${SELECT_OPTIONAL} =~ ("--home-dir "|"-d ")([^' ']*)(' '|$) ]] && SELECT_HOME="${BASH_REMATCH[2]}" || SELECT_HOME="${DEFAULT_HOME_USER}/${SELECT_USERNAME}" - [[ ${SELECT_OPTIONAL} =~ ("--shell "|"-s ")([^' ']*)(' '|$) ]] && SELECT_SHELL="${BASH_REMATCH[2]}" || SELECT_SHELL="+" - [[ ${SELECT_OPTIONAL} =~ ("--no-create-home"|"-M") ]] && SELECT_MKHOME= || SELECT_MKHOME="yes" - # ----------- - [[ ${SELECT_PASSWORD} == @(""|"x") ]] && SELECT_PASSWORD="${DEFAULTPASSWD}" - [[ ${SELECT_PASSWORD} != @(""|'!*'|'!'|'!!'|'*') ]] && SELECT_PASSWORD="$(return_hash_password hash ${HASHPASSWD} ${SELECT_PASSWORD})" - # ----------- # Создаём/Изменяем пользователя user_add "${SELECT_USERNAME}:${SELECT_GECOS}:${SELECT_UID}:${SELECT_GROUP}:${SELECT_PASSWORD}:${SELECT_HOME}:${SELECT_SHELL}:+:+:+:+:+:+" # ----------- - # Проверим права на домашнем каталоге пользователя, если не совпадают с указанным польователем, то переназначим + # Проверим права на домашнем каталоге пользователя, если не совпадают с указанным пользователем, то переназначим if [[ -d ${ROOTFS}${SELECT_HOME} ]]; then - GET_UID_GID_HOME=$(${CMD_CHROOT} /usr/bin/stat -c "%U:%G" ${SELECT_HOME}) - GET_UID_GID_SELECT="$(${CMD_CHROOT} /usr/bin/id -u ${SELECT_USERNAME} 2>/dev/null):$(${CMD_CHROOT} /usr/bin/id -g ${SELECT_GROUP:-${SELECT_USERNAME}} 2>/dev/null)" + GET_UID_GID_HOME=$(stat -c "%u:%g" "${ROOTFS}${SELECT_HOME}") + GET_UID_GID_SELECT="$(${CMD_CHROOT} /usr/bin/id -u ${SELECT_USERNAME} 2>/dev/null):$(${CMD_CHROOT} /usr/bin/id -g ${SELECT_USERNAME} 2>/dev/null)" if [[ ${GET_UID_GID_HOME} != ${GET_UID_GID_SELECT} ]]; then - eval ${CMD_CHROOT} /usr/bin/chown -f -h "${SELECT_USERNAME}:" \ + eval ${CMD_CHROOT} /usr/bin/chown -f -h "${GET_UID_GID_SELECT}" \ $(${CMD_CHROOT} find ${SELECT_HOME} -maxdepth 1 -printf '"%p"\n') \ $(cat ${ROOTFS}/etc/xdg/user-dirs.defaults 2>/dev/null | grep -v "^\s*#" | sed -E "s|.*=(.*)|${SELECT_HOME}/\1|") \ $(cat ${ROOTFS}${SELECT_HOME}/.config/user-dirs.dirs 2>/dev/null | grep -v "^\s*#"| sed -E "s|.*HOME/(.*)|${SELECT_HOME}/\"\1|") ARG_RECURSIVE="-hRP" - eval ${CMD_CHROOT} /usr/bin/chown -f ${ARG_RECURSIVE} "${SELECT_USERNAME}:" \ + # Все скрытые файлы глубиной 1 + eval ${CMD_CHROOT} /usr/bin/chown -f ${ARG_RECURSIVE} "${GET_UID_GID_SELECT}" \ $(${CMD_CHROOT} find ${SELECT_HOME} -maxdepth 1 -name ".*" -printf '"%p"\n') fi fi @@ -556,9 +567,9 @@ exec_06_useradd(){ [[ -n ${ROOTFS} ]] || echo "INFO: The user '${SELECT_USERNAME}' exists in the system, the settings are not applied. To force the settings, enable the '[users] USERADD_SYNC[${SELECT_USERNAME}]=boot' option" fi # Создаём домашний каталог принудительно и копируем /etc/skel - [[ ! -d ${ROOTFS}${DEFAULT_HOME_USER}/"${SELECT_USERNAME}" && SELECT_MKHOME == "yes" ]] && UPDATEHOME[${SELECT_USERNAME}]=yes + [[ ! -d "${ROOTFS}${DEFAULT_HOME_USER}/${SELECT_USERNAME}" && ${SELECT_MKHOME} == "yes" ]] && UPDATEHOME[${SELECT_USERNAME}]="yes" if [[ ${UPDATEHOME,,} == @(yes|y|enable) || ${UPDATEHOME[${SELECT_USERNAME}],,} == @(yes|y|enable) ]]; then - create_home "${SELECT_USERNAME}" "${SELECT_GROUP}" force + create_home "${SELECT_USERNAME}" force fi } @@ -572,7 +583,7 @@ exec_06_useradd(){ else LIST_USERADD_NOUID+="useradd_local ${SELECT_USERNAME}; " fi - done 3< <(printf "%s\n" "${!USERADD[@]}") + done 3< <(printf "%s\n" "${!USERADD[@]}" | sort -V) eval "${LIST_USERADD_UID}" eval "${LIST_USERADD_NOUID}" elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]] && [[ ${#USERADD[@]} -ne 0 ]]; then @@ -645,7 +656,7 @@ exec_07_usershadow(){ [[ ${SELECT_INACTIVE} =~ (-1|^[0-9]*$) ]] || SELECT_INACTIVE= [[ ${SELECT_EXPIRE} =~ (^[0-9]*$|^[0-9]{4,4}'-'[0-9]{1,2}'-'[0-9]{1,2}$) ]] || SELECT_EXPIRE= user_add "${SELECT_USERNAME}:+:+:+:+:+:+:${SELECT_LASTCHANGED}:${SELECT_MINDAY}:${SELECT_MAXDAY}:${SELECT_WARN}:${SELECT_INACTIVE}:${SELECT_EXPIRE}" - done 3< <(printf "%s\n" "${!USERSHADOW[@]}") + done 3< <(printf "%s\n" "${!USERSHADOW[@]}" | sort -V) elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]] && [[ ${#USERSHADOW[@]} -ne 0 ]]; then if [[ ${PARAM%%=*} =~ ^.*'['(.*)']' ]]; then local SELECT_USERNAME=${BASH_REMATCH[1]} @@ -710,7 +721,7 @@ exec_08_user_members(){ # Добавить пользователей в группы while IFS= read -ru3 SELECT_USERNAME; do useradd_local ${SELECT_USERNAME} - done 3< <(printf "%s\n" "${!USERADD[@]}") + done 3< <(printf "%s\n" "${!USERADD[@]}" | sort -V) elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]] && [[ ${#USERADD[@]} -ne 0 ]]; then if [[ ${PARAM%%=*} =~ ^'USERADD['(.*)']' ]]; then local SELECT_USERNAME=${BASH_REMATCH[1]} @@ -735,7 +746,7 @@ exec_08_user_members(){ } while IFS= read -ru3 SELECT_GROUP; do groupadd_local "${SELECT_GROUP}" - done 3< <(printf "%s\n" "${!GROUPADD[@]}") + done 3< <(printf "%s\n" "${!GROUPADD[@]}" | sort -V) elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]] && [[ ${#GROUPADD[@]} -ne 0 ]]; then if [[ ${PARAM%%=*} =~ ^'GROUPADD['(.*)']' ]]; then local SELECT_GROUP=${BASH_REMATCH[1]} diff --git a/ublinux/templates/ublinux-data.ini b/ublinux/templates/ublinux-data.ini index ffb3dc7..ce9d3e5 100644 --- a/ublinux/templates/ublinux-data.ini +++ b/ublinux/templates/ublinux-data.ini @@ -210,9 +210,9 @@ SERVICES_ENABLE=dbus-broker,NetworkManager,sshd,systemd-swap,cups,cockpit.socket ## # Если не указан и существует каталог /home/ , то будет взят у этого каталога ## # Дополнительные группы пользователя. Дополнительные к USERGROUPS ## # Если группа отсутствует или 'x', то 'extra_groups=users'. Если группа не существует, то будет создана. Перечисление через запятую. -## # Дополнительные параметры, например: '--shell /usr/bin/bash --create-home --no-create-home --no-user-group --non-unique' +## # Дополнительные параметры, например: '--shell /bin/bash --create-home --no-create-home --no-user-group --non-unique' ## --home-dir <ДОМ_КАТ> # Домашний каталог новой учётной записи -## -s, --shell /usr/bin/bash # Регистрационная оболочка новой учётной записи +## -s, --shell /bin/bash # Регистрационная оболочка новой учётной записи ## -r, --system # Создать системного пользователя ## -M, --no-create-home # Не создавать домашний каталог пользователя ## -N, --no-user-group # Не создавать группу с тем же именем что и у пользователя @@ -226,7 +226,7 @@ SERVICES_ENABLE=dbus-broker,NetworkManager,sshd,systemd-swap,cups,cockpit.socket ## # Первые символы '%%' работают как команда для ubconfig, что-бы не шифровать пароль, и не сохраняются в конфигурацию. ## USERADD[superadmin]='Администратор:1000:x:x:x:$6$E7stRhRS8fCKk7UU$Qoqw62AUaUa5uLIc2KC7WV3MUThhrR8kjXtCODmnKCzKe2zHu1/wmsiWBHZEIk/IQnk/aELQYbUK93OUtrwg60' ## USERADD[user-1]=x -## USERADD[user-1]='Пользователь-1:x:x:vboxusers,libvirt:-s /usr/bin/bash -o:$6$E7stRhRS8fCKk7UU$Qoqw62AUaUa5uLIc2KC7WV3MUThhrR8kjXtCODmnKCzKe2zHu1/wmsiWBHZEIk/IQnk/aELQYbUK93OUtrwg60' +## USERADD[user-1]='Пользователь-1:x:x:vboxusers,libvirt:-s /bin/bash -o:$6$E7stRhRS8fCKk7UU$Qoqw62AUaUa5uLIc2KC7WV3MUThhrR8kjXtCODmnKCzKe2zHu1/wmsiWBHZEIk/IQnk/aELQYbUK93OUtrwg60' ## Параметры пользователя системы /etc/shadow. Если пользователь существует, то без изменений ## USERSHADOW[]=':::::' @@ -247,18 +247,19 @@ SERVICES_ENABLE=dbus-broker,NetworkManager,sshd,systemd-swap,cups,cockpit.socket ## Синхронизация пользователей системы /etc/passwd и их параметры /etc/shadow с глобальной конфигурацией ## USERADD_SYNC='boot,shutdown,shutdown@all,shutdown@users,shutdown@systems,shutdown@-,shutdown@' +## boot # При загрузке системы принудительно применить глобальную конфигурацию на пользователя ## shutdown # Аналогичен shutdown@users + shutdown@systems ## shutdown@all # При завершении работы системы синхронизировать всех пользователей в системе с глобальной конфигурацией ## shutdown@users # При завершении работы системы синхронизировать пользователей 1000<=UID<=6000 в системе с глобальной конфигурацией ## shutdown@systems # При завершении работы системы синхронизировать системных пользователей 500<=UID<=999 в системе с глобальной конфигурацией ## shutdown@- # При завершении работы системы синхронизировать диапазон UID пользователей в системе с глобальной конфигурацией ## shutdown@ # При завершении работы системы синхронизировать UID пользователя в системе с глобальной конфигурацией +## USERADD_SYNC=boot,shutdown ## ## USERADD_SYNC[]='boot,shutdown' -## # Имя пользователя, необязательное поле. Если не указано, то применяется для всех пользователей +## # Имя пользователя, необязательное поле. Если не указано, то применяется для всех пользователей ## boot # При загрузке системы принудительно применить глобальную конфигурацию на пользователя ## shutdown # При завершении работы системы синхронизировать указанного пользователя в системе с глобальной конфигурацией -## USERADD_SYNC=boot ## USERADD_SYNC[superadmin]=boot,shutdown ## Группы системы /etc/group. Создаст или изменит существующие группы @@ -286,6 +287,7 @@ SERVICES_ENABLE=dbus-broker,NetworkManager,sshd,systemd-swap,cups,cockpit.socket ## shutdown@systems # При завершении работы системы синхронизировать системные группы 500<=GID<=999 в системе с глобальной конфигурацией ## shutdown@- # При завершении работы системы синхронизировать диапазон GID групп в системе с глобальной конфигурацией ## shutdown@ # При завершении работы системы синхронизировать GID группы в системе с глобальной конфигурацией +## GROUPADD_SYNC=shutdown ## ## GROUPADD_SYNC[group_name]='shutdown' ## group_name # Имя группы, необязательное поле. Если не указано, то применяется для всех групп