Eliminate repeated sudo password prompts during installation

This commit is contained in:
Perdixky
2025-12-03 10:17:42 +08:00
parent c093265b05
commit 8a9f105e75
2 changed files with 60 additions and 0 deletions
+50
View File
@@ -80,6 +80,56 @@ function prevent_sudo_or_root(){
root) echo -e "${STY_RED}[$0]: This script is NOT to be executed with sudo or as root. Aborting...${STY_RST}";exit 1;; root) echo -e "${STY_RED}[$0]: This script is NOT to be executed with sudo or as root. Aborting...${STY_RST}";exit 1;;
esac esac
} }
# Initialize sudo session and keep it alive in background
# Store PID in a global variable that can be accessed by trap
declare -g SUDO_KEEPALIVE_PID=""
function sudo_init_keepalive(){
# Check if sudo is available
if ! command -v sudo >/dev/null 2>&1; then
return 0
fi
# Only initialize for install-related commands that need sudo
case "${SUBCMD_NAME}" in
install|install-deps|install-setups) ;;
*) return 0 ;;
esac
# Skip if already initialized
if [[ -n "$SUDO_KEEPALIVE_PID" ]] && kill -0 "$SUDO_KEEPALIVE_PID" 2>/dev/null; then
return 0
fi
# Prompt for sudo password once at the beginning
echo -e "${STY_CYAN}[$0]: Requesting sudo privileges for installation...${STY_RST}"
if ! sudo -v; then
echo -e "${STY_RED}[$0]: Failed to obtain sudo privileges. Aborting...${STY_RST}"
exit 1
fi
# Start background process to keep sudo session alive
# This updates the sudo timestamp every 60 seconds
(
while true; do
sleep 60
sudo -v 2>/dev/null || exit 0
done
) &
SUDO_KEEPALIVE_PID=$!
echo -e "${STY_GREEN}[$0]: Sudo session initialized and will be kept alive (PID: $SUDO_KEEPALIVE_PID)${STY_RST}"
}
# Stop the sudo keepalive background process
function sudo_stop_keepalive(){
if [[ -n "$SUDO_KEEPALIVE_PID" ]] && kill -0 "$SUDO_KEEPALIVE_PID" 2>/dev/null; then
kill "$SUDO_KEEPALIVE_PID" 2>/dev/null
wait "$SUDO_KEEPALIVE_PID" 2>/dev/null
SUDO_KEEPALIVE_PID=""
fi
}
function git_auto_unshallow(){ function git_auto_unshallow(){
# We need this function for latest_commit_hash to work properly # We need this function for latest_commit_hash to work properly
if [[ -f "$(git rev-parse --git-dir)/shallow" ]]; then if [[ -f "$(git rev-parse --git-dir)/shallow" ]]; then
+10
View File
@@ -8,6 +8,10 @@ source ./sdata/lib/package-installers.sh
source ./sdata/lib/dist-determine.sh source ./sdata/lib/dist-determine.sh
prevent_sudo_or_root prevent_sudo_or_root
# Trap to ensure sudo keepalive is stopped on exit
trap sudo_stop_keepalive EXIT INT TERM
set -e set -e
##################################################################################### #####################################################################################
@@ -71,6 +75,8 @@ case ${SUBCMD_NAME} in
$function $function
done done
pause pause
# Initialize sudo keepalive for the entire install process
sudo_init_keepalive
if [[ "${SKIP_ALLGREETING}" != true ]]; then if [[ "${SKIP_ALLGREETING}" != true ]]; then
source ${SUBCMD_DIR}/0.greeting.sh source ${SUBCMD_DIR}/0.greeting.sh
fi fi
@@ -89,6 +95,8 @@ case ${SUBCMD_NAME} in
$function $function
done done
pause pause
# Initialize sudo keepalive for dependency installation
sudo_init_keepalive
if [[ "${SKIP_ALLDEPS}" != true ]]; then if [[ "${SKIP_ALLDEPS}" != true ]]; then
source ${SUBCMD_DIR}/1.deps-router.sh source ${SUBCMD_DIR}/1.deps-router.sh
fi fi
@@ -98,6 +106,8 @@ case ${SUBCMD_NAME} in
$function $function
done done
pause pause
# Initialize sudo keepalive for setup steps
sudo_init_keepalive
if [[ "${SKIP_ALLSETUPS}" != true ]]; then if [[ "${SKIP_ALLSETUPS}" != true ]]; then
source ${SUBCMD_DIR}/2.setups.sh source ${SUBCMD_DIR}/2.setups.sh
fi fi