我在Linux上开发了一个C代码(Debian)。我不时需要通过system()
我想知道是否可以通过system()
以root身份执行命令。如果不是这样,是否有任何函数以root身份执行命令(或运行二进制文件),我可以在C代码上使用它?
答案 0 :(得分:3)
在我们想要普通用户执行root命令之前,我们遇到了这种情况,这是我们的解决方案(使用setuid / SUID):
假设:
Tom
gTom
my_pro.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);
}
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
...
int main() {
...
system("/usr/bin/mysudo yum install xxxxx");
...
}
#gcc && ls -l
#-rwxr--r-- 1 Tom gTom 1895797 Jul 23 13:55 my_pro
./my_pro
您可以执行yum install
而不sudo
。
答案 1 :(得分:1)
如果您是系统中具有sudo
权限以运行root
命令的用户,则只需将sudo
预先挂起到该命令。
system("sudo yum install some-package");
如果您希望任何人能够执行此操作,那么您必须是系统的管理员,将文件的所有者更改为root
,并将可执行文件的权限修改为{{ 1}}。通过这样做,您无需使用root
修改system()
命令字符串。
sudo
要意识到这样做可能会让您面临安全问题,除非您已经证明您的程序没有安全问题。
文件系统可能会禁止您在程序中设置chmod +s my_program
chown root my_program
位。如果您需要更多信息,请参阅SuperUser。
答案 2 :(得分:0)
这是要记住的一些行动方法。存在安全风险,因此请注意谁将使用它。在“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;
}