Existe uma maneira de identificar o PID (ou cgroup) de um socket sem iterar através de todos os processos em / proc /

5

Eu preciso identificar o cgroup de um processo dado o socket. Especificamente, tenho um processo na mesma máquina que está chamando meu processo usando tcp e preciso identificar o processo ou seu cgroup. O requisito tcp é porque estou simulando uma API de terceiros. Preciso retornar dados diferentes dependendo de qual processo está me chamando. Uma solução é determinar o socket usando / proc / net / tcp, a partir do qual eu posso obter o inode para o socket, e então iterar sobre / proc / * / fd para encontrar o inode listado. Existe um caminho direto para mapear de um inode (suponho um sockfs) para seu PID sem essa iteração?

    
por jamie 09.08.2016 / 01:27

3 respostas

3

Em geral, para encontrar o que está na outra extremidade de um soquete, é necessário iterar em /proc . Isso pode significar deixar uma ferramenta existente como netstat , lsof ou ss fazer isso para você.

A razão para isto é que um socket pode ser aberto por diferentes processos. Depois que um processo abre um soquete, ele pode se separar e os filhos podem alterar seus privilégios e mudar para diferentes namespaces. Também é possível passar descritores de arquivo de um processo para um processo não relacionado, usando dados anciliares em um soquete unix. Portanto, processos arbitrários podem ter o mesmo soquete aberto. Não existe tal coisa como “o PID de um soquete”, apenas “os PIDs de um soquete”.

Embora isso não prove que não há como enumerar os PIDs fornecidos pelo soquete, seria muito difícil projetar uma interface desse tipo, especialmente quando você considera que os usuários não-root não sabem quando os arquivos são aberto por processos executados como um usuário diferente. O acesso por meio do /proc impõe segurança por meio de permissões e não conheço nenhuma outra interface para obter os mesmos dados. Além disso, fuser , lsof , netstat e ss all enumeram /proc ; se houvesse outra interface, eu esperaria que alguém a usasse. Então, tenho certeza que não há outro jeito.

    
por 09.08.2016 / 01:49
0

se você sabe o número da porta tcp, então você pode usar este comando no seu terminal:

$ lsof | grep TCP | grep your_port_number

Por exemplo: lsof | grep TCP | grep 1234

    
por 09.08.2016 / 09:02
0

Para determinar o cgroup, você pode consultar o campo sk_cgrp_data em struct sock . Este é um exemplo de __cgroup_bpf_run_filter_sock_ops() in kernel/bpf/cgroup.c :

struct cgroup *cgrp = sock_cgroup_ptr(&sk->sk_cgrp_data)
    
por 18.07.2018 / 09:56