From 126783d84d50fd2a416a33b6e02a455ffff04c21 Mon Sep 17 00:00:00 2001 From: KeiSei84 <2206745@gmail.com> Date: Thu, 21 May 2026 19:13:51 +0800 Subject: [PATCH] fix(web-install): tolerate missing /dev/tty in non-interactive curl|bash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit E2E (curl install.keisei.app | bash, no controlling terminal) died at `exec < /dev/tty` — "No such device or address". `[ -r /dev/tty ]` stat's the path readable but the device can't be opened without a controlling terminal (CI/cron/ssh non-interactive) — the documented `| bash -s -- --yes` CI path. Now probes a real open via `{ : < /dev/tty; }` and reattaches only on success; else proceeds non-interactively. Verified RC=0 end-to-end. --- web-install.sh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/web-install.sh b/web-install.sh index 0fdbc9d..ffa2dcf 100755 --- a/web-install.sh +++ b/web-install.sh @@ -91,10 +91,15 @@ say "delegating to $KEISEI_ROOT/bootstrap.sh ${PASS_THROUGH[*]:-}" cd "$KEISEI_ROOT" # curl|bash сценарий: stdin = pipe от curl, поэтому wizard'у read нечего читать. -# Если есть /dev/tty (т.е. сессия реально интерактивная), переподключаем stdin +# Если /dev/tty реально ОТКРЫВАЕТСЯ (сессия интерактивная), переподключаем stdin # к терминалу — иначе onboarding/whiptail падают на первом prompt. -# audit 2026-05-18 bug #4. -if [ -r /dev/tty ] && [ ! -t 0 ]; then +# ВАЖНО: `[ -r /dev/tty ]` недостаточно — путь может stat'иться readable, но +# `exec < /dev/tty` падает с "No such device or address" когда нет управляющего +# терминала (ssh non-interactive, CI, cron). Поэтому пробуем реально открыть его +# через `{ : < /dev/tty; }` и реаттачим ТОЛЬКО при успехе. Иначе установка идёт +# неинтерактивно (рассчитано на --yes / KEISEI_SKIP_ONBOARD). +# audit 2026-05-18 bug #4; non-TTY e2e fix 2026-05-21. +if [ ! -t 0 ] && { : < /dev/tty; } 2>/dev/null; then exec < /dev/tty fi