Question

Je voudrais vérifier si des options de socket particulières ont été définies sur un socket existant. C'est-à-dire à peu près tout ce que vous pouvez voir dans:

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

Quelqu'un sait comment je peux voir les options sur les sockets existants , c'est-à-dire celles créées par d'autres processus? Hélas, presque toute la documentation que j'ai lue sur la programmation de socket Python concerne la création de nouveaux sockets.

Était-ce utile?

La solution

Malheureusement, la réponse du cloueur ne prend que les options de socket de niveau SOL_TCP, mais pas celles de niveau SOL_SOCKET (comme SO_KEEPALIVE).

Certaines distributions fournissent des exemples avec systemtap. L'un d'entre eux est pfiles.stp, que vous pouvez utiliser pour obtenir les options de socket à partir des sockets d'un processus en cours d'exécution. Exemple tiré du fichier:

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

Autres conseils

Cela n’est pas possible en Python.

Le noyau Linux ne fournit pas de mécanisme dans / procfs pour signaler les états des sockets TCP (contrairement à BSD et aux autres systèmes d'exploitation de type Unix). Le noyau n'exposant pas cette information, nous ne pouvons pas la voir via le module python-linux-procfs ou similaire.

Voir Point 3.14.1 de la FAQ de lsof :

Q. "Pourquoi lsof n'indique-t-il pas les options de socket, les états de socket, les drapeaux TCP et les valeurs pour mon dialecte?".

A. 'Les options de socket, les états de socket et les indicateurs et valeurs TCP ne sont pas disponibles via le système de fichiers / proc.'

Cependant, le tapset réseau de SystemTap fournit un point d'arrêt tcp.setsockopt qui peut être utilisé pour intercepter les options de socket définies par un processus. Toutefois, cela serait géré en stap plutôt qu'en python.

J'ai créé le tapset requis comme suit:

# 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 bibliothèque de sockets doit en effet créer de nouveaux sockets et les manipuler. les sockets créés dans d'autres processus ne sont pas visibles pour des raisons évidentes de sécurité: vous ne voudriez pas qu'une application aléatoire modifie la façon dont vous gérez votre propre socket, ou pire lire les données de votre socket avant vous. ainsi, les sockets sont des objets système, référencés par un handle, avec les droits d'accès (sur un système d'exploitation correct), qui leur sont appliqués. c'est pourquoi vous ne pouvez pas répertorier les sockets existants créés par d'autres processus.

éventuellement, vous pourrez trouver un moyen de récupérer les descripteurs de socket (il devrait y avoir un moyen quelque part, je me souviens avoir vu un moyen de répertorier les descripteurs système sous Windows), mais cela resterait très spécifique à votre système d'exploitation, donc probablement pas disponible en python, et vous n’avez peut-être toujours pas le droit d’exécuter quoi que ce soit sur ces sockets.

Maintenant, si vous êtes seulement curieux de savoir comment une application spécifique a obtenu une fonctionnalité spécifique, il existe d'autres moyens: le plus évident est d'installer un proxy ou un pare-feu (je me souviens que mes options de socket répertoriées dans le pare-feu Kerio WinRoute), ou il suffit de demander à stackoverflow comment réaliser cet exploit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top