Pregunta

Me gustaría probar si se han configurado opciones de socket particulares en un socket existente. Es decir, casi todo lo que puedes ver en:

#!/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

¿Alguien sabe cómo puedo ver las opciones en sockets existentes , es decir, las creadas por otros procesos? Desafortunadamente, casi toda la documentación que leí en la programación de socket de Python se trata de crear nuevos sockets.

¿Fue útil?

Solución

Desafortunadamente, la respuesta de la persona que pinta solo atrapa las opciones de zócalo de nivel SOL_TCP y no las de nivel SOL_SOCKET (como SO_KEEPALIVE).

Algunas distribuciones envían algunos ejemplos junto con systemtap. Uno de ellos es pfiles.stp que puede usar para obtener las opciones de socket de los sockets de un proceso en ejecución. Ejemplo del archivo:

$ ./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]

Otros consejos

Esto no es posible en Python.

El kernel de Linux no proporciona un mecanismo en / procfs para informar sobre estados de socket TCP (a diferencia de BSD y otros sistemas operativos similares a Unix). Como el núcleo no expone esta información, no podemos verla a través del módulo python-linux-procfs o similar.

Consulte lsof item 3.14.1 de Preguntas frecuentes :

Q. "¿Por qué lsof no informa las opciones de socket, estados de socket, y los indicadores y valores de TCP para mi dialecto?".

A. 'las opciones de socket, estados de socket, y los indicadores y valores de TCP no están disponibles a través del sistema de archivos / proc.'

Sin embargo, el tapset de la Red de SystemTap proporciona un punto de interrupción tcp.setsockopt que se puede usar para interceptar las opciones de socket establecidas por un proceso, sin embargo, esto se manejaría en stap en lugar de python.

Creé el tapset requerido de la siguiente manera:

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

la biblioteca de sockets es de hecho crear nuevos sockets y manipularlos. los sockets creados en otros procesos no son visibles por razones obvias de seguridad: no querría que ninguna aplicación aleatoria cambie la forma en que administra su propio socket, o peor que lea los datos de su socket antes que usted. de modo que los sockets son objetos del sistema, a los que hace referencia un identificador, con derechos de acceso (en un sistema operativo decente) que se aplican a ellos. es por eso que no puede listar sockets existentes creados por otros procesos.

eventualmente, puede encontrar una manera de recuperar los manejadores de zócalo (debería haber una manera en algún lugar, recuerdo haber visto una manera de enumerar los manejadores del sistema en Windows), pero aún así sería muy específico para su sistema operativo, por lo que probablemente no esté disponible en Python, y es posible que aún no tenga derecho a realizar nada en esas tomas.

ahora, si solo tiene curiosidad por saber cómo una aplicación específica logró una característica específica, hay otras formas: la más obvia es instalar un proxy o un firewall (recuerdo que mi Kerio WinRoute Firewall enumeró las opciones de socket), o solo preguntando a stackoverflow sobre cómo lograr esta hazaña.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top