81 lines
2.3 KiB
Bash
Executable File
81 lines
2.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# Renames a user
|
|
# Required arguments: old user name, new user name
|
|
|
|
if [[ $# -ne 2 ]]; then
|
|
echo "Usage: $0 old-user new-user"
|
|
exit 1
|
|
fi
|
|
|
|
old_user="$1"
|
|
new_user="$2"
|
|
|
|
# Make sure old user exists
|
|
if ! id "$old_user" >/dev/null 2>&1; then
|
|
echo "The user $old_user does not exist."
|
|
exit 1
|
|
fi
|
|
|
|
# Make sure old user is not logged in
|
|
if pgrep -u "$old_user" >/dev/null; then
|
|
echo "The user $old_user is currently logged in or has running processes. Cannot continue."
|
|
echo "Would you like to forcibly log out $old_user? (Y/N)"
|
|
read -r answer
|
|
answer="${answer:0:1}"
|
|
answer="${answer^}"
|
|
if [[ "$answer" != "Y" ]]; then
|
|
exit 1
|
|
fi
|
|
loginctl terminate-user "$old_user"
|
|
sleep 2
|
|
if pgrep -u "$old_user" >/dev/null; then
|
|
echo "The user $old_user still has running processes after termination. Cannot continue."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Make sure new user does not exist
|
|
if id "$new_user" >/dev/null 2>&1; then
|
|
echo "The user name $new_user is already taken."
|
|
exit 1
|
|
fi
|
|
|
|
# Make sure the new name is acceptable
|
|
if ! [[ "$new_user" =~ ^[a-z_][a-z0-9_-]{0,31}$ ]]; then
|
|
echo "$new_user is not an acceptable user name."
|
|
exit 1
|
|
fi
|
|
|
|
# Passed all safety checks, proceed with the rename
|
|
groups=$(id -nG "$old_user")
|
|
groups="${groups// /,}"
|
|
usermod -G "$groups" -m -d "/home/$new_user" -l "$new_user" "$old_user"
|
|
|
|
# Update nodm.conf if it exists
|
|
if [[ -e /etc/nodm.conf ]]; then
|
|
sed -i -e "s#^NODM_USER=.*#NODM_USER='$new_user'#" -e "s#^NODM_XSESSION=.*#NODM_XSESSION='/home/$new_user/.xinitrc'#" /etc/nodm.conf
|
|
fi
|
|
|
|
# Copy over crontab if it exists
|
|
if crontab -u "$old_user" -l >/tmp/${old_user}_crontab.bak 2>/dev/null; then
|
|
if crontab -u "$new_user" "/tmp/${old_user}_crontab.bak"; then
|
|
rm "/tmp/${old_user}_crontab.bak"
|
|
else
|
|
echo "Warning: failed to restore crontab for $new_user."
|
|
rm "/tmp/${old_user}_crontab.bak"
|
|
fi
|
|
fi
|
|
|
|
# Optionally update files in new home directory
|
|
echo "Would you like to search for references to $old_user and update them to $new_user in files located in /home/$new_user?"
|
|
echo "This can take a while. (Y/N)"
|
|
read -r answer
|
|
answer="${answer:0:1}"
|
|
answer="${answer^}"
|
|
if [[ "$answer" == "Y" ]]; then
|
|
find "/home/$new_user" -type f -exec sed -i "s|$old_user|$new_user|g" "{}" \;
|
|
fi
|
|
|
|
exit 0
|