在没有root权限的Python中创建原始套接字

时间:2013-12-24 15:10:55

标签: python linux sockets raw-sockets

是否可以创建没有root权限的原始套接字?如果没有,脚本可以自行提升其权限吗?

我使用原始套接字写了一个Python脚本:

#!/usr/bin/env python

import socket
rawSocket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
print "Worked!"

以root权限运行它会打印Worked!。但是,使用普通用户权限运行时会出错。

我想以普通用户身份执行我的脚本,它应该创建一个原始套接字而不需要任何东西。有可能吗?

3 个答案:

答案 0 :(得分:10)

正如您所指出的,原始套接字需要比普通用户更高的权限。 您可以通过两种方式解决此问题:

  1. 使用chmod +s file之类的命令激活文件的SUID位,并使用root将其所有者设置为chown root.root file。这将以root身份运行您的脚本,无论执行它的有效用户如何。当然,如果你的脚本有一些缺陷,这可能会很危险。
  2. 使用setcap cap_net_raw+ep file之类的命令在给定文件上设置CAP_NET_RAW功能。这将只为其提供打开原始套接字所需的权限,而不是其他任何权限。
  3. 编辑:

    正如@Netch指出的那样,给定的解决方案不适用于任何解释语言(如Python)。你需要一些“黑客”来使它工作。尝试使用谷歌搜索获取“Python SUID”,你应该找到一些东西。

答案 1 :(得分:5)

没有办法让非特权进程(Python或其他方法)提升自己的权限。这是拥有这整个特权/非特权用户的基石之类的东西。关于原始套接字,从手册页raw(7):

  

只允许有效用户ID为0或CAP_NET_RAW功能的进程打开原始套接字。

用户ID为0表示root。请参阅here for info about raw sockets on linux

正如Faust的回答/评论所指出的那样,你将无法直接为你的python程序设置CAP_NET_RAW功能,因为它是一个由Python解释器执行的脚本,但是可能有解决方案。网络可以解决这个限制。

答案 2 :(得分:0)

您还可以使用sudoers文件走另一条路径并设置应用程序,然后通过sudo运行它