Linux:通过运行yppasswd,更新passwd.byuid会导致随机失败的原因是什么?

为了允许我公司的NOC用户通过NISpipe理用户,我创build了以下脚本:

#!/bin/bash # This script will simplicate NIS user management. # You will not be able to change password or delete users peeradmin and root through this script. # Written by Itai Ganot 2014. # Edit only this variable: PROTECTEDUSERS="peeradmin root" # Separate values with spaces. # Variables USER=$1 GREP="/bin/grep" PASSWDFILE="/etc/passwd" YPPASSWD="/usr/bin/yppasswd" USERDEL="/usr/sbin/userdel" USERADD="/usr/sbin/useradd" PASSWD="/usr/bin/passwd" YPCAT="/usr/bin/ypcat passwd.byname" # Functions function usage { echo -e "Usage: $0 <username to manage>" } function updatenis { echo -e "\e[36m #===# Uptdating NIS database... \e[0m" cd /var/yp && make } # Script if [ -z "$USER" ]; then usage exit 1 fi if [ "$(id -u)" != "0" ]; then echo -e "Run as root!" exit 1 fi "$GREP" -q "$USER" "$PASSWDFILE" if [ "$?" = "0" ]; then echo -e "\e[36m #===# User already exists \e[0m" echo -e "\e[36m #===# How would you like to continue? \e[0m" USERID=$(id -u $USER) select CHOICE in 'Change user password' 'Remove user' 'View user' 'Exit'; do case $CHOICE in "Change user password") if [[ "$PROTECTEDUSERS" =~ $USER ]]; then # Defense against changing root or peeradmin password echo -e "\e[36m #===# User $USER should never be edited! \e[0m" exit 1 fi echo -e "\e[36m #===# Provide root password for NIS server... \e[0m" "$YPPASSWD" "$USER" updatenis break ;; "Remove user") if [[ "$PROTECTEDUSERS" =~ $USER ]]; then # Defense against deletion of user root or peeradmin. echo -e "\e[36m #===# User $USER should never be edited! \e[0m" exit 1 fi read -r -p "Remove home directory and mail? [y/n] " ANSWER1 if [[ "$ANSWER1" = [Yy] ]]; then "$USERDEL" -r "$USER" updatenis echo -e "\e[36m #===# User $USER has been deleted along with the user's home folder and mail \e[0m" break else "$USERDEL" "$USER" echo -e "\e[36m #===# User $USER has been deleted \e[0m" updatenis break fi ;; "View user") echo -e "\e[36m #===# Displaying user $USER \e[0m" $YPCAT | $GREP "$USER" break ;; "Exit") echo -e "\e[36m #===# Exiting, No changes done. \e[0m" exit 0 ;; esac done else read -r -p "User doesn't exist, would you like to add it? [y/n] " ANSWER2 if [[ "$ANSWER2" = [Yy] ]]; then echo -e "\e[36m #===# Collecting required information... \e[0m" sleep 2 LASTUID=$(tail -n 1 $PASSWDFILE | awk -F: '{print $3}') NEXTUID=$(( LASTUID + 1 )) $USERADD -g users $USER -u $NEXTUID echo -e "\e[36m #===# Set password for the new user \e[0m" $PASSWD $USER updatenis read -r -p "Would you like to test the creation of the user? [y/n] " ANSWER3 if [[ "$ANSWER3" = [Yy] ]]; then $YPCAT | $GREP "$USER" if [ "$?" = "0" ]; then echo -e "\e[36m #===# User $USER created successfully! \e[0m" fi fi elif [[ "$ANSWER2" = [Nn] ]]; then echo -e "\e[36m #===# Exiting, no changes done. \e[0m" exit 0 fi fi 

通常这个脚本是完美的,例如:

 [root@nis ~]# Nis_Manage Usage: /usr/sbin/Nis_Manage <username to manage> [root@nis ~]# Nis_Manage itaig #===# User already exists #===# How would you like to continue? 1) Change user password 3) View user 2) Remove user 4) Exit #? 1 #===# Provide root password for NIS server... Changing NIS account information for itaig on nis.sj.company.com. Please enter root password: Changing NIS password for itaig on nis.sj.company.com. Please enter new password: Please retype new password: The NIS password has been changed on nis.sj.company.com. #===# Uptdating NIS database... gmake[1]: Entering directory `/var/yp/company' Updating passwd.byname... Updating passwd.byuid... Updating netid.byname... gmake[1]: Leaving directory `/var/yp/company' [root@nis ~]# 

但有些时候,我无法区分其他时候的脚本工作,它没有使用新密码make更新NIS:

 [root@nis ~]# Nis_Manage itaig #===# User already exists #===# How would you like to continue? 1) Change user password 3) View user 2) Remove user 4) Exit #? 1 #===# Provide root password for NIS server... Changing NIS account information for itaig on nis.sj.company.com. Please enter root password: Changing NIS password for itaig on nis.sj.company.com. Please enter new password: Please retype new password: The NIS password has been changed on nis.sj.company.com. #===# Uptdating NIS database... gmake[1]: Entering directory `/var/yp/company' Updating passwd.byname... Updating passwd.byuid... makedbm: Cannot open passwd.byuid~ gmake[1]: *** [passwd.byuid] Error 1 gmake[1]: Leaving directory `/var/yp/company' make: *** [target] Error 2 [root@nis ~]# 

我试图find一个趋势,但无法find任何,你可以尝试find更新passwd.byuid随机失败的原因?

提前致谢