GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Openssh-Sitzung wird beendet, wenn von Perl aus ein Syswrite-Aufruf mit einer leeren Variablen in Solaris 11 erfolgt?

Wir haben ein seltsames Problem in Solaris 11.4.

Das Problem tritt auf, wenn ein Code wie der folgende von Perl

ausgeführt wird
my $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.

Siehe auch:Linux – Warum wird die SSH-Sitzung sofort beendet?

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"

Linux
  1. `$xauthority` erscheint aus dem Nichts auf Su+tmux?

  2. Wie erstelle ich mit Virsh eine VM von Grund auf neu?

  3. Wie führt man eine HTTP-Anfrage/einen Aufruf mit JSON-Nutzlast von der Befehlszeile aus?

  4. Brechen Sie einen Systemaufruf mit ptrace() ab

  5. Shell-Skript ändert Verzeichnis mit Variable

Drucken Sie von überall mit CUPS unter Linux

Erste Schritte mit Tmux

Rufen Sie das Python-Skript von bash mit Argument auf

Rufen Sie eine C-Funktion aus C++-Code auf

Wann wird eine mit mkstemp() erstellte Datei gelöscht?

Erstellen Sie einen neuen leeren Verzeichnisbaum aus einem vorhandenen Baum mit Dateien