C 使用SUID以root用户身份运行程序

C 使用SUID以root用户身份运行程序,c,suid,C,Suid,不要告诉我这是一个重复,因为我已经读过类似的问题,但我就是不能让它为我工作 这是我的C程序whoami.C: #include <stdio.h> #include <stdlib.h> int main() { system("whoami"); } 我认为执行位中的s意味着无论是谁启动这个程序,它都将以root用户身份运行,所以我的问题是,为什么这不起作用 如果这样做是不可能的,我怎么能让任何用户以root用户身份运行特定的程序呢?这对

不要告诉我这是一个重复,因为我已经读过类似的问题,但我就是不能让它为我工作

这是我的C程序
whoami.C

#include <stdio.h>
#include <stdlib.h>

int main() {
    system("whoami");
}
我认为执行位中的
s
意味着无论是谁启动这个程序,它都将以root用户身份运行,所以我的问题是,为什么这不起作用


如果这样做是不可能的,我怎么能让任何用户以root用户身份运行特定的程序呢?

这对我来说很有效:添加
setuid(geteuid())在运行de命令之前

要使用
setuid()
geteuid()
您需要导入
unistd.h

工作方案:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    setuid(geteuid());
    system("whoami");
}
#包括
#包括
#包括
int main(){
setuid(geteuid());
系统(“whoami”);
}
如果您使用与问题相同的命令设置SUID,则无论哪个用户运行此程序,都会得到
root
作为输出

如果需要root权限,也可以使用任何其他命令,而不是
whoami


我在一个

中看到了这个设置,读了这个:然后读了
whoami
手册页…还检查了你的卷是否没有安装
-nosuid
。请澄清一下
whoami
只是一个例子,我不能使用同样的方法来保护根目录文件,但是我可以添加
sudo
当然这是正常的行为,SUID seams是完全无用的。@Tommimon SUID seams是完全无用的。你认为sudo是如何工作的?不,恰恰相反。你正在改变现实,你需要有效的方法。要更改有效的uid,请调用
setuid()
(请参阅
man 2 setuid
)。只有在实际uid为root时才能执行此操作。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    setuid(geteuid());
    system("whoami");
}