0

我知道如何将参数传递给system,例如:

char words[]="abcde";
sprintf(str, "echo %s",words);
system(str);

我写了一个简单的代码来暴力破解一个rar文件。

但我不知道如何system在提示出现时传递密码。

我在下面尝试这段代码

char pw[512];
for(int i=0;i<26;i++){
    char ch=i+'a';

    memset(pw, '\0', sizeof(512));
    system("unrar x filename");// prorgam will wait at this point for a password
    sprintf(pw, "%c",ch);   
    system(pw); //this line doesn't make sense....
}

system当程序等待输入时,如何将该数据传递给?

4

2 回答 2

4

system()如果您想直接与您指定的命令进行交互,则不能使用,因为它在system()描述中声明在system()指定命令完成之前不会返回:http ://www.tutorialspoint.com/c_standard_library/c_function_system.htm 。

正如 Marcelo 所指出的,如果您要向其发送数据的程序接受命令行参数,只需在您传递给system(). 如果您要调用的程序在标准输入上获取数据,另一种方法是将数据保存到临时文件,然后在命令行上指定标准输入重定向,然后在system()返回后删除您的文件:

char *inputFileName = mkstemp("/tmp/myinputXXXXXX");
// store data in inputFileName
char buf[128];
sprintf(buf, "/path/to/myprogram < %s", inputFileName);
system(buf);
unlink(inputFileName);

如果需要与运行的程序进行交互,则需要使用另一组库函数来启动进程,并在它们之间建立IPC机制。std 库有一个类似的功能system(),可以让你这样做:popen(). popen()允许您指定类似于 的命令行system(),但它会为创建的程序创建一个管道并返回一个 FILE *,它允许您的调用程序从/向子进程读取、写入或两者兼而有之:

FILE *myprogFP = popen("/path/to/myprog", "rw");
fprintf(myprogFP, "%d\n", i);
pclose(myprogFP);

有关处理这些函数的错误返回的更多信息和示例,请参见例如:http ://www.gnu.org/software/libc/manual/html_node/Pipe-to-a-Subprocess.html

于 2013-07-13T11:54:52.507 回答
3

Unrar 允许您在命令行中提供密码:

for (char ch = 'a'; ch <= 'z'; ++ch) {
    char cmdline[512];
    sprintf(cmdline, "unrar -p%c x filename", ch);
    system(cmdline);
}
于 2013-07-13T11:45:32.767 回答