При попытке выяснить, лучший способ Пинг (ICMP) кое-что из питона, я наткнулся на эти вопросы:питон Непривилегированная 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?
Ответы обычно сводятся к «использованию этого стороннего модуля с привилегиями root» или «используйте команду ping системы и проанализируйте вывод». Из нативных методов icmplib и M. Cowles and J. Diemer's ping.py явно указывают на необходимость привилегий root, равно как и scapymanual.
Так что с этого фронта, изначально отправляя ICMP пинг без особых привилегий, кажется невозможным. Команда ping системы как-то справляется, но ее справочная страница не проливает свет на то, как. man page for icmp, с другой стороны, кажется, говорят, что это возможно:
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.
Так что, казалось бы, что, по крайней мере, согласно ИКМП, это разрешено. Итак, почему все инструменты python не могут это сделать? Являются ли инструменты python слишком общими и ожидаем, что любая работа над привилегированными сокетами будет привилегированной? Можно ли написать функцию ping в C, которая может ping без привилегий root, и расширять python этим? Кто-нибудь сделал это? Я просто неправильно понял проблему?
Какая операционная система вы используете? [Недавние ядра Linux] (https://lkml.org/lkml/2011/5/10/389) и Mac OS X, как известно, имеют непривилегированные ICMP-сокеты. Страница man, которую вы нашли, находится в OS X, и она должна работать. Я преуспел с непривилегированной программой pure-Python [ping program] (https://github.com/lilydjwg/winterpy/blob/master/pylib/icmplib.py), которая работает в Linux (с изменением настроек ядра) но могут потребоваться некоторые корректировки в OS X. – lilydjwg
Для Linuix, см. здесь http://stackoverflow.com/questions/8290046/icmp-sockets-linux/20105379#20105379, вам нужен специальный sysctl, чтобы иметь возможность использовать 'socket (AF_INET, SOCK_DGRAM, IPPROTO_ICMP) ' – nos