No começo, tentei rastrear alguns xterm
s de volta para o xterm
pid com base nas informações que encontrei em /proc/locks
, mas estava solto. Quer dizer, funcionou, eu acho, mas foi na melhor das hipóteses circunstancial - eu não entendo completamente todas as informações que o arquivo fornece e estava apenas combinando o que parecia corresponder entre o conteúdo e os processos terminais conhecidos.
Então eu tentei assistir lsof/strace
em um processo write/talk
ativo entre ptys. Eu nunca tinha usado nenhum programa antes, mas eles parecem confiar em utmp
. Se o meu alvo não tivesse uma entrada utmp
por qualquer razão, ambos se recusaram a admitir que existia. Talvez haja uma maneira de contornar isso, mas eu estava confuso o suficiente para abandoná-lo.
Eu tentei alguns udevadm
discovery com 136 e 128 nós de dispositivo de número principal como anunciados para pts
e ptm
respectivamente em /proc/tty/drivers
, mas também não tenho nenhuma experiência útil com essa ferramenta e mais uma vez apareceu nada substancial. Curiosamente, no entanto, notei que o intervalo :min
para ambos os tipos de dispositivos foi listado em 0-1048575
.
Não foi até que eu revisitei este este documento do kernel que comecei a pensar sobre o problema em termos de mount
s, no entanto. Eu tinha lido isso várias vezes antes, mas quando a pesquisa continuada nessa linha me levou a este este 2012 /dev/pts
patchset Eu tive uma ideia:
sudo fuser -v /dev/ptmx
Pensei em o que costumo usar para associar processos a um mount
? E com certeza:
USER PID ACCESS COMMAND
/dev/ptmx: root 410 F.... kmscon
mikeserv 710 F.... terminology
Então, com essa informação eu posso fazer, por exemplo, de terminology
:
sudo sh -c '${cmd:=grep rchar /proc/410/io} && printf 1 >/dev/pts/0 && $cmd'
###OUTPUT###
rchar: 667991010
rchar: 667991011
Como você pode ver, com um pequeno teste explícito, tal processo poderia ser feito para imprimir de forma confiável o processo mestre de um arquivo arbitrário. Em relação aos sockets, tenho quase certeza de que alguém poderia se aproximar dessa direção usando também socat
em oposição a um depurador, mas ainda não endireitei como. Ainda assim, suspeito que ss
possa ajudar se você estiver mais familiarizado com ele do que eu:
sudo sh -c 'ss -oep | grep "$(printf "pid=%s\n" $(fuser /dev/ptmx))"'
Então eu configuro com testes um pouco mais explícitos, na verdade:
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 $$
num
null bytes para cada pty e verifica o io de cada processo mestre em uma verificação anterior. Se a diferença for $$
stty
, ela associa o pid ao pty. Isso principalmente funciona. Quer dizer, para mim, isso retorna:
410 owns /dev/pts/0
410 owns /dev/pts/1
710 owns /dev/pts/2
O que é correto, mas, obviamente, é um pouco atrevido. Quero dizer, se um desses outros estivesse lendo um monte de dados no momento provavelmente perderia. Eu estou tentando descobrir como alterar os modos %code% em outro pty para enviar o bit de parada primeiro ou algo assim para que eu possa consertar isso.