GNU/Linux >> Tutoriels Linux >  >> Linux

Comment les modifications de la taille du terminal sont-elles envoyées aux applications en ligne de commande via ssh ou telnet ?

C'est le monde désordonné des pseudo-terminaux.

Localement, lorsque vous redimensionnez votre terminal, votre groupe de processus de premier plan obtient un SIGWINCH et vous pouvez utiliser ioctl pour récupérer la nouvelle taille. Mais qu'est-ce que cela a à voir avec la télécommande processus vim ?

Le sujet est assez compliqué mais l'essentiel est que le serveur de suppression (sshd) fait ceci :

  1. Ouvre un périphérique pseudo-terminal maître à l'aide de posix_openpt (ou openpty )
  2. Fork un nouvel enfant (ceci est généralement appelé à devenir un shell)
  3. Coupe sa connexion terminale en utilisant setsid()
  4. Ouvre le terminal (créé à l'étape 1) qui devient son terminal de contrôle
  5. Remplace les descripteurs standards (STDIN_FILENO et amis) avec le fd de l'étape 4

À ce stade, tout ce que le processus serveur écrit côté maître finit comme entrée côté esclave MAIS avec une discipline de ligne terminale donc le noyau fait un peu de magie - comme envoyer des signaux - lors de l'écriture de certaines combinaisons, et vous pouvez également émettre ioctl appels avec des effets utiles.

La meilleure façon d'y penser est d'explorer les openssh suite.

  • Le client surveille SIGWINCH - voir clientloop.c et définit received_window_change_signal = 1 quand il le reçoit

  • La fonction client_check_window_change vérifie ce drapeau et indique au serveur :

    packet_start(SSH_CMSG_WINDOW_SIZE);
    packet_put_int((u_int)ws.ws_row);
    ...
    

Alors maintenant, le serveur devrait recevoir un paquet qui spécifie une taille (potentiellement nouvelle).

  • Le serveur appelle pty_change_window_size avec les tailles reçues qui font la vraie magie :

    struct winsize w;
    w.ws_row = row;
    ...
    (void) ioctl(ptyfd, TIOCSWINSZ, &w); /* This is it! */
    

Cela définit la nouvelle taille de fenêtre de l'esclave. Si la nouvelle taille diffère de l'ancienne, le noyau envoie un SIGWINCH au groupe de processus de premier plan associé à ce pty. Ainsi vim reçoit également ce signal et peut mettre à jour son idée de la taille du terminal.


Linux
  1. Comment vérifier la taille de la RAM dans la ligne de commande Linux en Go

  2. Comment obtenir un nombre de fichiers dans un répertoire à l'aide de la ligne de commande ?

  3. Comment obtenir la taille du répertoire sous Linux

  4. Comment définir les paramètres proxy sur la ligne de commande ou le terminal Linux

  5. Comment puis-je obtenir le nombre d'images dans une vidéo sur la ligne de commande Linux ?

4 applications de prise de notes en ligne de commande pour Linux

Comment obtenir la taille d'un répertoire sous Linux

Comment utiliser Telnet sous Windows

Comment créer un fichier sous Linux à l'aide d'un terminal/ligne de commande

Comment utiliser du Command sous Linux

Comment obtenir la taille d'un fichier/dossier avec SSH sous Linux ?