Прочтите «/ proc», чтобы узнать, открыл ли процесс порт

13

Мне нужно знать, если процесс с заданным идентификатором PID открыл порт без использования внешних команд. Затем я должен использовать /procфайловую систему. /proc/$PID/net/tcpНапример, я могу прочитать файл и получить информацию о TCP-портах, открытых процессом. Однако в многопоточном процессе /proc/$PID/task/$TIDкаталог также будет содержать net/tcpфайл. Мой вопрос:

мне нужно пройтись по всем net/tcpфайлам потоков , или порт, открытый потоками, будет записан в net/tcpфайл процесса .

rmonjo
источник

Ответы:

23

Например, я могу прочитать файл / proc / $ PID / net / tcp и получить информацию о TCP-портах, открытых процессом.

Этот файл не является списком TCP-портов, открытых процессом . Это список всех открытых портов tcp в текущем сетевом пространстве имен, и для процессов, выполняющихся в том же сетевом пространстве имен, идентично содержимому /proc/net/tcp.

Чтобы найти порты, открытые вашим процессом, вам нужно получить список дескрипторов сокетов /proc/<pid>/fd, а затем сопоставить эти дескрипторы с inodeполем /proc/net/tcp.

larsks
источник
Спасибо за ваш ответ. И если процесс многопоточный, мне нужно пройти через все fdкаталоги каждого потока? Или /proc/pid/fdкаталог "наследует" /proc/pid/task/tid/fdкаталоги?
rmonjo
Я не уверен, но это, кажется, легко проверить.
Жаворонки
7
@rmonjo Потоки не могут открывать файлы, могут только процессы. fdКаталог нити просто повторяет fdкаталог процесса.
Жиль "ТАК ... перестать быть злым"
0

пожалуйста

cat /proc/$PID/net/tcp

и вы получите вывод, как это

  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
  0: 00000000:01BB 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 2891985097 1 0000000000000000 100 0 0 10 0

Второй столбец (local_address) вывода показывает порт в шестнадцатеричном формате. Используйте калькулятор программирования для преобразования шестнадцатеричного кода в десятичный.

Например, здесь порт: 01BB (в шестнадцатеричном формате) равен 433 (в десятичном виде), который является портом HTTPS по умолчанию.

PHZ.fi-Фаразон
источник