From 3ebb6f36cf530f6a3bee9cfc615c443803133d43 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sat, 26 Apr 2025 04:09:03 -0400 Subject: [PATCH] Added convience rename-user script in root's home directory. You still need a temp user if doing this from ssh. --- pi4/files/root/rename-user.sh | 80 +++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100755 pi4/files/root/rename-user.sh diff --git a/pi4/files/root/rename-user.sh b/pi4/files/root/rename-user.sh new file mode 100755 index 0000000..566d4c7 --- /dev/null +++ b/pi4/files/root/rename-user.sh @@ -0,0 +1,80 @@ +#!/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