我在Linux (Debian)上开发C代码。有时,我需要通过system()
执行一些命令。
我想知道是否可以通过system()
以root身份执行命令。如果不行,是否有任何函数可以在C代码中以root身份执行命令(或运行二进制文件)?
...
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
您可以在不使用sudo
的情况下执行yum install
命令。
mysudo 'arg;sh'
来获得root
shell。而且你没有像sudo
那样对环境进行净化。 - Stephane Chazelassudo
权限以作为root
运行命令的用户,则只需在命令前加上sudo
即可。system("sudo yum install some-package");
root
,并修改可执行文件的权限以作为root
运行。这样做可以避免使用sudo
修改system()
命令字符串。chmod +s my_program
chown root my_program
getuid()
和 setuid()
以及相关内容获取更多信息。在要执行的命令前加上 sudo
程序是几乎唯一可行的方法。(还有各种不太正常的方法,但作为 root 运行的程序是风险,大风险)。 - Jonathan Lefflersystem()
的程序。然后,你可以在系统上创建一个新用户,专门用于运行这个程序。你可以将这个新用户添加到sudo列表中,无需输入密码,但需要指定允许运行的命令。此列表应与你的程序将调用的system()
命令相匹配。然后,在你的system()
命令之前加上sudo
并设置可执行文件的setuid
位,并将其chown
给新用户。 - jxh#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;
}