From 374c4492d958b624bebe8ae465a1786f3c206d55 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Mon, 2 Mar 2026 10:25:19 +0100 Subject: [PATCH] Read prompts from a fresh /dev/tty to avoid tty corruption Replace pre-opened _RECOVERY_TTY handling with direct reads from /dev/tty in misc/build.func and misc/error_handler.func. The change opens /dev/tty at prompt time (with stty sane) so the prompt reads aren't affected by tty state corruption from lxc-attach|tee, simplifies the read logic by using a local response variable with a timeout, and removes the pre-open/close bookkeeping for _RECOVERY_TTY. --- misc/build.func | 16 +++------------- misc/error_handler.func | 11 +++-------- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/misc/build.func b/misc/build.func index d35d00317..4ed0f5850 100644 --- a/misc/build.func +++ b/misc/build.func @@ -4101,10 +4101,7 @@ EOF' # - $STD/silent() not used for some commands # PIPESTATUS[0] gets the real exit code from lxc-attach (not from tee). # stdin comes from /dev/tty so install scripts can use interactive `read`. - # We pre-open a separate fd to /dev/tty BEFORE the pipeline so the recovery - # menu can still read even if lxc-attach|tee corrupts the tty state. local _LXC_CAPTURE_LOG="/tmp/.install-capture-${SESSION_ID}.log" - exec {_RECOVERY_TTY}/dev/null || _RECOVERY_TTY="" lxc-attach -n "$CTID" -- bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/install/${var_install}.sh)" &1 | tee "$_LXC_CAPTURE_LOG" local lxc_exit=${PIPESTATUS[0]} @@ -4397,14 +4394,9 @@ EOF' # Ensure terminal is sane before reading input (lxc-attach|tee may corrupt tty state) stty sane 2>/dev/null || true - # Use the pre-opened tty fd (survives tty corruption from lxc-attach|tee) - local _read_fd="${_RECOVERY_TTY:-}" - local _read_src="/dev/null; then - _read_src="<&$_read_fd" - fi - - if eval "read -t 60 -r response $_read_src"; then + # Read directly from /dev/tty (fresh open = clean state, no inherited corruption) + local response="" + if read -t 60 -r response /dev/null; then case "${response:-1}" in 1) # Remove container @@ -4601,8 +4593,6 @@ EOF' # Restore default job-control signal handling before exit trap - TSTP TTIN TTOU - # Close pre-opened tty fd - [[ -n "${_RECOVERY_TTY:-}" ]] && exec {_RECOVERY_TTY}<&- 2>/dev/null || true exit $install_exit_code fi diff --git a/misc/error_handler.func b/misc/error_handler.func index 9a2709342..6f2b637a1 100644 --- a/misc/error_handler.func +++ b/misc/error_handler.func @@ -286,15 +286,10 @@ error_handler() { echo -en "${YW}Remove broken container ${CTID}? (Y/n) [auto-remove in 60s]: ${CL}" fi - # Use the pre-opened tty fd if available (survives tty corruption from lxc-attach|tee) + # Reset terminal state and read directly from /dev/tty (fresh open = clean state) stty sane 2>/dev/null || true - local _read_fd="${_RECOVERY_TTY:-}" - local _read_src="/dev/null; then - _read_src="<&$_read_fd" - fi - - if eval "read -t 60 -r response $_read_src"; then + local response="" + if read -t 60 -r response /dev/null; then if [[ -z "$response" || "$response" =~ ^[Yy]$ ]]; then echo "" if declare -f msg_info >/dev/null 2>&1; then