2009-10-24 3 views
3

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

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

+0

Можете ли вы лучше узнать, что именно * вы хотите достичь (например, какое приложение и почему вы хотите узнать о параметрах сокета)? Как описано, я не думаю, что то, что вы хотите, возможно - в python или иначе. –

+0

Несомненно. Я хотел бы иметь возможность протестировать приложения третьих сторон, которые правильно установили, скажем, keepalive, чтобы избежать известной проблемы в моей среде, когда это не задано. Я не имею доступа к источнику приложения третьей части. – mikemaccana

+1

Начинаю отвечать на свой вопрос: некоторые исследования показывают, что опция «-o» таймеров в Linux netstat также показывает параметры сокетов в процессах. Исходя из этого, выясняется, что информация о параметрах сокета сохраняется в конечном поле в/proc/net/tcp в Linux. Я изучаю, может ли модуль procfs Python справиться с этим, или мне нужно создать свой собственный модуль ... – mikemaccana

ответ

2

К сожалению, ответ Nailer только улавливает опций сокета уровня SOL_TCP и не те, уровень SOL_SOCKET (как SO_KEEPALIVE).

В некоторых дистрибутивах приведены некоторые примеры вместе с системной таблицей. Один из них - 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

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

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

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

+1

Понял re: security, но можно было бы надеяться, что пользователь root/SYSTEM сможет увидеть параметры, установленные для всех процессов. Мои цели предназначены для диагностики других приложений. – mikemaccana

2

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

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

См lsof FAQ item 3.14.1:

Вопрос: «Почему не Lsof отчет опций сокета, сокета состояния и TCP флаги и значения для моего диалекте?».

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

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

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

# 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") 
}