¿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?



¿Es este un duplicado de unix.stackexchange.com/questions/8469/… ?
mattdm

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).


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.