这是一个编程问题,但它是 Linux/Unix 特定的。如果我从本地主机获得 TCP 连接,是否有一种简单的方法可以告诉哪个用户在 C 程序内建立了连接而无需 shell ?我知道这对于 Unix 域套接字来说并不太难。
我已经知道远程 IP 地址是 localhost(::1 或 127.0.0.1)并且我知道远程端口号。我不知道建立连接的进程的有效用户 ID。有什么办法可以发现这一点吗?
在 Linux 上,/proc/net/tcp http://man7.org/linux/man-pages/man5/proc.5.html包含有关系统上打开的 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 编号进行比较。但是你只能看到你自己进程的文件描述符,除非你是超级用户。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)