GNU/Linux >> Linux Esercitazione >  >> Linux

In che modo le modifiche alle dimensioni del terminale vengono inviate alle applicazioni della riga di comando tramite ssh o telnet?

Questo è il mondo disordinato degli pseudo terminali.

Localmente, quando ridimensioni il tuo terminale, il tuo gruppo di processi in primo piano riceve un SIGWINCH e puoi usare ioctl per recuperare la nuova dimensione. Ma cosa c'entra questo con il telecomando processo vim ?

L'argomento è piuttosto complicato, ma il succo è che il server di rimozione (sshd) fa questo:

  1. Apre un dispositivo pseudoterminale master utilizzando posix_openpt (o openpty )
  2. Forcia un nuovo figlio (tipicamente questo è destinato a diventare un guscio)
  3. Interrompe la sua connessione al terminale usando setsid()
  4. Apre il dispositivo terminale (creato nel passaggio 1) che diventa il suo terminale di controllo
  5. Sostituisce i descrittori standard (STDIN_FILENO e amici) con fd del passaggio 4

A questo punto tutto ciò che il processo del server scrive sul lato master finisce come input sul lato slave MA con una disciplina della linea terminale quindi il kernel fa un po' di magia - come inviare segnali - quando scrive determinate combinazioni, e puoi anche emettere ioctl chiamate con effetti utili.

Il modo migliore per pensarci è esplorare il openssh suite.

  • Il client controlla SIGWINCH - vedi clientloop.c e imposta received_window_change_signal = 1 quando lo riceve

  • La funzione client_check_window_change controlla quel flag e lo comunica al server :

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

Quindi ora il server dovrebbe ricevere un pacchetto che specifica una dimensione (potenzialmente nuova).

  • Il server chiama pty_change_window_size con le dimensioni ricevute che fa la vera magia:

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

Questo imposta la nuova dimensione della finestra dello slave. Se la nuova dimensione differisce dalla vecchia, il kernel invia un SIGWINCH al gruppo di processi in primo piano associato a quel pty. Quindi vim riceve anche quel segnale e può aggiornare la sua idea della dimensione del terminale.


Linux
  1. Come ottenere un conteggio di file in una directory utilizzando la riga di comando?

  2. Come vengono analizzati gli argomenti della riga di comando remota Ssh?

  3. Come uccidere la riga di comando di Chromium su Ssh?

  4. Come ottenere la dimensione della directory in Linux

  5. Come impostare le impostazioni proxy sulla riga di comando di Linux o sul terminale

4 applicazioni per prendere appunti da riga di comando per Linux

Come ottenere la dimensione di una directory in Linux

Come utilizzare Telnet su Windows

Come creare un file in Linux utilizzando Terminale/riga di comando

Come usare du Command in Linux

Come ottenere le dimensioni di file/cartelle con SSH su Linux?