Se eu fizer um:
echo foo > /dev/pts/12
Algum processo lerá isso foo\n
do descritor de arquivo para o lado mestre.
Existe uma maneira de descobrir o que é esse processo (s)?
Ou, em outras palavras, como descobrir qual xterm / sshd / script / screen / tmux / expect / socat ... está do outro lado /dev/pts/12
?
lsof /dev/ptmx
irá me dizer os processos que possuem descritores de arquivos no lado mestre de qualquer pty. Um processo em si pode usar ptsname()
( TIOCGPTN
ioctl) para descobrir o dispositivo escravo com base em seu próprio fd para o lado mestre, para que eu possa usar:
gdb --batch --pid "$the_pid" -ex "print ptsname($the_fd)"
para cada pid / fd retornado lsof
para construir esse mapeamento, mas existe uma maneira mais direta, confiável e menos invasiva de obter essas informações?
terminal-emulator
open-files
pty
Stéphane Chazelas
fonte
fonte
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
, forneceria a lista de PIDs (/proc/PID
) como saída./dev/pts/4
. Geralmente, esse será um ancestral comum dos processos que foram/dev/pts/4
abertos, mas não necessariamente.screen
, éscreen
que ele aloca e gerencia ativamente o escravo pty pela vida útil do dispositivo, mas - como eu acho - o shell se torna o líder do processo para esse tty e assim, como seu saída mostra, você recebebash
ou o que quer queps
nãoscreen
. Eu rastreei alguns dexterms
volta aoxterm
pid com base em/proc/locks
mas estava solto.Respostas:
No começo, tentei rastrear alguns
xterm
segundos até oxterm
pid, com base nas informações que encontrei,/proc/locks
mas estavam soltas. Quero dizer, funcionou, acho, mas foi na melhor das hipóteses circunstanciais - não compreendo completamente todas as informações que o arquivo fornece e correspondia apenas ao que parecia corresponder entre o conteúdo e os processos terminais conhecidos.Então eu tentei assistir
lsof/strace
em umwrite/talk
processo ativo entre ptys. Eu nunca tinha usado nenhum dos programas antes, mas eles parecem confiarutmp
. Se o meu site direcionado não tivesse umautmp
entrada por qualquer motivo, ambos se recusariam a admitir que existia. Talvez haja uma maneira de contornar isso, mas fiquei confuso o suficiente para abandoná-lo.Tentei alguma
udevadm
descoberta com 136 e 128 nós principais de dispositivos, conforme anunciadopts
eptm
respetivamente/proc/tty/drivers
, mas também não tenho experiência muito útil com essa ferramenta e, mais uma vez, não achei nada substancial. Curiosamente, porém, notei que o:min
intervalo para os dois tipos de dispositivos estava listado de forma impressionante0-1048575
.Não foi até eu revisitar isso documento do kernel que comecei a pensar sobre o problema em termos de
mount
s. Eu tinha lido isso várias vezes antes, mas quando a pesquisa contínua nessa linha me levou a esse patchset de 2012/dev/pts
, tive uma idéia:Pensei no que costumo usar para associar processos a um
mount
? E com certeza:Então, com essas informações eu posso fazer, por exemplo
terminology
:Como você pode ver, com um pouco de teste explícito, esse processo pode ser feito para gerar de maneira bastante confiável o processo mestre de um arquivo arbitrário. Em relação aos soquetes, tenho quase certeza de que alguém poderia abordá-lo dessa direção, usando também o
socat
oposto de um depurador, mas ainda não entendi como. Ainda assim, suspeito quess
possa ajudar se você estiver mais familiarizado com isso do que eu:Então, configurei-o com um pouco de teste mais explícito, na verdade:
Ele imprime um
$$
número de\0
bytes nulos para cada arquivo e compara o io de cada processo mestre com um teste anterior. Se a diferença é$$
então, associa o pid ao pty. Isso principalmente funciona . Quero dizer, para mim, retorna:O que é correto, mas, obviamente, é um pouco atrevido. Quero dizer, se um desses outros estivesse lendo um monte de dados na época, provavelmente sentiria falta. Estou tentando descobrir como alterar os
stty
modos em outro pty para enviar o bit de parada primeiro ou algo assim, para que eu possa consertar isso.fonte
Se você está apenas procurando quem possui a conexão e de onde eles estão conectados, o comando who funcionará bem.
Se você também quer saber o que está escutando nessa conexão, w mostrará que no final.
E para obter os pids, limite um ps à sessão tty que você está vendo. Completamente discreto para inicializar.
Observe que isso pode levar a arenques vermelhos, dependendo do tempo. Mas é um bom lugar para começar.
fonte
/dev/pts/4
onde você executou essew
comando.Eu tive o mesmo problema com o qemu e finalmente encontrei uma solução muito ruim (mas ainda uma solução): analisando a memória do processo.
Isso está funcionando aqui porque eu sei que o qemu está armazenando os pontos remotos em uma string com um formato específico e alocado no heap. Pode ser que ele também funcione em outras situações com algumas alterações e reutilizando o pid da saída do fusor (verifique outra resposta).
O código é adaptado daqui .
fonte