c程序中的sudo权限问题

时间:2014-08-01 13:10:10

标签: c permissions command sudo

我正在编写一个c程序,它执行一系列bash shell命令以获取机器中的处理器数量并相应地分配程序的亲和性。这是我的功能:

int getNoOfCPUs()
{

    system("sudo nproc | sudo tee /home/sanuri/Desktop/tempnproc.txt");
    printf("Created temp file..... \n");
    FILE *fr;
    fr = fopen ("/home/sanuri/tempnproc.txt", "r");

    printf("Opened file..... \n");
    printf("%d",errno);
    int i=0;
    int number[3];
    do{
        if(fr==NULL){
            fr = fopen ("/home/sanuri/tempnproc.txt", "r");
        }

        number[i] = fgetc(fr);
        if( feof(fr) )
        {
            break ;
        }
        printf("%c", number[i]);
        i++;
    }while(1);

    if(fr!=NULL){
        fclose(fr);
    }
    return number; 
}

我仍然坚持在fopen。由于权限问题,似乎文件未打开。此外,我无法通过此c程序运行最有用的命令,因为我必须使用sudo来运行它们,并且必须提供我的密码才能成功继续执行命令。我把自己添加到" sudo"组。但是,如果没有sudo并提供密码,我无法运行这些命令。这个问题的一般解决方案是什么?我该怎么做才能删除提供密码的要求,这样我就可以在没有sudo的情况下通过c程序运行命令?如果解决方案足够通用以使我的程序可移植到任何Linux平台,那就更好了。

1 个答案:

答案 0 :(得分:2)

首先,sudo tee ...将以用户root打开指定文件(如果它不存在),因此您无法将该文件视为非 - root用户。

其次,不要在程序中使用sudo,而应使用sudo调用程序本身。这样,如果您已经将其作为root运行,那么您将无法进行不必要的sudo来电。

第三,(至少在我的Ubuntu 14.04计算机上),似乎首先运行nproc并不需要sudo

最后,由于您使用的是Linux,因此最好使用popen来捕获nproc的输出,而不是将其传输到文件中。

此外,您不会检查第二次fopen来电的结果,这可能会导致段错误。