Si hago un:
echo foo > /dev/pts/12
Algún proceso leerá eso foo\n
desde su descriptor de archivo al lado maestro.
¿Hay alguna manera de averiguar cuáles son esos (esos) procesos?
O en otras palabras, ¿cómo podría averiguar qué xterm / sshd / script / screen / tmux / expect / socat ... está en el otro extremo de /dev/pts/12
?
lsof /dev/ptmx
me dirá los procesos que tienen descriptores de archivo en el lado maestro de cualquier pty. Un proceso en sí mismo puede usar ptsname()
( TIOCGPTN
ioctl) para encontrar el dispositivo esclavo basado en su propia fd en el lado maestro, por lo que podría usar:
gdb --batch --pid "$the_pid" -ex "print ptsname($the_fd)"
para cada uno de los pid / fd devueltos por lsof
construir esa asignación, pero ¿hay una forma más directa, confiable y menos intrusiva de obtener esa información?
terminal-emulator
open-files
pty
Stéphane Chazelas
fuente
fuente
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
, proporcionaría la lista de PID (/proc/PID
) como salida./dev/pts/4
. Por lo general, ese será un ancestro común de aquellos procesos que se han/dev/pts/4
abierto, pero no necesariamente.screen
, esscreen
que asigna y gestiona activamente el esclavo pty durante la vida útil del dispositivo, pero, como creo, el shell se convierte en el líder del proceso para ese tty y así, como su salida muestra, obtienesbash
o lo que sea deps
noscreen
. Remonté algunosxterms
hasta elxterm
pid basado en/proc/locks
pero estaba suelto.Respuestas:
Al principio intenté rastrear unos pocos
xterm
segundos hasta elxterm
pid basado en la información que encontré/proc/locks
pero estaba flojo. Quiero decir, funcionó, creo, pero fue en el mejor de los casos: no entiendo completamente toda la información que proporciona el archivo y solo coincidía con lo que parecía corresponder entre su contenido y los procesos terminales conocidos.Luego intenté ver
lsof/strace
unwrite/talk
proceso activo entre ptys. Nunca antes había usado ninguno de los dos programas, pero parecen confiar en ellosutmp
. Si mi pty objetivo no tenía unautmp
entrada por alguna razón, ambos se negaron a admitir que existía. Tal vez hay una forma de evitar eso, pero estaba lo suficientemente confundido como para abandonarlo.Intenté algún
udevadm
descubrimiento con 136 y 128 nodos de dispositivos de mayor número como se anunciabapts
yptm
respectivamente/proc/tty/drivers
, pero también me falta una experiencia muy útil con esa herramienta y una vez más no encontré nada sustancial. Curiosamente, sin embargo, noté que el:min
rango para ambos tipos de dispositivos figuraba de manera asombrosa0-1048575
.Sin embargo, no fue hasta que volví a visitar este documento del kernel que comencé a pensar en el problema en términos de
mount
s. Lo había leído varias veces antes, pero cuando la investigación continua en esa línea me llevó a este parche de 2012/dev/pts
tuve una idea:Pensé, ¿qué suelo usar para asociar procesos con un
mount
? Y efectivamente:Entonces, con esa información que puedo hacer, por ejemplo de
terminology
:Como puede ver, con un poco de prueba explícita, se podría hacer un proceso para generar de manera bastante confiable el proceso maestro de una empanada arbitraria. Con respecto a los sockets, estoy bastante seguro de que uno podría abordarlo desde esa dirección y usarlo
socat
en lugar de un depurador, pero todavía tengo que aclarar cómo. Aún así, sospecho quess
podría ayudar si está más familiarizado con eso que yo:Así que lo configuré con un poco más de pruebas explícitas, en realidad:
Imprime bytes
$$
numéricos\0
nulos en cada pty y comprueba el io de cada proceso maestro contra una comprobación previa. Si la diferencia es,$$
entonces asocia el pid con el pty. Esto funciona principalmente . Quiero decir, para mí, devuelve:Lo cual es correcto, pero, obviamente, es un poco picante. Quiero decir, si uno de esos otros estuviera leyendo un montón de datos en ese momento, probablemente fallaría. Estoy tratando de descubrir cómo cambiar los
stty
modos en otra pty para enviar el bit de parada primero o algo así para poder solucionarlo.fuente
Si solo está buscando quién posee la conexión y desde dónde están conectados, el comando who funcionará bien.
Si también desea saber qué está escuchando en esa conexión, w lo mostrará al final.
Y para obtener los pids, limite un ps a la sesión tty que está viendo. Completamente discreto para arrancar.
Tenga en cuenta que esto puede conducir a pistas falsas, dependiendo del momento. Pero es un buen lugar para comenzar.
fuente
/dev/pts/4
, donde ejecutó esew
comando.Tuve el mismo problema con qemu, y finalmente encontré una solución muy mala (pero aún así una solución): analizar la memoria del proceso.
Esto funciona aquí porque sé que qemu está almacenando los puntos remotos en una cadena con un formato específico y asignado en el montón. Es posible que también funcione en otras situaciones con algunos cambios y reutilizando el pid de la salida del fusor (verifique otra respuesta).
El código está adaptado desde aquí .
fuente