Посмотреть параметры сокетов для существующих сокетов, созданных другими приложениями?

StackOverflow https://stackoverflow.com/questions/1618051

Вопрос

Я хотел бы проверить, были ли установлены определенные параметры сокета в существующем сокете.Т.е. практически все, что вы можете увидеть в:

#!/usr/bin/env python
'''See possible TCP socket options'''

import socket

sockettypelist = [x for x in dir(socket) if x.startswith('SO_')]
sockettypelist.sort()
for sockettype in sockettypelist:
    print sockettype

Кто-нибудь знает, как я могу просмотреть варианты на существующий сокеты, то есть те, которые созданы другими процессами?Увы, почти вся документация, которую я читал по программированию сокетов на Python, посвящена созданию новых сокетов.

Это было полезно?

Решение

К сожалению, ответ nailer только улавливает параметры сокета уровня SOL_TCP, но не совпадает с параметрами уровня SOL_SOCKET (например, SO_KEEPALIVE).

В некоторых дистрибутивах есть несколько примеров вместе с systemtap. Одним из них является pfiles.stp, который вы можете использовать для получения опций сокетов из сокетов запущенного процесса. Пример из файла:

$ ./pfiles.stp `pgrep udevd`
   787: udevd
  Current rlimit: 32 file descriptors
   0: S_IFCHR mode:0666 dev:0,15 ino:396 uid:0 gid:0 rdev:1,3
      O_RDWR|O_LARGEFILE 
      /dev/null
   1: S_IFCHR mode:0666 dev:0,15 ino:396 uid:0 gid:0 rdev:1,3
      O_RDWR|O_LARGEFILE 
      /dev/null
   2: S_IFCHR mode:0666 dev:0,15 ino:396 uid:0 gid:0 rdev:1,3
      O_RDWR|O_LARGEFILE 
      /dev/null
   3: S_IFDIR mode:0600 dev:0,9 ino:1 uid:0 gid:0 rdev:0,0
      O_RDONLY 
      inotify
   4: S_IFSOCK mode:0777 dev:0,4 ino:2353 uid:0 gid:0 rdev:0,0
      O_RDWR 
      socket:[2353]
      SO_PASSCRED,SO_TYPE(2),SO_SNDBUF(111616),SO_RCVBUF(111616)
        sockname: AF_UNIX
   5: S_IFSOCK mode:0777 dev:0,4 ino:2354 uid:0 gid:0 rdev:0,0
      O_RDWR 
      socket:[2354]
      SO_TYPE(2),SO_SNDBUF(111616),SO_RCVBUF(33554432)
        ulocks: rcv
   6: S_IFIFO mode:0600 dev:0,6 ino:2355 uid:0 gid:0 rdev:0,0
      O_RDONLY|O_NONBLOCK 
      pipe:[2355]
   7: S_IFIFO mode:0600 dev:0,6 ino:2355 uid:0 gid:0 rdev:0,0
      O_WRONLY|O_NONBLOCK 
      pipe:[2355]

Другие советы

В Python это невозможно.

Ядро Linux не предоставляет механизм в /procfs для отчета о состояниях TCP-сокета (в отличие от BSD и других Unix-подобных операционных систем).Поскольку ядро не предоставляет эту информацию, мы не можем увидеть ее через модуль python-linux-procfs или аналогичный.

Видишь часто задаваемые вопросы lsof пункт 3.14.1:

Q.‘Почему lsof не сообщает о параметрах сокета, состояниях сокета, флагах и значениях TCP для моего диалекта?’.

A."параметры сокета, состояния сокета, флаги и значения TCP недоступны через файловую систему /proc".

Однако сетевой tapset SystemTap предоставляет точку останова tcp.setsockopt, которая может использоваться для перехвата параметров сокета, установленных процессом, однако это будет обрабатываться в stap, а не в python.

Я создал необходимый набор отводов следующим образом:

# Show sockets setting options

# Return enabled or disabled based on value of optval
function getstatus(optlen)
{
    if ( optlen == 1 )
        return "enabling"
    else
        return "disabling"
}

probe begin
{
    print ("\nChecking for apps making socket calls\n")
}

# See apps setting a socket option 
probe tcp.setsockopt
{
    status = getstatus(user_int($optval))
    printf ("  App '%s' (PID %d) is %s socket option %s... ", execname(), pid(), status, optstr)
}

# Check setting the socket option worked
probe tcp.setsockopt.return
{
    if ( ret == 0 )
        printf ("success")
    else
        printf ("failed")
    printf ("\n")    
}


probe end
{
    print ("\nClosing down\n")
}

библиотека сокетов действительно предназначена для создания новых сокетов и манипулирования ими. сокеты, созданные в других процессах, не видны по очевидным причинам безопасности: вы не хотели бы, чтобы какое-либо случайное приложение изменило способ управления вашим собственным сокетом, или хуже считывали данные из вашего сокета перед вами. поэтому сокеты - это системные объекты, на которые ссылается дескриптор, с правами доступа к ним (в приличной ОС). вот почему вы не можете перечислить существующие сокеты, созданные другими процессами.

в конце концов, вы можете найти способ получить дескрипторы сокетов (где-то должен быть способ, я помню, как можно было бы увидеть список системных дескрипторов в Windows), но это все равно будет очень специфично для вашей ОС, поэтому, скорее всего, недоступно в Python, и вы все равно можете не иметь права что-либо делать с этими сокетами.

Теперь, если вам просто интересно узнать, как конкретное приложение достигло определенной функции, есть и другие способы: наиболее очевидным является установка прокси или брандмауэра (я помню, что мой Kerio WinRoute Firewall перечислил опции сокетов), или просто спрашиваю stackoverflow о том, как достичь этого навыка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top