Al principio intenté rastrear unos pocos xtermsegundos hasta el xtermpid basado en la información que encontré /proc/lockspero 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/straceun write/talkproceso activo entre ptys. Nunca antes había usado ninguno de los dos programas, pero parecen confiar en ellos utmp. Si mi pty objetivo no tenía una utmpentrada 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 udevadmdescubrimiento con 136 y 128 nodos de dispositivos de mayor número como se anunciaba ptsy ptmrespectivamente /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 :minrango para ambos tipos de dispositivos figuraba de manera asombrosa 0-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 mounts. 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:
sudo fuser -v /dev/ptmx
Pensé, ¿qué suelo usar para asociar procesos con un mount? Y efectivamente:
USER PID ACCESS COMMAND
/dev/ptmx: root 410 F.... kmscon
mikeserv 710 F.... terminology
Entonces, con esa información que puedo hacer, por ejemplo de terminology:
sudo sh -c '${cmd:=grep rchar /proc/410/io} && printf 1 >/dev/pts/0 && $cmd'
###OUTPUT###
rchar: 667991010
rchar: 667991011
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 socaten lugar de un depurador, pero todavía tengo que aclarar cómo. Aún así, sospecho que sspodría ayudar si está más familiarizado con eso que yo:
sudo sh -c 'ss -oep | grep "$(printf "pid=%s\n" $(fuser /dev/ptmx))"'
Así que lo configuré con un poco más de pruebas explícitas, en realidad:
sudo sh <<\CMD
chkio() {
read io io <$1
dd bs=1 count=$$ </dev/zero >$2 2>/dev/null
return $((($(read io io <$1; echo $io)-io)!=$$))
}
for pts in /dev/pts/[0-9]* ; do
for ptm in $(fuser /dev/ptmx 2>/dev/null)
do chkio /proc/$ptm/io $pts && break
done && set -- "$@" "$ptm owns $pts"
done
printf %s\\n "$@"
CMD
Imprime bytes $$numéricos \0nulos 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:
410 owns /dev/pts/0
410 owns /dev/pts/1
710 owns /dev/pts/2
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 sttymodos en otra pty para enviar el bit de parada primero o algo así para poder solucionarlo.
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4', proporcionaría la lista de PID (/proc/PID) como salida.