Al principio intenté rastrear unos pocos xterm
segundos hasta el xterm
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
un write/talk
proceso 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 utmp
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 anunciaba pts
y ptm
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 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 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:
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 socat
en lugar de un depurador, pero todavía tengo que aclarar cómo. Aún así, sospecho que ss
podrí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 \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:
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 stty
modos 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.