Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d066dbf03d | ||
|
|
e6f9a7aee0 |
No files matched your search
+7
-1
@@ -15,7 +15,13 @@ NC='\033[0m'
|
|||||||
print_status() { echo -e "${GREEN}✔${NC} ${1} completed."; }
|
print_status() { echo -e "${GREEN}✔${NC} ${1} completed."; }
|
||||||
step() { echo -e "${RED}→${NC} ${1}..." | tee -a /var/log/tesm-install.log; }
|
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 ----
|
# ---- Pakete ----
|
||||||
step "Installing system packages"
|
step "Installing system packages"
|
||||||
|
|||||||
+32
-12
@@ -5886,24 +5886,44 @@ def _authenticate_interactive(ws, transport, username):
|
|||||||
if transport.is_authenticated():
|
if transport.is_authenticated():
|
||||||
return True
|
return True
|
||||||
|
|
||||||
if "keyboard-interactive" in allowed:
|
# "password" bewusst VOR "keyboard-interactive" versuchen, auch wenn der
|
||||||
def handler(title, instructions, prompt_list):
|
# Server beides anbietet: viele Switches/APs (u.a. diverse ArubaOS-
|
||||||
responses = []
|
# Varianten) bieten zwar "keyboard-interactive" an, deren Server-seitige
|
||||||
for prompt_text, echo in prompt_list:
|
# Umsetzung ist aber teils nicht robust — z. B. eine erste Runde ganz
|
||||||
ws.send(f"\r\n{prompt_text}")
|
# ohne Prompts (laut RFC 4256 gültig, aber unsichtbar für den Nutzer),
|
||||||
responses.append(_terminal_read_line(ws, echo=bool(echo)) or "")
|
# gefolgt von sofortigem Scheitern statt einer zweiten Runde mit dem
|
||||||
return responses
|
# eigentlichen Passwort-Prompt. Das erklärt exakt das beobachtete
|
||||||
try:
|
# Symptom: im Terminal erscheint NIE ein Prompt, nur direkt "Zugangs-
|
||||||
transport.auth_interactive(username, handler)
|
# daten falsch". "password" ist der einfachere, zuverlässiger
|
||||||
except paramiko.AuthenticationException:
|
# unterstützte Pfad (Ende-zu-Ende gegen einen echten Host verifiziert)
|
||||||
pass
|
# und wird deshalb bevorzugt, wenn der Server ihn überhaupt anbietet.
|
||||||
elif "password" in allowed:
|
if "password" in allowed:
|
||||||
ws.send("\r\nPasswort: ")
|
ws.send("\r\nPasswort: ")
|
||||||
pw = _terminal_read_line(ws, echo=False)
|
pw = _terminal_read_line(ws, echo=False)
|
||||||
try:
|
try:
|
||||||
transport.auth_password(username, pw or "")
|
transport.auth_password(username, pw or "")
|
||||||
except paramiko.AuthenticationException:
|
except paramiko.AuthenticationException:
|
||||||
pass
|
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:
|
else:
|
||||||
ws.send(f"\r\n\x1b[31mServer bietet keine unterstützte Auth-Methode an ({', '.join(allowed) or 'keine'}).\x1b[0m\r\n")
|
ws.send(f"\r\n\x1b[31mServer bietet keine unterstützte Auth-Methode an ({', '.join(allowed) or 'keine'}).\x1b[0m\r\n")
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user