¿Cómo puedo conectarme a la salida de un terminal desde otro terminal?

45

Necesito conectarme a la salida del terminal que se está ejecutando actualmente (tty1) desde el terminal virtual y capturarlo (ejecutar el servidor X).

Pruzinat
fuente
55
Si bien entiendo que a veces surge la necesidad de capturar contenido en otro tty después de que se ejecuta un comando, vale la pena curarlo, así que siempre considere comenzar a usar screeno tmuxantes de comenzar un comando al que desee acceder desde otro terminal .
depquid
Y cuando pueda prepararlo antes, tal vez también tmate sería un buen candidato que incluso funciona a través de Internet y no solo a nivel local. (y tiene acceso de escritura opcional)
rugk

Respuestas:

23

Me encontré con esta herramienta llamada ttylog. Es un programa Perl disponible en CPAN aquí . Tiene un par de advertencias, una de ellas es que solo pude descubrir cómo conectarme a una terminal que fue creada como parte de alguien que entra en mi caja. El otro es que debe ejecutarlo con privilegios elevados (es decir, root o sudo).

¡Pero funciona!

Por ejemplo

Primero ssh en su caja en el TÉRMINO # 1:

TERM#1% ssh saml@grinchy

Tenga en cuenta este nuevo terminal tty:

TERM#1% tty
/dev/pts/3

