是否可以创建没有root权限的原始套接字?如果没有,脚本可以自行提升其权限吗?
我使用原始套接字写了一个Python脚本:
#!/usr/bin/env python
import socket
rawSocket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
print "Worked!"
以root权限运行它会打印Worked!
。但是,使用普通用户权限运行时会出错。
我想以普通用户身份执行我的脚本,它应该创建一个原始套接字而不需要任何东西。有可能吗?
答案 0 :(得分:10)
正如您所指出的,原始套接字需要比普通用户更高的权限。 您可以通过两种方式解决此问题:
chmod +s file
之类的命令激活文件的SUID位,并使用root
将其所有者设置为chown root.root file
。这将以root身份运行您的脚本,无论执行它的有效用户如何。当然,如果你的脚本有一些缺陷,这可能会很危险。setcap cap_net_raw+ep file
之类的命令在给定文件上设置CAP_NET_RAW功能。这将只为其提供打开原始套接字所需的权限,而不是其他任何权限。编辑:
正如@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运行它