Pergunta

Eu gostaria de testar se determinadas opções de socket foram definidas em um soquete existente. Ou seja, praticamente tudo que você pode ver em:

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

Alguém sabe como eu posso ver as opções no existentes soquetes, ou seja, aqueles criados por outros processos? Alas quase toda a documentação que li no Python soquete programação é sobre fazer novas tomadas.

Foi útil?

Solução

Infelizmente, a resposta de nailer só captura as opções de socket nível SOL_TCP e não os de nível SOL_SOCKET (como SO_KEEPALIVE).

Alguns dos navios distribuições alguns exemplos, juntamente com systemtap. Um deles é pfiles.stp que você pode usar para obter as opções de socket a partir das bases de um processo em execução. Exemplo do arquivo:

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

Outras dicas

Isto não é possível em Python.

O kernel Linux não fornece um mecanismo / procfs para informar sobre estados de soquete TCP (ao contrário BSD e outros Unix-like OSs). Como o kernel não expor esta informação, não podemos vê-lo através do python-linux-procfs módulo ou similar.

Consulte lsof FAQ artigo 3.14.1 :

Q. ‘Por que não faz lsof opções de socket relatório, estados soquete e flags TCP e valores para o meu dialeto?’.

A. 'Opções de socket, estados soquete e bandeiras e valores TCP não estão disponíveis através do sistema de arquivos / proc.'

No entanto tapset de rede do SystemTap fornece um ponto de interrupção tcp.setsockopt que pode ser usado para opções de socket intercepção definido por um processo, no entanto, isso seria tratado em stap ao invés de python.

Eu criei o tapset requerida como segue:

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

a biblioteca de soquete é de fato para criar novas bases e manipulá-los. soquetes criados em outros processos não são visíveis por razões de segurança óbvias: você não gostaria que qualquer aplicação aleatória mudando a maneira de gerir o seu próprio soquete ou leitura de dados piores a partir da tomada antes de você. assim soquetes são objetos de sistema, referenciados por uma alça, com (em um sistema operacional decente) direitos de acesso que se lhes aplicam. É por isso que você não pode lista existente soquetes criados por outros processos.

eventualmente, você pode encontrar uma maneira de recuperar identificadores de soquete (deve haver um lugar maneira, eu lembro de ter visto uma forma de alças sistema de lista no Windows), mas este ainda seria muito específico para seu sistema operacional, por isso provavelmente não disponíveis em python, e você pode ainda não ter o direito de realizar qualquer coisa sobre esses soquetes.

Agora, se você são apenas curioso para saber como um aplicativo específico alcançado um recurso específico, existem outras maneiras: a mais óbvia é a instalação de um proxy ou um firewall (eu me lembro que meu Kerio WinRoute Firewall listados opções de socket), ou apenas pedindo stackoverflow sobre como conseguir este feito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top