¿Hay alguna forma de controlar a qué pseudoterminal (/dev/pts/*) se proporciona una conexión? Por ejemplo, tengo varios clientes ligeros, cada uno de los cuales ejecuta sesiones de terminal individuales en un servidor RHEL a través de SSH. Me gustaría configurar algo para que el cliente ligero A siempre tenga asignado /dev/pts/7 y el cliente ligero B siempre sea /dev/pts. /8. He estado intentando crear una regla udev pero udevinfo solo devuelve "no se pudo obtener el dispositivo de clase" cuando lo ejecuto con el ID del terminal. No estoy seguro de cómo crear una regla si el dispositivo no está realmente clasificado en udev. .
Respuesta1
Linux normalmente utiliza la interfaz pseudoterminal Unix 98. Las entradas /dev/pts
se asignan fuera del control de la aplicación. Se abre una aplicación que quiere crear un pseudoterminal (aquí el servidor SSH) /dev/ptmx
, que asigna un pseudoterminal y le devuelve un descriptor de archivo. El número de pseudoterminal (el número después de /dev/pts/
) determinado cuando se asigna el pseudoterminal; está vinculado al índice del pseudoterminal en una estructura de datos del núcleo.
(Si tienes curiosidad, el código del kernel esptmx_open
endrivers/tty/pty.c
, que llamadevpts_new_index
enfs/devpts/inode.c
, que utilizaida_get_new
enlib/idr.c
. Esto devuelve el primer número disponible, aunque no hay garantía de que siempre lo haga).
Ni la API de C ni la API del kernel permiten que el creador del pseudoterminal pase un parámetro que pueda influir en el resultado.
Es posible obtener un pty estático utilizando la API BSD heredada que produce ptys de la forma (maestro) y (esclavo). Esto requeriría como mínimo volver a compilar el servidor SSH sin la configuración para forzarlo a usar ptys de estilo BSD. Debería ocuparse de los permisos, aunque si SSH es el único usuario, podría ser un poco más fácil. Luego, necesitaría parchear OpenSSH para agregar algún mecanismo para vincular un número pty particular a un cliente en particular./dev/ptyNUM
/dev/ttyNUM
HAVE_DEV_PTMX
Recomiendo encarecidamente no hacer esto: es una configuración no estándar que requiere que escriba algún código adicional. Es un esfuerzo de mantenimiento extra y un riesgo de seguridad.
De todos modos no veo el sentido. Puede ejecutar last
para ver qué cliente está actualmente conectado en cada terminal.