Ahora en otra terminal (TERM # 2) ejecuta este comando:

TERM#2% ttylog pts/3
DEBUG: Scanning for psuedo terminal pts/3
DEBUG: Psuedo terminal [pts/3] found.
DEBUG: Found parent sshd pid [13789] for user [saml]

Ahora regrese al TÉRMINO # 1 y escriba cosas, aparecerá en el TÉRMINO # 2.

ss de terminales

Todos los comandos que probé (top, ls, etc.) funcionaron sin incidentes ttylog.

slm
fuente
Exactamente lo que estaba buscando (lo he usado en el pasado, pero olvidé el nombre y no pude recordarlo). Muchas gracias, utilicé temporalmente la opción sucia (gdb y replicación de salida).
pruzinat
Sí, gdbfue la primera opción con la que me encontré, la he usado yo mismo en el pasado, pero al menos para mí es hacky. ¡Me alegra que esto te haya ayudado!
slm
1
ttylog parece que no puede asociar al proceso correcto aunque - qué responder a mi pregunta: serverfault.com/questions/560972/...
LittleBobbyTables
21

De hecho, es. Los dispositivos / dev / vcs * y / dev / vcsa * corresponden a los dispositivos / dev / tty * (los terminales virtuales). F1 = tty1 = vcs1 / vcsa1 y así sucesivamente. El vcs / vcsa es como tty para el terminal virtual "actual".

Como root, puede simplemente conectar estos dispositivos (p. Ej. Cat / dev / vcs2) y ver qué hay en el VT correspondiente (p. Ej. / Dev / tty2 el encendido en F2) como tomar una instantánea. vcsa * difiere de vcs * en que incluyen información sobre las dimensiones del terminal (la pantalla). Eso sí, es solo una instantánea de los personajes tal como se muestran en la pantalla, reunidos de la memoria asignada al terminal, por lo que no esperes una salida agradable y fácil de analizar.

El inconveniente es que si la información pasa demasiado rápido, puede ser difícil capturarla. ¿Quizás tail -f / dev / vcs1 funcionará si necesita seguir varios screenfulls (no lo he probado)? Puede ser más fácil simplemente redirigirlo primero a un archivo. También puede ser una buena idea usar un VT (F1-F6) para verlo, ya que los terminales tendrán las mismas dimensiones. En mi experiencia, es mejor usar los dispositivos vcs *, no vcsa *.

Si eso no funciona, quizás funcione uno de los paquetes de "gran hermandad" que permite que un administrador vigile la actividad en un terminal.

PD: Olvidé preguntar qué sistema operativo usas. Esto es para Linux, aunque probablemente también existan dispositivos similares en otros sistemas operativos. Intente buscar "memoria de consola virtual" entre las páginas de manual para dispositivos.

Baard Kopperud
fuente
¿Hay alguna forma de inyectar entrada en tty1 desde ssh? Por ejemplo, necesito trabajar con un raspberry pi que ejecuta Debian, pero el problema es que solo tiene un puerto usb, está ocupado por el adaptador wifi, por lo que no puedo conectar físicamente un teclado para usar tty1 con él. Como necesito ejecutar un script que, durante el proceso de ejecución, se apaga wlan0, en realidad tengo una situación de atrapar 22 tratando de depurar dónde falla este script. Supongamos que no puedo usar un hub usb ... ¿hay alguna forma de canalizar caracteres en / dev / tty1 de alguna manera?
Steven Lu
2
Bien. Puedo canalizar cosas /dev/tty1como root, pero todo esto es mostrar los caracteres en la pantalla, no ingresarlos
Steven Lu
1
Lo siento si esto es solo ruido. No es realmente 100% relevante. Pero respondí mi pregunta en el comentario anterior con esto
Steven Lu
18

mirar:

man 1 script

por ejemplo:

script -f /dev/tty1
Robert
fuente
Yo estaba buscando esto. Intentando unir por screenfallado miserablemente. Funciona.
sdkks
5

Use el ttycomando en cada terminal para identificarlos:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

Suponiendo estos TTY, para redirigir el stdout del primero al segundo, ejecute esto en el primer terminal:

exec 1>/dev/pts/1

Nota: Ahora cada salida de comando se mostrará en pts / 1

Para restaurar el comportamiento predeterminado stdout de pts / 0:

exec 1>/dev/pts/0

Vea este video para una demostración.

Vitalie Ghelbert
fuente
2

Esto funcionó para mí:

  • Usando un teclado en la computadora "A" (es decir, la computadora física que se va a controlar), ejecute: screen -q

  • Conéctese sshdesde la computadora "B" a la computadora "A".

  • En la sesión ssh, escriba: screen -lspara obtener una identificación de sesión para conectarse (4 dígitos en la fila que contiene tty ).

  • Conéctese a la sesión anterior con: screen -x <session id>... utilizando el número de identificación de sesión recibido del screen -lscomando anterior.

Todo lo que se escriba en cualquiera de las "sesiones" ocurrirá en ambas "sesiones", por lo que, por ejemplo, al escribir screen -dse cerrarán AMBAS sesiones.

Ixx
fuente
1

Otro enfoque es utilizar la screenutilidad gnu en su máquina local. Invoque con la -Lopción, o comience sin esa opción y use la ^aHsecuencia de comandos. Cualquiera de los dos enfoques hace que todas las entradas y salidas se registren en un archivo llamado screenlog.xdonde x es el número de pantalla.

Esto es útil porque no es necesario instalar nada adicional en la máquina remota.

Chris Johnson
fuente
1

Como no comencé tty1 con la pantalla, este script ayudó:

Utilicé la respuesta de Baard Kopperud arriba. "128" es 1 línea de mi tty1. El sueño se puede establecer en un número apropiado.

#!/bin/bash
while true
do
    sudo tail -c 128 /dev/vcs1 && echo ""
    sleep 10
done

Usé esto en terminador y dimensioné la columna para que el desplazamiento sea una línea de texto.

Jeff T
fuente
Gracias por la idea, en el rasperry simplemente tuve que hacer '' 'watch cat / dev / vcs' '' Para ver un proceso comencé en una consola virtual olvidando usar 'screen'. Y acabo de ajustar mi terminal de gnomo, ejecuté esto para tener 80 caracteres de ancho.
axkibe
0

Abrir dos terminales. Escriba ttycada uno y obtendrá su identificación como/dev/pts/nº

Luego, en el primero escribes script -f /dev/pts/nºofSecondTerminaly en el segundo haces lo contrario script -f /dev/pts/nºofFirstTerminalpara que se vinculen

Felicidades! Ambas terminales emiten y reciben las mismas cosas. ¿Necesitas un tercero? Bueno, ¿has estudiado combinaciones? Necesitarás 6 script -fcomandos. ¿Aún más tty? Pronto...

Marcelo Teixeira Ruggeri
fuente