Я создаю программу, использующую 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, а затем получить его вывод? Спасибо 🙂
Формально говоря, в вашем посте нет вопросов, но
если ваша проблема заключается в том, что ls
и pwd
не выполняются sudo -s
: попробуйте добавить новую fwrite()
в fwrite()
s (так же, как вы бы набрали и свою оболочку):
fwrite ( "ls\n", 1, 3, fp); fwrite ( "pwd\n", 1, 4, fp);
(a " "
перед тем, как команда не должна быть обязательной)
Не вызывайте fwrite()
перед проверкой fp
если вы вызываете 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 ); }