GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo se envían los cambios de tamaño del terminal a las aplicaciones de línea de comandos a través de ssh o telnet?

Este es el desordenado mundo de las pseudo terminales.

Localmente, cuando cambia el tamaño de su terminal, su grupo de procesos en primer plano obtiene un SIGWINCH y puedes usar ioctl para obtener el nuevo tamaño. Pero, ¿qué tiene esto que ver con el control remoto proceso vim ?

El tema es bastante complicado, pero la esencia es que el servidor de eliminación (sshd) hace esto:

  1. Abre un dispositivo pseudoterminal maestro usando posix_openpt (o openpty )
  2. Bifurca a un niño nuevo (por lo general, esto se convierte en un caparazón)
  3. Corta su conexión terminal usando setsid()
  4. Abre el dispositivo terminal (creado en el paso 1) que se convierte en su terminal de control
  5. Reemplaza los descriptores estándar (STDIN_FILENO y amigos) con el fd del paso 4

En este punto, cualquier cosa que el proceso del servidor escriba en el lado maestro termina como entrada en el lado esclavo PERO con una disciplina de línea terminal por lo que el núcleo hace un poco de magia, como enviar señales, al escribir ciertas combinaciones, y también puede emitir ioctl llamadas con efectos útiles.

La mejor manera de pensar en esto es explorar el openssh suite.

  • El cliente monitorea para SIGWINCH - ver clientloop.c y establece received_window_change_signal = 1 cuando lo recibe

  • La función client_check_window_change comprueba esa bandera y le dice al servidor :

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

Así que ahora el servidor debería recibir un paquete que especifica un tamaño (potencialmente nuevo).

  • El servidor llama a pty_change_window_size con los tamaños recibidos que hace la verdadera magia:

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

Esto establece el nuevo tamaño de ventana del esclavo. Si el nuevo tamaño difiere del anterior, el kernel envía un SIGWINCH al grupo de procesos en primer plano asociado con ese pty. Así vim también recibe esa señal y puede actualizar su idea del tamaño del terminal.


Linux
  1. ¿Cómo obtener un recuento de archivos en un directorio usando la línea de comando?

  2. ¿Cómo se analizan los argumentos de la línea de comandos remotos de Ssh?

  3. ¿Cómo matar la línea de comando de Chromium sobre Ssh?

  4. Cómo obtener el tamaño del directorio en Linux

  5. ¿Cómo puedo proporcionar una contraseña SSH a SVN en la línea de comandos?

4 aplicaciones de línea de comandos para tomar notas para Linux

Cómo obtener el tamaño de un directorio en Linux

Cómo usar Telnet en Windows

Cómo crear un archivo en Linux usando Terminal/Línea de comando

Cómo usar du Command en Linux

¿Cómo obtener el tamaño de archivo/carpeta con SSH en Linux?