- CLI-Verlauf: Was über den CLI-Begleiter ausgeführt wurde, ist jetzt in der App sichtbar. Jeder NeoSSHWinManager-cli.exe-Aufruf für eine gespeicherte Verbindung wird aufgezeichnet und kann in der GUI überprüft werden – sowohl --exec-Aufrufe (Befehl, Ausgabe, Exit-Code) als auch interaktive Sitzungen (Vollbild-Transkript). Eine neue Schaltfläche „CLI-Verlauf anzeigen“ in den Verbindungsdetails öffnet ein spezielles Bedienfeld (src/ui/clihistorypanel.py), in dem die neuesten Einträge zuerst aufgeführt werden – ein Sitzungs-/Befehlsabzeichen, ein Zeitstempel (Start–Ende für Sitzungen), die Befehlszeile und ihr Exit-Code. Die Ausgabe wird reduziert, bis darauf geklickt wird, damit lange Verläufe scannbar bleiben – plus „Als .txt herunterladen“ für den vollständigen Verlauf und „Verlauf löschen“. UI-Strings werden in allen sechs unterstützten Sprachen ausgeliefert.
- Verlaufseinträge werden in einer neuen verschlüsselten Clihistory-Tabelle gespeichert: Befehl und Ausgabe werden mit demselben benutzerspezifischen Schlüssel wie Verbindungskennwörter verschlüsselt, niemals im Klartext geschrieben und sind auf 500 Einträge pro Host (die ältesten werden durch Einfügereihenfolge bereinigt) und 256 KB pro Eintrag begrenzt, um das Datenbankwachstum zu begrenzen. Der CLI-Prozess speichert niemals den Verschlüsselungsschlüssel der GUI-Sitzung, daher übergibt er den Eintrag über die vorhandene benutzerbeschränkte IPC-Pipe an die laufende GUI-Instanz (neue Clilog-Aktion, dieselbe Zugriffsschlüsselprüfung und Ratenbegrenzung pro PID wie cli_connect), die die Verschlüsselung und Speicherung übernimmt.
- Interaktive Sitzungstranskripte werden so gerendert, wie der Bildschirm tatsächlich aussah, und nicht als roher Bytestream ausgegeben: Rücktaste und ENTF löschen jetzt das Zeichen links, anstatt nach einem Tippfehler \x08-Wurf im Protokoll zu belassen, und ein bloßer Wagenrücklauf positioniert den Cursor neu, anstatt als neue Zeile behandelt zu werden – Fortschrittsbalken (pip, apt, curl, docker pull, npm) zeigen also ihren Endzustand an, anstatt eine Zeile pro Neuzeichnung. ANSI/VT100-Escape-Sequenzen werden entfernt. Die Aufzeichnung erfolgt ausschließlich nach bestem Wissen und Gewissen und ist vollständig ausnahmslos. Es kann niemals Auswirkungen auf die SSH-Sitzung, ihren Exit-Code oder ihre Laufzeit haben.
- NEOSSHEXECTIMEOUT (Sekunden) legt ein optionales Zeitlimit für --exec fest; nicht gesetzt bedeutet keine Begrenzung.
- SSHFS-Laufwerke verschwinden nicht mehr, weil ihr lang laufender Prozess verloren geht oder in GUI-eigenen Debug-Pipes blockiert wird. Mounts werden jetzt im Vordergrundmodus mit übergeordneten Standardhandles ausgeführt, behalten ihr Prozesshandle und erfordern einen freien Laufwerksbuchstaben, der stabil verfügbar wird.
- Disconnect findet jetzt den genauen SSHFS-Prozess über die gebündelte psutil-Abhängigkeit anstelle des veralteten WMIC-Befehls, behandelt ein bereits fehlendes Laufwerk als Erfolg und bricht veraltete Explorer-Label-Updates ab, die zu Ghost-Drive-Einträgen führen könnten.
- Das CLI-Tool wurde immer mit Code 0 beendet, auch wenn nichts funktionierte. launchsshincurrentterminal() gab nichts zurück und climain.py meldete bedingungslosen Erfolg, sodass eine fehlgeschlagene Verbindung, ein abgelehnter Hostschlüssel oder eine fehlgeschlagene Authentifizierung nicht von einer erfolgreichen Ausführung zu unterscheiden war – Skripte, die die CLI aufrufen, konnten einen Fehler überhaupt nicht erkennen. Die Funktion gibt jetzt einen Exit-Code zurück und --exec gibt den Exit-Status des Remote-Befehls weiter (über recvexit_status()), anstatt ihn zu verwerfen.
- Die Ausgabe von --exec ging verloren, wenn der Aufrufer stdout umleitete. Die Ausgabe wurde über WriteFile in den Bildschirmpuffer der CONOUT$-Konsole geschrieben, was nicht die Standardausgabe des Prozesses ist: NeoSSHWinManager-cli.exe --connect-cli … --exec "…" > out.txt hat einen Erfolg gemeldet und eine leere Datei erstellt. Der nicht interaktive Modus schreibt jetzt ausschließlich in die realen Prozessströme, und der interaktive Pfad greift auf diese zurück, wenn kein gültiges Konsolenhandle vorhanden ist, anstatt ins Leere zu schreiben.
- --exec wurde nach 30 Sekunden abgebrochen. Das hartcodierte Timeout war zu kurz für wesentliche Dinge (Testläufe, NPM-Installation, Backups) und unterbrach die Ausführung mitten im Befehl. ssh selbst legt keine solche Grenze fest. Es gibt kein Standardlimit mehr – siehe NEOSSHEXECTIMEOUT oben.
- --exec-Statusmeldungen („Verbinden mit …“) gingen an stdout und kontaminierten die Befehlsausgabe, die von Skripten analysiert wird; Sie gehen jetzt zu stderr und überlassen stdout allein dem Remote-Befehl. Ausführungsfehler mit einem leeren str(e) – häufig bei socket.timeout – führen nicht mehr zu einem bloßen „Fehler beim Ausführen des Befehls:“ ohne Ursache, und ein Timeout sagt dies jetzt explizit und zeigt auf NEOSSHEXECTIMEOUT.
- Der IPC-Listener hat alle Anfragen, die größer als 64 KB sind, stillschweigend verworfen. Ein einzelnes ReadFile für eine Nachrichtenmodus-Pipe signalisiert eine übergroße Nachricht mit ERRORMOREDATA und nicht mit einem Fehler, sodass die GUI lediglich sah, dass eine abgeschnittene Nutzlast nicht analysiert werden konnte, und überhaupt keine Anfrage verarbeitete. Der Listener leert nun die gesamte Nachricht (mit einer Obergrenze von 2 MB) und die Pipe-Puffer wurden auf 1 MB erhöht – erforderlich für cli_log-Einträge mit Befehlsausgaben und ein latenter Fehler für jede zukünftige große Anfrage.
| Datei | Größe |
|---|---|
| NeoSSHWinManager.exe | 180.7 MB |
| NeoSSHWinManager-Setup-1.5.5.exe | 210.5 MB |
| NeoSSHWinManager-cli.exe | 29.7 MB |