Mentre si cerca di capire il metodo migliore per eseguire il ping (ICMP) qualcosa in pitone, mi sono imbattuta in queste domande:python non privilegiato ICMP
- How can I perform a ping or traceroute in python, accessing the output as it is produced?
- ping a site in python
- How can I perform a ping or traceroute using native python?
le risposte generalmente si riducono a "utilizzare questo terzo modulo festa con i privilegi di root" o "utilizzare il comando ping del sistema e analizzare l'output". Dei metodi nativi, icmplib e M. Cowles and J. Diemer's ping.py menzionano esplicitamente la necessità di privilegi di root, così come lo scapymanual.
Quindi da quel punto di vista, l'invio nativo di ping ICMP senza privilegi speciali sembra impossibile. Il comando ping di sistema gestisce in qualche modo, ma la sua pagina man non fa luce su come. Il man page for icmp, d'altra parte, sembra dire che è possibile:
Non-privileged ICMP ICMP sockets can be opened with the SOCK_DGRAM socket type without requiring root privileges. The synopsis is the following: socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP) Datagram oriented ICMP sockets offer a subset of the functionality avail- able to raw ICMP sockets. Only IMCP request messages of the following types can be sent: ICMP_ECHO, ICMP_TSTAMP or ICMP_MASKREQ.
così sembrerebbe che, almeno secondo ICMP, è consentito. Quindi, perché tutti gli strumenti Python non sono in grado di farlo? Gli strumenti Python sono troppo generici e si prevede che qualsiasi lavoro sui socket con privilegi sia privilegiato? Sarebbe possibile scrivere una funzione di ping in C che possa eseguire il ping senza privilegi di root ed estendere Python con questo? Qualcuno ha fatto questo? Ho appena frainteso il problema?
Quale sistema operativo stai utilizzando? [I recenti kernel di Linux] (https://lkml.org/lkml/2011/5/10/389) e quelli di Mac OS X sono noti per avere socket ICMP non privilegiati. La pagina man che hai trovato proviene da OS X e dovrebbe funzionare. Sono riuscito con un programma [ping ping] non privato con privilegi (https://github.com/lilydjwg/winterpy/blob/master/pylib/icmplib.py) che funziona su Linux (con una modifica alle impostazioni del kernel) ma potrebbe essere necessario qualche aggiustamento su OS X. – lilydjwg
Per Linuix, vedere qui http://stackoverflow.com/questions/8290046/icmp-sockets-linux/20105379#20105379, è necessario un sysctl speciale per poter usare 'socket (AF_INET, SOCK_DGRAM, IPPROTO_ICMP) ' – nos