首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python非特权icmp

Python非特权icmp
EN

Stack Overflow用户
提问于 2018-03-15 05:10:13
回答 2查看 0关注 0票数 0

在试图从python中找出进行ping(ICMP)的最佳方法时,我遇到了以下问题:

  • 如何在python中执行ping或traceroute,在生成输出时访问它?
  • 用python平一个站点
  • 如何使用本地python执行ping或traceroute操作?

答案通常归结为“使用具有根权限的第三方模块”或“使用系统的ping命令并解析输出”。本土的方法,icmplib

因此,从这方面来说,在没有特权的情况下,本地发送ICMP请求似乎是不可能的。Systemping命令确实以某种方式进行管理,但它的手册页没有说明如何进行管理。大ICMP手册页另一方面,似乎是有可能的:

代码语言:txt
复制
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.

所以看起来,至少根据ICMP,这是允许的。那么,为什么所有python工具都无法做到这一点呢?python工具是否过于通用,并期望特权套接字上的任何工作都是特权的?是否可以用C编写一个ping函数,它可以在没有根权限的情况下进行ping,并用它扩展python?有人做过这个吗?我刚才有没有误解这个问题?

EN

回答 2

Stack Overflow用户

发布于 2018-03-15 13:34:22

ping程序安装setuid根。这允许任何用户使用该程序,并且仍然能够打开原始套接字。

打开原始套接字后,通常会删除根特权。

您通常需要一个原始套接字才能正确执行ICMP,而原始套接字通常是受限的。所以这根本不是python的错。

关于上面关于ICMP的一点,显然许多实现并不真正支持这些标志的组合。因此,很可能大多数的实现只是使用他们“知道”的方式在大多数/所有架构上工作。

票数 0
EN

Stack Overflow用户

发布于 2018-03-15 15:03:15

下面是/sbin/ping如何“以某种方式管理”(在大多数Unix-y系统上):

代码语言:txt
复制
$ ls -l /sbin/ping
-r-sr-xr-x  1 root  wheel  68448 Jan 26 10:00 /sbin/ping

看到没?它是由root有关键的s权限-setuserid中的位。所以,不管哪个用户正在运行它,ping以根形式运行

如果您使用的是一个带有新的“非特权ICMP套接字”的BSD内核,那么很有兴趣了解如何使用该功能从Python中进行ping(当然,这不会对处于较低级别内核上的任何用户有所帮助)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档