如何以root身份执行命令

我在Linux(Debian)上开发了一个C代码。 有时候,我需要通过system()来执行一些命令

我想知道是否可以通过system()作为根执行命令。 如果不是这种情况,是否有任何函数来执行一个命令(或运行一个二进制文件)作为我可以在C代码上使用的根?

Solutions Collecting From Web of "如何以root身份执行命令"

我们之前遇到过这种情况,我们想要由普通用户执行root命令,这里是我们的解决方案(使用setuid / SUID):

假使,假设:

  • 用户名Tom
  • gTom
  • C程序文件my_pro.c

第1步:编写一个C代码工具: my_sudo.c

 ... int main(int args, char *argv[]) { if (args < 2) printf("Usage: my_sudo [cmd] [arg1 arg2 ...]"); // cmd here is the shell cmd that you want execute in "my_pro" // you can check the shell cmd privilege here // example: if (argv[1] != "yum") return; we just allow yum execute here char cmd[MAX_CMD]; int i; for ( i = 2; i < args; i ++) { // concatenate the cmd, example: "yum install xxxxx" strcat(cmd, " "); strcat(cmd, argv[i]); } system(cmd); } 

第2步:编译my_sudo.c以获得my_sudo可执行文件

  sudo chown root:gTom my_sudo // user root && gTom group sudo chmod 4550 my_sudo // use SUID to get root privilege #you will see my_sudo like this(ls -l) #-r-sr-x--- 1 root my_sudo 9028 Jul 19 10:09 my_sudo* #assume we put my_sudo to /usr/sbin/my_sudo 

第3步:在你的C代码

 ... int main() { ... system("/usr/bin/mysudo yum install xxxxx"); ... } #gcc && ls -l #-rwxr--r-- 1 Tom gTom 1895797 Jul 23 13:55 my_pro 

第4步:执行./my_pro

你可以执行没有sudoyum install

如果您是系统上具有以root身份运行命令的sudo权限的root ,只需将命令sudo预先挂起即可。

 system("sudo yum install some-package"); 

如果你希望有人能够做到这一点,那么你必须是你的系统管理员,将文件的所有者更改为root ,并修改可执行文件的权限,以root身份运行。 通过这样做,你不需要用sudo修改你的system()命令字符串。

 chmod +s my_program chown root my_program 

意识到这样做可能会使您面临安全问题,除非您已经证明您的程序没有安全问题。

文件系统可能会阻止你在程序中设置setuid位。 如果你需要更多的信息,你应该咨询超级用户 。

这是要牢记的那些技巧之一。 有安全风险,所以只要知道谁会使用它。 在“系统”命令中,你甚至可以执行外部脚本……尽管这会带来重大的安全风险,因为当这个二进制文件每次编译时必须重新设置权限时,脚本可以被无休止地改变,这个二进制文件将继续调用它。

 #include <stdio.h> #include <stdlib.h> //Create as root //gcc fixmusic.c -o fixmusic //chmod u+s fixmusic //now run as non-root user and it should work despite limitations of user int main(int argc, char *argv[] ) { setuid(0); char command[100]; sprintf(command,"/usr/bin/chmod -R a+w /mnt/Local/Music"); system(command); //This is just optional info if someone cat's the binary volatile const char comment [] = "INFO: Fixes music permissions"; return 0; }