¿Cómo puedo cambiar entre ttys sin usar la pantalla?

17

Entonces, supongamos que inicia su instalación de Linux desde el escritorio. Inicia un gnome-terminal / konsole / lo que sea para que tenga un tty para ingresar comandos.

Ahora digamos que SSH en esa misma máquina. Me unirá a otro tty para ingresar comandos.

Ahora digamos que quiero "cambiar" mi tty de mi SSH original a la terminal gnome que comencé antes.

Básicamente, estoy preguntando si hay alguna manera de hacer lo mismo screen -xpero sin pantalla.

Sé que puede enviar fácilmente la salida al otro tty simplemente haciendo eco de algo en el archivo / dev, pero no conozco una forma de 'ver' lo que hay en el tty.

¿Algunas ideas?

usuario488244
fuente

Respuestas:

16

Tal vez este esquema pueda aclarar la situación. Esta es la configuración habitual:

                               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, …)

Y no hay forma de conectar algo nuevo Process3como este:

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

Lo que hace la pantalla (y otras) es asignar algún dispositivo pseudo terminal (como lo hace xterm) y redirigirlo a uno o más terminales "reales" (físicos, virtuales o emulados):

             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)

Utilizando screen -xpuede conectar un terminal más, xterm, lo que sea (digamos Terminal 3) a la sesión de pantalla.

Entonces, no, no puede comunicarse directamente a través de stdin / stdout con procesos conectados a un terminal diferente. Solo puede hacerlo a través del proceso que controla este terminal si resulta ser un pseudo terminal, y si este proceso fue concebido para hacerlo (como lo es la pantalla).

Stéphane Gimenez
fuente
Esa es una gran explicación! Creo que no es realmente una respuesta aquí, pero sería adecuada para esta pregunta . Una observación: "no hay manera" solo es cierto si usted lo prohíbe ptrace; gracias a ptraceprogramas como neercs, rettyetc., a veces podemos hacerlo.
Gilles 'SO- deja de ser malvado'
@Gilles: bien que lo hacen algo más: cambian el valor de los descriptores de archivos ( stdin, stdouta la derecha del esquema) directamente a través del secuestro del proceso. ¡Pura maldad!
Stéphane Gimenez
1
Hmm, tienes razón, cambian una flecha diferente. Malvado, pero conveniente!
Gilles 'SO- deja de ser malvado'
8

Volver a conectar los procesos en el otro terminal a su terminal actual no es posible sin trucos sucios. Es posible forzando el proceso para realizar ciertas llamadas al sistema (con ptrace); Esto hace que algunos programas se bloqueen. Hay varias herramientas que hacen esto, como neercs, retty, cryopid, reptyr, ...; ver ¿Cómo puedo rechazar un proceso en ejecución y asociarlo a un nuevo shell de pantalla? y preguntas vinculadas.

Obtener el resultado que ya se muestra en el otro terminal es un problema diferente. No existe una solución totalmente general: en principio, una vez que se ha procesado la salida, el terminal puede almacenarla solo como una imagen. En la práctica, todos los emuladores de terminal X mantienen su búfer de salida en forma de texto para que pueda copiarlo y pegarlo. La forma de obtener esa salida depende del emulador de terminal; La idea básica es simular la selección de todo el búfer de desplazamiento hacia atrás. Para una consola Linux como /dev/tty1, el búfer de desplazamiento hacia atrás está fácilmente disponible como /dev/vcs1(y /dev/vcsa1con atributos de texto).

La respuesta simple es que si desea volver a conectarse a un terminal desde un lugar diferente, use screeno tmux.

Gilles 'SO- deja de ser malvado'
fuente