Wir haben ein seltsames Problem in Solaris 11.4.
Das Problem tritt auf, wenn ein Code wie der folgende von Perl
ausgeführt wirdmy $emptystring = "";
syswrite STDOUT, $emptystring;
Die Ausführung eines Syswrite-Aufrufs mit einer leeren Variablen provoziert, dass die OpenSSH-Sitzung beendet wird 🙁
Das Problem ist neu für uns und tritt nach der Migration von Solaris 11.3 auf Solaris 11.4 und mit OpenSSH 8.1 auf (Bei der vorherigen Version 7.9 besteht das Problem nicht)
Dieser Fehler tritt nur auf, wenn die Ausgabe die Standardausgabe ist . Wenn die Ausgabe des Skripts in eine Datei umgeleitet wird, funktioniert alles ok
Wenn das Skript mit truss
verfolgt wird der Fehler tritt bei einem write
auf Rufen Sie so auf:
23886: write(1, 0x004B6450, 0) = 0
Der gezeigte Write-Aufruf gilt, wenn alles in Ordnung ist, wenn der Fehler auftritt, wird die Sitzung beendet und die Traversenausgabe wird in dieser Zeile gestoppt und alles danach wird nicht angezeigt.
Weitere Informationen: Wir haben für Solaris 11.3 kompilierte Binärdateien getestet und sie funktionieren!. Anscheinend kommt das Problem also von unserer Zusammenstellung, aber wir wissen noch nicht warum …. Auf weiter …
Weitere Informationen: Es gibt keinen bemerkenswerten Unterschied zwischen la compilation. Die Protokolle des OpenSSH-Servers zeigen, dass der leere Wert als EOF genommen wird , wie wir im folgenden Bild sehen können, die den Unterschied zwischen einem OpenSSH mit diesem Fehler und einem anderen zeigen, das sich korrekt verhält.
Die Zeilen, die es zeigen, sind die folgenden:
debug2: channel 0: read<=0 rfd 16 len 0
debug2: channel 0: read failed
debug2: channel 0: chan_shutdown_read (i0 o0 sock -1 wfd 16 efd -1 [closed])
debug2: channel 0: input open -> drain
debug2: channel 0: ibuf empty
debug2: channel 0: send eof
debug3: send packet: type 96
debug2: channel 0: input drain -> closed
Irgendeine Idee?
Akzeptierte Antwort:
Lösung gefunden! 🙂 Kurz gesagt, wir müssen das C-Flag PTY_ZEROREAD
setzen in der Konfigurationsphase der Kompilierung .
In der channels.c
Datei des Quellcodes können wir sehen, wo der Fehler geworfen wird …
#ifndef PTY_ZEROREAD
if (len <= 0) {
#else
if ((!c->isatty && len <= 0) ||
(c->isatty && (len < 0 || (len == 0 && errno != 0)))) {
#endif
debug2("channel %d: read<=0 rfd %d len %zd",
c->self, c->rfd, len);
if (c->type != SSH_CHANNEL_OPEN) {
debug2("channel %d: not open", c->self);
chan_mark_dead(ssh, c);
return -1;
} else {
chan_read_failed(ssh, c);
}
return -1;
}
Und wir können sehen, dass das Kompilierungs-Flag PTY_ZEROREAD
ändert, wie Nachrichten der Länge Null in Terminals behandelt werden.
Um das Problem zu lösen, configure
Befehl muss mit gesetztem C-Flag ausgeführt werden, wie in der letzten Zeile des folgenden Befehls gezeigt:
./configure --with-zlib \
--with-pam \
--with-md5-passwords \
CFLAGS="-DPTY_ZEROREAD=1"