¿Qué se almacena en los archivos / dev / pts y podemos abrirlos?


73

Según mi conocimiento, los /dev/ptsarchivos se crean para sesiones ssh o telnet.


66
echo Hello > /dev/pts/1... Mira lo que pasa, es tu terminal.
Sepahrad Salour


1
@SepahradSalour uno tiene que adaptar el número de pts a su contexto. mi sshd ha usado / dev / pts / 30 para mi sesión.
Gab 是 好人

2
@Gab 是 好人 Para obtener la ubicación de su terminal actual, puede usar el comando tty.
JeromeJ

Respuestas:


110

Nada se almacena en /dev/pts. Este sistema de archivos vive puramente en la memoria.

Las entradas en /dev/ptsson pseudo-terminales (pty para abreviar). Los núcleos Unix tienen una noción genérica de terminales . Un terminal proporciona una forma para que las aplicaciones muestren salida y reciban entrada a través de un dispositivo terminal . Un proceso puede tener un terminal de control : para una aplicación en modo texto, así es como interactúa con el usuario.

Los terminales pueden ser terminales de hardware ("tty", abreviatura de "teletipo") o pseudo-terminales ("pty"). Los terminales de hardware están conectados a través de alguna interfaz, como un puerto serie ( ttyS0, ...) o USB ( ttyUSB0, ...) o sobre una pantalla y teclado de PC ( tty1, ...). Los pseudo terminales son proporcionados por un emulador de terminal, que es una aplicación. Algunos tipos de pseudo terminales son:

  • Las aplicaciones GUI como xterm, gnome-terminal, konsole, ... transforman los eventos del teclado y el mouse en entrada de texto y muestran la salida gráficamente en alguna fuente.
  • Las aplicaciones multiplexoras, como la pantalla y la entrada y salida del relé tmux desde y hacia otro terminal, para desacoplar las aplicaciones en modo de texto del terminal real.
  • Las aplicaciones de shell remotas como sshd, telnetd, rlogind, ... transmiten entrada y salida entre un terminal remoto en el cliente y una pty en el servidor.

Si un programa abre un terminal para escribir, la salida de ese programa aparece en el terminal. Es común tener varios programas que salen a un terminal al mismo tiempo, aunque esto puede ser confuso a veces ya que no hay forma de saber qué parte de la salida proviene de qué programa. Los procesos en segundo plano que intentan escribir en su terminal de control pueden suspenderse automáticamente por una señal SIGTTOU .

Si un programa abre un terminal para leer, la entrada del usuario se pasa a ese programa. Si varios programas leen desde el mismo terminal, cada carácter se enruta independientemente a uno de los programas; Esto no es recomendable. Normalmente solo hay un único programa que lee activamente desde el terminal en un momento dado; los programas que intentan leer desde su terminal de control mientras no están en primer plano son suspendidos automáticamente por una señal SIGTTIN .

Para experimentar, corre ttyen un terminal para ver cuál es el dispositivo terminal. Digamos que es /dev/pts/42. En un shell en otra terminal, ejecute echo hello >/dev/pts/42: la cadena hellose mostrará en la otra terminal. Ahora ejecuta cat /dev/pts/42y escribe la otra terminal. Para eliminar ese catcomando (que hará que el otro terminal sea difícil de usar), presione Ctrl+ C.

Escribir en otro terminal es ocasionalmente útil para mostrar una notificación; por ejemplo, el writecomando hace eso. La lectura desde otra terminal no se realiza normalmente.


O no entiendo lo que estás tratando de decir o tu información está apagada. Los procesos en segundo plano que escriben en el terminal no generarán un SIGTTIN. Tampoco pueden leer varios programas desde el terminal al mismo tiempo (su afirmación de que "cada carácter se enruta de forma independiente"). Solo un programa puede leer desde el terminal en cualquier momento, y un intento de un programa en segundo plano para leer desde ese terminal dará como resultado un SIGTTIN. Ese es el único caso donde SIGTTIN se envía automáticamente.
Patrick

Tampoco puedes leer desde otro terminal. Hacerlo sería una vulnerabilidad de seguridad significativa, ya que sería capaz de interceptar datos. Puede straceleer el programa de entrada, pero eso es todo.
Patrick

44
@Patrick Los procesos en segundo plano que escriben en el terminal obtienen SIGTTOU, eso fue un error tipográfico. Múltiples programas pueden leer desde el terminal al mismo tiempo (pruébelo y vea, como lo describo en el siguiente párrafo; debe hacerlo desde un proceso cuyo terminal de control no sea ese terminal). Sí, puedes leer desde otra terminal, siempre que te pertenezca, ¿por qué crees que eso sería imposible?
Gilles 'SO- deja de ser malvado'

Los procesos en segundo plano que escriben en el terminal solo obtienen SIGTTOU si se establece el tostopindicador tty. Esta bandera no está configurada por defecto. Y estoy corregido en la lectura de otro TTY. Lo probé y funciona, pero es por lectura, no por personaje (cuando se está sentado en un indicador de shell, son lo mismo que los shells leen 1 carácter a la vez). Podría ser bueno aclarar este punto, ya que así es como interpreté su respuesta.
Patrick

