GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana perubahan ukuran terminal dikirim ke aplikasi baris perintah melalui ssh atau telnet?

Ini adalah dunia terminal semu yang berantakan.

Secara lokal, saat Anda mengubah ukuran terminal, grup proses latar depan Anda mendapatkan SIGWINCH dan Anda dapat menggunakan ioctl untuk mengambil ukuran baru. Tapi apa hubungannya dengan remote proses vim ?

Subjeknya cukup rumit tetapi intinya adalah server hapus (sshd) melakukan ini:

  1. Membuka perangkat terminal master menggunakan posix_openpt (atau openpty )
  2. Membuat anak baru (biasanya ini akan menjadi cangkang)
  3. Memutus koneksi terminalnya menggunakan setsid()
  4. Membuka perangkat terminal (dibuat pada langkah 1) yang menjadi terminal pengontrolnya
  5. Mengganti deskriptor standar (STDIN_FILENO dan teman-teman) dengan fd dari langkah 4

Pada titik ini apa pun yang ditulis oleh proses server ke sisi master berakhir sebagai input ke sisi slave TETAPI dengan disiplin garis terminal jadi kernel melakukan sedikit keajaiban - seperti mengirim sinyal - saat menulis kombinasi tertentu, dan Anda juga dapat mengeluarkan ioctl panggilan dengan efek yang berguna.

Cara terbaik untuk memikirkan hal ini adalah menjelajahi openssh suite.

  • Klien memantau SIGWINCH - lihat clientloop.c dan setel received_window_change_signal = 1 saat menerimanya

  • Fungsi client_check_window_change periksa bendera itu dan beri tahu server :

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

Jadi sekarang server harus menerima paket yang menentukan ukuran (berpotensi baru).

  • Server memanggil pty_change_window_size dengan ukuran yang diterima yang benar-benar ajaib:

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

Ini mengatur ukuran jendela baru dari budak. Jika ukuran baru berbeda dari yang lama, kernel mengirimkan kode SIGWINCH ke grup proses latar depan terkait dengan pty itu. Jadi vim juga mendapatkan sinyal itu dan dapat memperbarui idenya tentang ukuran terminal.


Linux
  1. Bagaimana Cara Mendapatkan Hitungan File Dalam Direktori Menggunakan Baris Perintah?

  2. Bagaimana Cara Membunuh Baris Perintah Chromium Melalui Ssh?

  3. Cara Mengatur Pengaturan Proxy di baris perintah atau Terminal Linux

  1. Bagaimana saya bisa memberikan kata sandi SSH ke SVN di baris perintah?

  2. Bagaimana cara mendapatkan URL file Dropbox dari baris perintah?

  3. Bagaimana cara mendapatkan alamat IP saya dari baris perintah?

  1. Cara Memeriksa Ukuran Ram di Baris Perintah Linux di Gb

  2. Bagaimana Argumen Baris Perintah Jarak Jauh Ssh Diurai?

  3. Cara mendapatkan ukuran direktori di Linux