我使用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然后获得它的输出?谢谢:))
答案 0 :(得分:0)
从形式上讲,你的帖子中没有任何问题,但是
如果您的问题是ls
并且pwd
未执行sudo -s
:请尝试向fwrite()
添加换行符(就像您输入的那样)你的shell也是):
fwrite ( "ls\n", 1, 3, fp);
fwrite ( "pwd\n", 1, 4, fp);
(命令之前的" "
不是必要的)
在检查fwrite()
fp
如果您致电fp=popen("sudo -s","w");
,则无法使用fp
进行阅读。 while(fgets(buffer, sizeof(buffer)-1,fp)!=NULL)
无法工作。如果你想管道命令到 sudo
和想要读取输出,你需要两个管道,这会让事情变得复杂一点,或者你可以重定向sudo
输出到临时文件,然后读取:
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 );
}