2
@Patrick Claro, una readllamada solo devolverá caracteres consecutivos (o más bien bytes, debería decir), pero la aplicación no tiene control sobre cuántos bytes readdevolverá una llamada, por lo que no es mejor.
Gilles 'SO- deja de ser malvado'

18

Los archivos en /dev/ptsson "pseudo-ttys". Hasta cierto punto, son como tuberías con nombre, pero también imitan terminales de conexión en serie antiguas, como los VT-100. Los pseudo-ttys hacen el trabajo de transferir bytes del teclado al programa y del programa al dispositivo de salida, lo que suena simple. Pero eso responde a su pregunta explícita: el núcleo no almacena nada, /dev/pts/0por ejemplo. Solo entran secuencias de bytes desde stdout de un programa conectado a pseudo-tty, y los programas cuyo stdin está conectado a la misma pseudo-tty leen esos bytes.

Los pseudo-ttys también ponen una capa de indirección en esos flujos de bytes. El núcleo puede inspeccionar bytes para valores especiales como "Control-C" o "Control-D" o "Control-U" (que son todos configurables, ver man stty) y enviar un SIGINT, establecer el final del archivo en stdin, o borrar Una línea en la entrada. También hay una función de almacenamiento intermedio en algún lugar, por lo que mi "no almacena nada" está algo mal, pero solo por unos pocos kilobytes.

El kernel puede inspeccionar los valores de bytes en la salida y hacer cosas como convertir una nueva línea (salto de línea ASCII, LF o "\n") en dos bytes, retorno de carro y salto de línea (CRLF o "\r\n"), o los bytes que requiera un hardware de terminal en serie. La indirección de un pseudo-tty permite la independencia del hardware.

Los pseudo-ttys también permiten todas las " ioctl()llamadas en baudios establecidas", "establecer paridad", etc. Esto permite que los programas que se escribieron en el día de los VT-100, ADM-3 y Wyse continúen funcionando sin errores. El software, el controlador de dispositivo pseudo-ttys, actúa como hardware.

Los pseudo-ttys pueden ser utilizados por sshdy telnet, pero también se usan entre un emulador de terminal (como xtermo rxvt) y el shell que generalmente se ejecuta dentro del xterm.

Linux y muchos Unixes tienen pseudo-ttys. El plan 9 no. Los pseudo-ttys son un poco una reliquia, sobrante de los días de los terminales de hardware conectados por cable serie.


13

/dev/es un directorio especial para archivos de dispositivo. Estas son abstracciones, no son archivos reales en el disco. El directorio está poblado en el arranque y puede cambiar para reflejar las interfaces de dispositivos existentes, que son creados y destruidos por el núcleo y un demonio de espacio de usuario, udevd.

Muchos de los dispositivos así representados son virtuales. Esto incluye las entradas en /dev/pts, que son dispositivos de consola. Es por eso que se crea uno para sesiones remotas; también se crean cuando abre una terminal de GUI local.

Puede abrirlos como archivos, aunque no tiene mucho valor de uso. Para obtener el /dev/ptsnodo al que está conectado su shell, use tty:

> tty
/dev/pts/4

Ahora cambie a otra consola e intente:

> echo "duck!" > /dev/pts/4

Inteligente. Ahora intenta:

> cat /dev/pts/4

Luego intente y use el shell en / dev / pts / 4. Estás atascado hasta que salgas del catotro lado, pero la mayoría de lo que escribes en pts / 4 pasará (por ejemplo, intentando "hola mundo" con el que terminé hlen pts / 4 y ello worden la catconsola).

Mi conjetura aquí es que el dispositivo está recibiendo información del shell y emitiéndola a través del sistema, que es cómo las cosas terminan en la pantalla: el shell no se trata de hardware, el sistema sí. Intenta strace bash(y mira man stracesi no sabes lo que es); obtienes una ráfaga preliminar de llamadas cuando se inicia bash. Ahora comienza a presionar las teclas:

read(0, "h", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "e", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "y", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0

Por cada letra escrita hay una lectura de entrada estándar y una escritura en salida estándar. ¿Pero a qué está conectado el estándar del shell? Ahora pruebe stracecon su terminal GUI: tendrá que averiguar el nombre si no lo sabe, por ejemplo, en KDE konsole, y gnome-terminalcreo que GNOME tiene el nombre . El resultado de eso stracees probablemente más críptico: el mío tiene muchos poll()y recvfrom(). No veo ninguna escritura, pero si ahora saca el cattruco de otra terminal, notará que cuando escribe, las pulsaciones de teclas que lee cat no provocan ninguna respuesta en la salida de strace: la terminal no está ' t recibiéndolos. Por lo tanto, la aplicación de terminal GUI y cat compiten para leer desde el mismo dispositivo, en el que el shell está emitiendo.


¿Cuál es el uso de 'cat / dev / pts / 4' cuando estamos atascados y por qué estamos atascados al ejecutar este comando?
user2720323

Agregué algunos párrafos para tratar de explicar esto.
Ricitos de oro
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.