繁体   English   中英

如何以root身份执行命令

[英]how to execute a command as root

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

我想知道是否可以通过system()以root身份执行命令。 如果不是这样,是否有任何函数可以以root身份执行命令(或运行二进制文件),我可以在C代码上使用它?

在我们想要普通用户执行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

您可以在没有sudo情况下执行yum install

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

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

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

chmod +s my_program
chown root my_program

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

文件系统可能会禁止您在程序上设置setuid位。 如果您需要更多信息,请咨询SuperUser

这是要记住的那些包包技巧之一。 存在安全风险,因此请注意谁将使用它。 在“system”命令中,您甚至可以执行外部脚本...虽然这会打开主要的安全风险,因为虽然这个二进制文件必须在每次编译时重新设置权限,但脚本可以无限更改,并且此二进制文件将继续调用它。

#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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM