Shell `sudo`to追加到具有根权限的文件中(在`system(3)`from C中)

Shell `sudo`to追加到具有根权限的文件中(在`system(3)`from C中),shell,unix,sudo,Shell,Unix,Sudo,我正试图使用sudo从非特权C程序内部写入/etc中的文件,该文件只能由root写入 system("sudo /bin/sh -c 'echo 'iface wlan0 inet dhcp' >> /etc/network/interfaces'"); 这似乎没有失败,但文件未被修改。有什么问题吗?按照您的结构,重定向在sudo操作之外进行计算,因此没有root权限,无法打开/etc/network/interfaces进行写入。您需要这样做: system("sudo /bin

我正试图使用
sudo
从非特权C程序内部写入
/etc
中的文件,该文件只能由
root
写入

system("sudo /bin/sh -c 'echo 'iface wlan0 inet dhcp' >> /etc/network/interfaces'");

这似乎没有失败,但文件未被修改。有什么问题吗?

按照您的结构,重定向在
sudo
操作之外进行计算,因此没有root权限,无法打开
/etc/network/interfaces
进行写入。您需要这样做:

system("sudo /bin/sh -c \"echo 'iface wlan0 inet dhcp' >> /etc/network/interfaces\"");
因此重定向由sudo内部的shell进行计算


(此外,您不能在单引号中嵌套单引号。)

按照您的结构,重定向在
sudo
操作之外进行计算,因此没有根权限,无法打开
/etc/network/interfaces
进行写入。您需要这样做:

system("sudo /bin/sh -c \"echo 'iface wlan0 inet dhcp' >> /etc/network/interfaces\"");
因此重定向由sudo内部的shell进行计算


(另外,您不能在单引号中嵌套单引号。)

为了完整起见,下面是我如何“用C方式”实现的:

#包括
#包括
#包括
#包括
内部主(空){
const char string_to_append[]=“iface wlan0 inet dhcp\n”;
大小\u t字符串\u大小;
文件*fd;
/*检查权限*/
if(getuid()){
fprintf(stderr,“以根用户身份运行!\n”);
返回退出失败;
}
/*现在尝试打开文件进行附加
*注意:如果没有足够的内存,fopen()无论如何都会失败
*以指定模式打开此文件的权限,
*因此,上面调用getuid()的检查有些多余
*/
if((fd=fopen(“/etc/network/interfaces”,“a”))==NULL){
perror(“打开文件时出错”);
返回退出失败;
}
/*实际写作发生在这里*/
string\u size=strlen(string\u-to\u-append);
if(fwrite(string\u to\u append,sizeof(char),string\u size,fd)!=string\u size){
fprintf(stderr,“写入文件时出错”);
返回退出失败;
}
返回退出成功;
}

为了完整起见,以下是我将如何用“C方式”实现这一点:

#包括
#包括
#包括
#包括
内部主(空){
const char string_to_append[]=“iface wlan0 inet dhcp\n”;
大小\u t字符串\u大小;
文件*fd;
/*检查权限*/
if(getuid()){
fprintf(stderr,“以根用户身份运行!\n”);
返回退出失败;
}
/*现在尝试打开文件进行附加
*注意:如果没有足够的内存,fopen()无论如何都会失败
*以指定模式打开此文件的权限,
*因此,上面调用getuid()的检查有些多余
*/
if((fd=fopen(“/etc/network/interfaces”,“a”))==NULL){
perror(“打开文件时出错”);
返回退出失败;
}
/*实际写作发生在这里*/
string\u size=strlen(string\u-to\u-append);
if(fwrite(string\u to\u append,sizeof(char),string\u size,fd)!=string\u size){
fprintf(stderr,“写入文件时出错”);
返回退出失败;
}
返回退出成功;
}

您是想改为标记
c
吗?已尝试过,但不起作用。我想在根目录的文件接口中添加行“iface wlan0 inet dhcp”,我已经为您修改了您的问题;这更像是一个空壳问题,而不是C问题。(最重要的是,当有人说“系统调用”时,大多数Unix C专家都不会想到库函数
system
——这个术语只用于较低级别的操作。)您的意思是要标记
C
吗?已经尝试过了,但不起作用。我想在根目录的文件接口中添加行“iface wlan0 inet dhcp”,我已经为您修改了您的问题;这更像是一个空壳问题,而不是C问题。(最重要的是,当有人说“系统调用”时,大多数Unix C专家都不会想到库函数
system
——这个术语只适用于低级别的操作。)