Domanda

Vorrei testare se determinate opzioni socket sono state impostate su un socket esistente. Cioè, praticamente tutto ciò che puoi vedere in:

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

Qualcuno sa come posso vedere le opzioni sui socket esistenti , cioè quelli creati da altri processi? Purtroppo quasi tutta la documentazione che ho letto sulla programmazione dei socket Python riguarda la creazione di nuovi socket.

È stato utile?

Soluzione

Sfortunatamente, la risposta di Nailer cattura solo le opzioni del socket di livello SOL_TCP e non quelle del livello SOL_SOCKET (come SO_KEEPALIVE).

Alcune delle distribuzioni forniscono alcuni esempi insieme a systemtap. Uno di questi è pfiles.stp che è possibile utilizzare per ottenere le opzioni socket dai socket di un processo in esecuzione. Esempio dal file:

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

Altri suggerimenti

Questo non è possibile in Python.

Il kernel Linux non fornisce un meccanismo in / procfs per riferire sugli stati socket TCP (diversamente da BSD e altri sistemi operativi simili a Unix). Dato che il kernel non espone queste informazioni, non possiamo vederle tramite il modulo python-linux-procfs o simili.

Vedi lsof FAQ item 3.14.1 :

Q. "Perché lsof non segnala opzioni socket, stati socket e flag e valori TCP per il mio dialetto?".

A. "opzioni socket, stati socket e flag e valori TCP non sono disponibili tramite il file system / proc."

Tuttavia il tapset Network di SystemTap fornisce un breakpoint tcp.setsockopt che può essere usato per intercettare le opzioni socket impostate da un processo, tuttavia questo sarebbe gestito in stap piuttosto che in Python.

Ho creato il tapset richiesto come 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")
}

la libreria dei socket è infatti per creare nuovi socket e manipolarli. i socket creati in altri processi non sono visibili per ovvi motivi di sicurezza: non vorrai che nessuna applicazione casuale cambiasse il modo in cui gestisci il tuo socket, o peggio leggendo i dati dal tuo socket prima di te. così i socket sono oggetti di sistema, a cui fa riferimento un handle, con diritti di accesso (su un sistema operativo decente) ad essi applicabili. ecco perché non puoi elencare i socket esistenti creati da altri processi.

alla fine, potresti trovare un modo per recuperare gli handle di socket (dovrebbe esserci un modo da qualche parte, ricordo di aver visto un modo per elencare gli handle di sistema su Windows), ma questo sarebbe comunque molto specifico per il tuo sistema operativo, quindi probabilmente non disponibile in Python e potresti non avere ancora il diritto di eseguire nulla su questi socket.

ora, se sei solo curioso di sapere come un'applicazione specifica ha raggiunto una funzionalità specifica, ci sono altri modi: il più ovvio è l'installazione di un proxy o di un firewall (ricordo che le opzioni del mio socket elencate da Kerio WinRoute Firewall), oppure sto solo chiedendo a StackOverflow come realizzare questa impresa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top