Смотрите параметры сокетов на существующих сокетах, созданных другими приложениями? - PullRequest
3 голосов
/ 24 октября 2009

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

#!/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, касается создания новых сокетов.

Ответы [ 3 ]

2 голосов
/ 15 марта 2010

Это невозможно в Python.

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

См. lsof FAQ пункт 3.14.1 :

Q. «Почему в моем диалекте не указаны параметры сокетов, состояния сокетов, а также флаги и значения TCP?».

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

Однако сетевой набор системных вызовов 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")
}
2 голосов
/ 06 марта 2013

К сожалению, ответ 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]
1 голос
/ 24 октября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...