Bagaimana saya bisa beralih antar ttys tanpa menggunakan layar?

17

Jadi katakanlah Anda mem-boot instalasi Linux sampai ke desktop. Anda memulai gnome-terminal / konsole / apa pun sehingga Anda memiliki tty untuk memasukkan perintah.

Sekarang katakanlah saya SSH ke mesin yang sama. Ini akan mengikat saya ke tty lain untuk memasukkan perintah.

Sekarang katakanlah saya ingin "mengalihkan" tty saya dari SSH asli saya ke terminal gnome yang dimulai sebelumnya.

Pada dasarnya saya bertanya apakah ada cara untuk melakukan hal yang sama screen -xtetapi tanpa layar?

Saya tahu Anda dapat dengan mudah mengirim output ke tty lain hanya dengan menggemakan sesuatu ke file / dev, tapi saya tidak tahu cara untuk 'melihat' apa yang ada di tty.

Ada ide?

pengguna488244
sumber

Jawaban:

16

Mungkin skema ini dapat mengklarifikasi situasinya. Ini adalah pengaturan yang biasa:

                               Terminal  (/dev/ttyX or /dev/pts/x)
                                device
                                   |
                    (screen)<--[<output]----x-------(stdout) Process1
        Terminal  (keyboard)---[input >]---o-\----->(stdin)
                                            \ \
(hardware console or                         \ `----(stdout) Process2
 virtual console or terminal                  `---->(stdin)
 emulators like xterm, …)

Dan tidak ada cara untuk plug baru Process3seperti ini:

                             Terminal
                              device
                                 |
             (screen)<---o---[<output]--x------(stdout) Process1
  Terminal (keyboard)---/-x--[input >]-o-\---->(stdin)
                       | /              \ \
                       | |               \ `---(stdout) Process2
                       | |                `--->(stdin)
                       | |
                       \ `---------------------(stdout) Process3
                        `--------------------->(stdin)

Apa yang dilakukan layar (dan lainnya) adalah mengalokasikan beberapa perangkat terminal semu (seperti halnya xterm) dan mengarahkannya ke satu atau lebih terminal "nyata" (fisik, virtual, atau ditiru):

             Terminal                   pseudo
             devices              ,--> Terminal (/dev/pts/x)
                |         _______/      device
Terminal <--[<output]--- |       |        |
 1       ---[input >]--> |screen | <--[<output]---x-----(stdout) Process1
                         |Process| ---[input >]--o-\--->(stdin)
Terminal <--[<output]--- |       |                \ \
 2       ---[input >]--> |_______|                 \ `--(stdout) Process2
                                                    `-->(stdin)

Menggunakan screen -xAnda dapat melampirkan satu terminal lagi, xterm, apa pun (katakanlah Terminal 3) ke sesi layar.

Jadi tidak, Anda tidak dapat berkomunikasi langsung melalui stdin / stdout dengan proses yang dilampirkan ke terminal yang berbeda. Anda hanya dapat melakukannya melalui proses yang mengendalikan terminal ini jika kebetulan itu adalah terminal semu, dan jika proses ini disetujui untuk melakukannya (seperti layar).

Stéphane Gimenez
sumber
Itu penjelasan yang bagus! Saya pikir ini bukan jawaban di sini, tapi akan cocok dengan pertanyaan ini . Satu pengamatan: "tidak ada jalan" hanya benar jika Anda melarang ptrace; terima kasih kepada ptrace, program suka neercs, rettydan sebagainya bisa melakukannya kadang-kadang.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles: baik mereka melakukan sesuatu yang lain: mereka mengubah nilai deskriptor file ( stdin, stdoutdi sebelah kanan skema) secara langsung dengan membajak proses. Kejahatan murni!
Stéphane Gimenez
1
Hmm, Anda benar, mereka mengubah panah yang berbeda. Jahat, tapi nyaman!
Gilles 'SO- stop being evil'
8

Menghubungkan kembali proses di terminal lain ke terminal Anda saat ini tidak dimungkinkan tanpa trik kotor. Dimungkinkan dengan memaksa proses untuk melakukan panggilan sistem tertentu (dengan ptrace); ini menyebabkan beberapa program macet. Ada beberapa alat yang melakukan hal ini, seperti neercs, retty, cryopid, reptyr, ...; lihat Bagaimana saya bisa menolaknya proses yang sedang berjalan dan menghubungkannya dengan shell layar baru? dan pertanyaan terkait.

Memperoleh output yang sudah ditampilkan di terminal lain adalah masalah yang berbeda. Tidak ada solusi yang sepenuhnya umum: pada prinsipnya, setelah output telah diberikan, terminal mungkin menyimpannya hanya sebagai gambar. Dalam praktiknya, semua emulator terminal X menyimpan buffer output dalam bentuk teks sehingga Anda dapat menyalin-menempelnya. Cara untuk mengambil output tergantung pada emulator terminal; ide dasarnya adalah mensimulasikan pemilihan seluruh buffer scrollback. Untuk konsol Linux seperti /dev/tty1, buffer scrollback mudah tersedia sebagai /dev/vcs1(dan /dev/vcsa1dengan atribut teks).

Jawaban sederhananya adalah jika Anda ingin menghubungkan kembali ke terminal dari tempat yang berbeda, gunakan screenatau tmux.

Gilles 'SANGAT berhenti menjadi jahat'
sumber