запуск нескольких команд с использованием popen в c

Я создаю программу, использующую C, которая работает в среде linux, которая должна запускать несколько команд, подобных этому

sudo -s

Ls

PWD

(предположим, что команды под sudo -s – это команды, которые должны быть суперпользователями, чтобы иметь возможность запускать их)

Теперь мне нужно сделать все выходные данные этих команд для дальнейшей обработки. Вот код

int executeCommand(char *command, char *result) { /*This function runs a command./*/ /*The return value is the output of command*/ int nSuccess = -1; FILE * fp = NULL; char buffer[1035]; if (command == NULL) render("Command is null"); if (result == NULL) render("result is null"); if (command!=NULL && result!=NULL) { fp=popen("sudo -s","w"); fwrite ( " ls", 1, 3, fp); fwrite ( " pwd", 1, 4, fp); if(fp!=NULL) { strcpy(result,"\0"); while(fgets(buffer, sizeof(buffer)-1,fp)!=NULL) { strcat(result,buffer); } pclose(fp); } nSuccess=0; } return nSuccess; } 

Вопрос в том, как я смогу выполнить ls и pwd, а затем получить его вывод? Спасибо 🙂

Формально говоря, в вашем посте нет вопросов, но

  1. если ваша проблема заключается в том, что ls и pwd не выполняются sudo -s : попробуйте добавить новую fwrite() в fwrite() s (так же, как вы бы набрали и свою оболочку):

      fwrite ( "ls\n", 1, 3, fp); fwrite ( "pwd\n", 1, 4, fp); 

    (a " " перед тем, как команда не должна быть обязательной)

  2. Не вызывайте fwrite() перед проверкой fp

  3. если вы вызываете fp=popen("sudo -s","w"); , вы не можете использовать fp для чтения. while(fgets(buffer, sizeof(buffer)-1,fp)!=NULL) не будет работать. Если вы хотите подключить команды к sudo и хотите прочитать результат, вам нужны две трубы, что делает вещи немного более сложными, или, может быть, вы можете перенаправить вывод sudo в файл temp и прочитать это потом:

     char tmpfile[L_tmpnam]; char cmd[1024]; tmpnam( tmpfile ); sprintf( cmd, "sudo -s >%s", tmpfile ); fp = popen( cmd, "w" ); .... pclose(fp); FILE *ofp = fopen( tmpfile, "r" ); if( rfp != null ) { while(fgets(buffer, sizeof(buffer)-1,rfp)!=NULL) { strcat(result,buffer); } fclose( rfp ); remove( tmpfile ); }