Compare commits

..
2 Commits
Author SHA1 Message Date
alientim d066dbf03d SSH-Verbindungstest: 'password' vor 'keyboard-interactive' bevorzugen
Bei einigen Switches/APs (u.a. ArubaOS-Varianten), die Server-seitig
sowohl 'password' als auch 'keyboard-interactive' anbieten, fuehrte
keyboard-interactive zu einem stillen Fehlschlag ganz ohne sichtbaren
Prompt im Browser-Terminal (RFC 4256 erlaubt eine erste Runde ganz ohne
Prompts -- fuer den Nutzer unsichtbar -- gefolgt von sofortigem
Scheitern statt einer zweiten Runde mit dem eigentlichen Passwort-
Prompt). Das erklaerte exakt das gemeldete Symptom: kein Prompt, direkt
'Zugangsdaten falsch'.

'password' wird jetzt bevorzugt, wenn der Server es ueberhaupt anbietet
(Ende-zu-Ende gegen einen echten Host verifiziert: Host-Key-Bestaetigung
-> Passwort-Prompt -> erfolgreicher Login, keine Regression). Die
keyboard-interactive-Handler-Funktion wurde zusaetzlich gehaertet:
title/instructions werden jetzt mit angezeigt (manche Geraete legen den
Hinweistext dort statt in prompt_list ab) und leere prompt_text-Strings
bekommen einen Passwort-Fallback-Text, falls keyboard-interactive doch
der einzig angebotene Weg ist.
2026-08-13 22:30:41 +02:00
alientim e6f9a7aee0 KRITISCH: install.sh brach ohne TTY sofort und lautlos ab (clear + set -e)
"clear" schlägt ohne TERM/Pseudo-Terminal mit Exit-Code 1 fehl ("TERM
environment variable not set") -- z.B. genau dann, wenn install.sh (wie von
update.sh vorgesehen) per SSH exec_command ohne pty aufgerufen wird. Mit
"set -e" hat das die GESAMTE Installation sofort an Zeile 2 abgebrochen,
noch bevor auch nur ein apt-Paket installiert oder eine einzige Zeile ins
Install-Log geschrieben wurde -- kein Fehlertext, kein Hinweis, einfach
Stille. Live reproduziert: update.sh lud das Release-Paket korrekt herunter
und entpackte es, install.sh selbst tat aber schlicht nichts.

Behoben: "clear" ist jetzt bewusst nie fatal (2>/dev/null || true) -- rein
kosmetisch, hat keinen Einfluss auf die eigentliche Installation.
2026-08-13 21:40:15 +02:00
2 changed files with 39 additions and 13 deletions

No files matched your search

+7 -1
View File
@@ -15,7 +15,13 @@ NC='\033[0m'
print_status() { echo -e "${GREEN}✔${NC} ${1} completed."; }
step() { echo -e "${RED}→${NC} ${1}..." | tee -a /var/log/tesm-install.log; }
clear
# "clear" schlägt ohne TERM/Pseudo-Terminal fehl (z.B. bei Automatisierung
# per SSH exec_command ohne pty, genau wie update.sh dieses Skript aufruft)
# -- mit "set -e" bricht das sonst die GESAMTE Installation sofort und ohne
# jede Fehlermeldung an dieser Stelle ab, noch bevor auch nur ein Paket
# installiert wurde (live so reproduziert). Rein kosmetisch, daher bewusst
# nie fatal.
clear 2>/dev/null || true
# ---- Pakete ----
step "Installing system packages"
+32 -12
View File
@@ -5886,24 +5886,44 @@ def _authenticate_interactive(ws, transport, username):
if transport.is_authenticated():
return True
if "keyboard-interactive" in allowed:
def handler(title, instructions, prompt_list):
responses = []
for prompt_text, echo in prompt_list:
ws.send(f"\r\n{prompt_text}")
responses.append(_terminal_read_line(ws, echo=bool(echo)) or "")
return responses
try:
transport.auth_interactive(username, handler)
except paramiko.AuthenticationException:
pass
elif "password" in allowed:
# "password" bewusst VOR "keyboard-interactive" versuchen, auch wenn der
# Server beides anbietet: viele Switches/APs (u.a. diverse ArubaOS-
# Varianten) bieten zwar "keyboard-interactive" an, deren Server-seitige
# Umsetzung ist aber teils nicht robust — z. B. eine erste Runde ganz
# ohne Prompts (laut RFC 4256 gültig, aber unsichtbar für den Nutzer),
# gefolgt von sofortigem Scheitern statt einer zweiten Runde mit dem
# eigentlichen Passwort-Prompt. Das erklärt exakt das beobachtete
# Symptom: im Terminal erscheint NIE ein Prompt, nur direkt "Zugangs-
# daten falsch". "password" ist der einfachere, zuverlässiger
# unterstützte Pfad (Ende-zu-Ende gegen einen echten Host verifiziert)
# und wird deshalb bevorzugt, wenn der Server ihn überhaupt anbietet.
if "password" in allowed:
ws.send("\r\nPasswort: ")
pw = _terminal_read_line(ws, echo=False)
try:
transport.auth_password(username, pw or "")
except paramiko.AuthenticationException:
pass
elif "keyboard-interactive" in allowed:
def handler(title, instructions, prompt_list):
# title/instructions zusätzlich anzeigen: manche Geräte legen
# den eigentlichen Hinweistext ("Password:") dort statt in
# prompt_list ab. Leere prompt_text-Strings (ebenfalls bei
# manchen Geräten üblich) bekommen einen sinnvollen Fallback,
# damit dem Nutzer nie eine Eingabeaufforderung ganz ohne
# sichtbaren Text präsentiert wird.
for text in (title, instructions):
if text:
ws.send(f"\r\n{text}")
responses = []
for prompt_text, echo in prompt_list:
ws.send(f"\r\n{prompt_text or 'Passwort: '}")
responses.append(_terminal_read_line(ws, echo=bool(echo)) or "")
return responses
try:
transport.auth_interactive(username, handler)
except paramiko.AuthenticationException:
pass
else:
ws.send(f"\r\n\x1b[31mServer bietet keine unterstützte Auth-Methode an ({', '.join(allowed) or 'keine'}).\x1b[0m\r\n")