GNU/Linux >> Tutoriels Linux >  >> Linux

La session Openssh est tuée lorsque depuis Perl un appel Syswrite est effectué avec une variable vide dans Solaris 11 ?

Nous avons un problème étrange dans Solaris 11.4.

Le problème survient lorsqu'un code comme celui-ci est exécuté à partir de Perl

my $emptystring = "";
syswrite STDOUT, $emptystring;

L'exécution d'un appel syswrite avec une variable vide provoque la fermeture de la session OpenSSH 🙁

Le problème est nouveau pour nous, et il est apparu après la migration de Solaris 11.3 vers Solaris 11.4 et avec OpenSSH 8.1 (avec la version 7.9 précédente, le problème n'est pas là)

Cette erreur se produit uniquement si la sortie est la sortie standard . Si la sortie du script est redirigée vers un fichier tout fonctionne bien

Si le script est tracé avec truss l'erreur se produit dans un write appeler comme celui-ci :

23886:  write(1, 0x004B6450, 0)             = 0

L'appel d'écriture affiché est pour quand tout va bien, lorsque l'erreur survient, la session est tuée et la sortie du truss est arrêtée et cette ligne et tout ce qui suit n'est pas affiché.

Plus d'informations : Nous avons testé des binaires compilés pour Solaris 11.3 et ils fonctionnent !. Donc apparemment le problème vient de notre compilation, mais on ne sait pas encore pourquoi…. Sur continuer …

Plus d'informations : Il n'y a pas de différence notable entre la compilation. Les logs du serveur OpenSSH montrer que la valeur vide est considérée comme un EOF , comme on peut le voir dans l'image suivante, qui montre la différence entre un OpenSSH avec ce bogue et un autre qui se comporte correctement.

Les lignes qui l'affichent sont les suivantes :

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

Une idée ?

Réponse acceptée :

Solution trouvée ! 🙂 En bref, nous devons définir le drapeau C PTY_ZEROREAD dans la phase de configuration de la compilation .

Dans channels.c fichier du code source, nous pouvons voir où l'erreur est générée …

#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;
    }

Et nous pouvons voir que le drapeau de compilation PTY_ZEROREAD modifie la façon dont les messages de longueur nulle sont traités dans les terminaux.

En relation :Linux – Pourquoi la session ssh se termine-t-elle immédiatement ?

Pour résoudre le problème, le configure La commande doit être effectuée avec le drapeau C défini comme indiqué dans la dernière ligne de la commande suivante :

./configure --with-zlib           \
        --with-pam                \
        --with-md5-passwords      \
        CFLAGS="-DPTY_ZEROREAD=1"

Linux
  1. Capture d'écran de X de Tty ?

  2. Comment créer une VM à partir de zéro avec Virsh ?

  3. appeler une fonction lorsque le programme est terminé avec ctrl c

  4. Définir une variable avec ou sans export

  5. Comment faire une requête/un appel HTTP avec la charge utile JSON à partir de la ligne de commande ?

Enregistrez votre session terminale avec Asciinema

Imprimez de n'importe où avec CUPS sous Linux

Premiers pas avec Tmux

Appeler une fonction C à partir du code C++

Quand un fichier créé avec mkstemp() est supprimé ?

Comment puis-je faire en sorte que systemctl s'imprime en couleur lors d'une interaction avec un non-tty?