2017-06-14 29 views
2

這是一種編程問題,但它非常特定於Linux/Unix。如果我從本地主機獲得TCP連接,是否有一種簡單的方法可以告訴哪些用戶在C程序中建立了連接而不會脫殼?我知道這對Unix域套接字來說並不難。是否有可能找到哪個用戶位於本地主機TCP連接的另一端?

我已經知道遠程IP地址爲localhost(:: 1或127.0.0.1),我知道了遠程端口號。我不知道的是進行連接的進程的有效用戶標識。有什麼辦法可以發現這個嗎?

+0

的可能的複製[如何在C得到sock結構的IP地址?(https://stackoverflow.com/questions/3060950/how-to-get-ip-address-from-sock-structure-in- c)我不相信有一種方法可以從TCP連接獲得更多的IP地址。如果轉移到SSL/TLS,則某些密碼套件(如TLS-SRP和TLS-PSK)要求用戶提供憑證。 – jww

+0

@jww - Windows顯然已經實現了某種機制(如果你的連接來自本地主機)知道誰建立了連接的用戶憑證。這似乎對我來說都是錯誤的,但我從可靠的消息來源得知它是真的。我想知道是否有相當的Linux設施,因爲我正在接受移植一些代碼的工作。 – Omnifarious

+0

另請參見[如何找到連接到插座AF_INET客戶端的UID?](https://stackoverflow.com/q/44554362/608639) – jww

回答

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編號進行比較。但是你只能看到自己進程的文件描述符,除非你是超級用戶。

+0

是的,這看起來可能會這樣做。在C程序中使用有點痛苦,但絕對可行。此外,非常特定於Linux,但我預計沒有什麼。我會等待一些人提出更好的答案,如果他們不這樣做,我會接受這個答案。謝謝。 – Omnifarious

相關問題