¿Es posible abrir un terminal con tty / pty especificado

9

(Estoy usando Ubuntu.) En mi opinión, tty es solo una especie de puerto. Ingresas algo y debería generar algo. Y un terminal (emulador) es un software que maneja esas entradas y salidas. Literalmente, la terminal puede elegir a qué puerto conectarse.

Vi muchos archivos tty en / dev y muchos archivos pts en / dev / pts / No sé por qué hay tantos. ¿Se están utilizando todos?

Si no, ¿puedo iniciar un terminal con pty especificado?

p.ej gnome-terminal /dev/pts/47

Actualizar

La razón por la que hago esto es porque quiero tener un terminal remoto. Sé que el enfoque apropiado es usar ssh o telnet.

Pero para el acceso temporal, no es muy conveniente. Quiero usar socat para reenviar un tty o pty al cliente. Entonces el cliente puede iniciar un terminal con ese pty o tty.

El siguiente código funciona bien. Se ejecuta en el cliente y en el lado del servidor me sale "hola".

echo "hello" > /home/myhomefoler/pty_created_by_socat
Worldterminator
fuente

Respuestas:

9

En UNIX, un tty (como muchas otras cosas) aparece como un archivo. Los datos escritos en el dispositivo tty van al terminal y los datos que provienen del terminal están disponibles para leer en el tty.

Si el tty es un puerto serie de hardware, los datos escritos en él se envían por cable y los datos que provienen del cable aparecen en el tty.

Si el tty es la consola de video de una máquina, los datos escritos en él se muestran en la pantalla y los datos que provienen del teclado aparecen en el tty.

Si el tty es un pseudo-tty (terminal virtual) conectado a un emulador de terminal X, por ejemplo gnome-terminal, los datos escritos en él se entregan al software del emulador de terminal X y, a su vez, se muestran en una ventana, mientras que los datos escritos en esa ventana están disponibles para leer en la terminal virtual. Se dice que el software está conectado al extremo "maestro" del pseudo-terminal. Los terminales reales no tienen un extremo "maestro" porque hay un dispositivo real detrás de ellos (como el puerto serie), no un dispositivo virtual implementado por una pieza de software.

Entonces ya puede ver que no tendría sentido pedirle a un emulador de terminal X que opere en un dispositivo tty arbitrario como /dev/ttyS0(un puerto serie real, en Linux). Debe ser un pseudo-tty.

Pero, ¿puede el emulador de terminal elegir la ID numérica del dispositivo pseudo-terminal que utiliza? En principio, sería posible que un kernel lo permitiera, pero de hecho la interfaz del kernel para asignar un nuevo pseudo-terminal no lo admite: el kernel toma su propia decisión. (En el modelo SysV, los pesudo terminales se crean abriendo un dispositivo especial llamado /dev/ptmxy el dispositivo pseudo terminal disponible con el número más bajo se asigna automáticamente).

Pero: ¿por qué necesitaría elegir el número del dispositivo pseudo-terminal que se asigna? El núcleo elige uno no utilizado que está garantizado para estar disponible y ser utilizable. ¿Tiene alguna razón por la que preferiría si eligiera una diferente?

En cuanto a usted otra pregunta:

Vi muchos archivos tty en / dev y muchos archivos pts en / dev / pts / No sé por qué hay tantos. ¿Se están utilizando todos?

Depende del sistema. En algunos sistemas, todos los dispositivos pseudo-terminales posibles están pre-creados en /dev/ptso /dev, estén o no en uso. En otros, los nodos del dispositivo solo existen si el pseudo-terminal está en uso. Dices que estás usando Ununbu, que usa Linux, que es el último tipo. Entonces, sí, todos los nodos de dispositivos que ve /dev/ptsestán actualmente en uso.

Pero para el acceso temporal, no es muy conveniente. Quiero usar socat para reenviar un tty o pty al cliente. Entonces el cliente puede iniciar un terminal con ese pty o tty.

Si desea que socatcualquier otra pieza de software se conecte al extremo maestro de un pseudo-terminal, entonces necesita que ese software lo respalde específicamente. Pero tienes suerte porque socatsí. Por ejemplo, si ejecuto:

socat PTY,link=/tmp/socat.pty TCP-LISTEN:2222 &
sleep 1 && ( setsid bash ) </tmp/socat.pty >/tmp/socat.pty 2>&1

Puedo obtener un shell conectándome al puerto 2222 desde otro lugar. ¡Muy peligroso desde el punto de vista de la seguridad!

Celada
fuente