是否有可能找到哪个用户位于localhost TCP连接的另一端?

时间:2017-06-14 01:37:22

标签: linux sockets tcp

这是一个编程问题,但它非常适合Linux / Unix。如果我从localhost获得TCP连接,是否有一种简单的方法可以告诉哪个用户在C程序中建立了连接而没有外壳?我知道使用Unix域套接字并不难。

我已经知道远程IP地址是localhost(:: 1或127.0.0.1),我知道远程端口号。我不知道的是进行连接的进程的有效用户ID。有没有办法发现这个?

1 个答案:

答案 0 :(得分:2)

在Linux上,/proc/net/tcp包含有关系统上打开的TCP套接字的信息。对于连接的套接字,条目看起来像这样(标题是文件的一部分,其他行被删除):

  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     

  11: 0100007F:C9CB 0100007F:0016 01 00000000:00000000 00:00000000 00000000  1000        0 978132 ...

第二列和第三列具有套接字的端点,uid列具有创建套接字的进程的有效UID。 /proc/net/tcp6与IPv6类似。 (IP地址有127.0.0.1,因此八位字节似乎顺序相反。)

如果要跟踪持有套接字的实际进程,则需要遍历所有/proc/$PID/fd/$N条目,并将套接字符号链接中的inode编号与tcp中提到的inode编号进行比较套接字表。但除非您是超级用户,否则您只能看到自己进程的文件描述符。