![Linux: Was könnte der Grund für zufällige Fehler beim Aktualisieren von passwd.byuid durch Ausführen von yppasswd sein?](https://rvso.com/image/652682/Linux%3A%20Was%20k%C3%B6nnte%20der%20Grund%20f%C3%BCr%20zuf%C3%A4llige%20Fehler%20beim%20Aktualisieren%20von%20passwd.byuid%20durch%20Ausf%C3%BChren%20von%20yppasswd%20sein%3F.png)
Um NOC-Benutzern in meinem Unternehmen die Verwaltung von Benutzern über NIS zu ermöglichen, habe ich das folgende Skript erstellt:
#!/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
Normalerweise funktioniert das Skript einwandfrei, Beispiel:
[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 ~]#
In manchen Fällen, in denen das Skript funktioniert, kann ich es jedoch nicht von anderen Fällen unterscheiden. Es kommt zu Problemen make
und die Aktualisierung von NIS mit dem neuen Kennwort schlägt fehl:
[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 ~]#
Ich habe versucht, einen Trend zu erkennen, konnte aber keinen finden. Können Sie versuchen, den Grund für die zufälligen Aktualisierungsfehler herauszufinden passwd.byuid
?
Dank im Voraus