Посмотреть параметры сокетов для существующих сокетов, созданных другими приложениями?
-
06-07-2019 - |
Вопрос
Я хотел бы проверить, были ли установлены определенные параметры сокета в существующем сокете.Т.е. практически все, что вы можете увидеть в:
#!/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 о том, как достичь этого навыка.