GNU/Linux >> Znalost Linux >  >> Linux

Jak se změny velikosti terminálu odesílají do aplikací příkazového řádku přes ssh nebo telnet?

Toto je chaotický svět pseudoterminálů.

Lokálně, když změníte velikost terminálu, vaše skupina procesů v popředí dostane SIGWINCH a můžete použít ioctl pro načtení nové velikosti. Ale co to má společného s dálkovým ovladačem vim proces?

Předmět je poměrně komplikovaný, ale podstatou je, že server pro odebrání (sshd) dělá toto:

  1. Otevře hlavní psedoterminální zařízení pomocí posix_openpt (nebo openpty )
  2. Rozdělí nové dítě (obvykle se z toho stane shell)
  3. Přeruší své terminálové připojení pomocí setsid()
  4. Otevře koncové zařízení (vytvořené v kroku 1), které se stane jeho ovládacím terminálem
  5. Nahrazuje standardní deskriptory (STDIN_FILENO a přátelé) s fd z kroku 4

V tomto okamžiku vše, co proces serveru zapíše na hlavní stranu, skončí jako vstup na podřízenou stranu, ALE s disciplínou terminálové linky takže jádro dělá při psaní určitých kombinací trochu magie - jako je odesílání signálů - a můžete také vydat ioctl volání s užitečnými efekty.

Nejlepší způsob, jak o tom přemýšlet, je prozkoumat openssh apartmá.

  • Klient sleduje SIGWINCH - viz clientloop.c a nastaví received_window_change_signal = 1 když jej obdrží

  • Funkce client_check_window_change zkontroluje příznak a řekne to serveru :

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

Nyní by tedy měl server obdržet paket, který specifikuje (potenciálně novou) velikost.

  • Server volá pty_change_window_size s přijatými velikostmi, což dělá skutečné kouzlo:

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

Tím se nastaví nová velikost okna slave. Pokud se nová velikost liší od staré, jádro odešle SIGWINCH do skupiny procesů v popředí spojené s tím pty. Tedy vim také dostane tento signál a může aktualizovat svou představu o velikosti terminálu.


Linux
  1. Jak zkontrolovat velikost RAM v příkazovém řádku Linuxu v GB

  2. Jak získat počet souborů v adresáři pomocí příkazového řádku?

  3. Jak získat velikost adresáře v Linuxu

  1. Jak mohu zadat heslo SSH do SVN na příkazovém řádku?

  2. Jak získám svou IP adresu z příkazového řádku?

  3. SSH - Jak zahrnout příkaz -t do souboru ~/.ssh/config

  1. Jak se analyzují argumenty vzdáleného příkazového řádku Ssh?

  2. Jak zabít příkazový řádek Chromium přes Ssh?

  3. Jak nastavit nastavení proxy na příkazovém řádku nebo terminálu Linuxu