【发布时间】:2011-10-13 04:11:24
【问题描述】:
我正在学习如何在 Linux 中使用原始套接字。我正在尝试创建一个这样的套接字:
if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
perror("socket() failed");
exit(-1);
}
但发布后我得到的只是:
socket() 失败:不允许操作
我知道只有 root 可以创建原始套接字,但如果我使用 SUID 位或 sudo 运行它 - 问题是一样的。怎么了?系统是Ubuntu 11.04。
也许我包含了不必要的标题?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netdb.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
我想知道 - 为什么 SUID 没用?
【问题讨论】:
-
有趣;试图成为真正的根? (并且在执行该行之前不会删除检查的权限?)
-
不,我只是调用 setuid(getuid());在套接字创建之后,但它甚至没有达到。
-
如果你这样做:sudo bash(或 sudo 不管你使用什么shell)然后你执行程序......?有用吗?
-
嗯,是的,它就是这样工作的。但是为什么suid没用呢?
-
您是否尝试过seteuid -- 程序上的setuid位没有设置有效的uid,可能需要以编程方式设置。
标签: c sockets networking