我知道如何将参数传递给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, ' ', 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
?
如果要直接与指定的命令交互,则不能使用system()
,因为它在system()
描述中指出,在指定的命令完成之前,system()
不会返回:http://www.tutorialspoint.com/c_standard_library/c_function_system.htm.
正如Marcelo所指出的,如果要向其发送数据的程序接受命令行参数,只需在传递给system()
的命令行中指定数据即可。如果要调用的程序在stdin上获取数据,另一种方法是将数据保存到一个临时文件中,然后在命令行上指定stdin重定向,然后在system()
返回delete your file:
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*允许您的调用程序从/向子进程读取、写入数据:
FILE *myprogFP = popen("/path/to/myprog", "rw");
fprintf(myprogFP, "%dn", i);
pclose(myprogFP);
有关处理这些函数返回的错误的更多信息和示例,请参见例如:http://www.gnu.org/software/libc/manual/html_node/Pipe-to-a-Subprocess.html
Unrar允许您作为命令行的一部分提供密码:
for (char ch = 'a'; ch <= 'z'; ++ch) {
char cmdline[512];
sprintf(cmdline, "unrar -p%c x filename", ch);
system(cmdline);
}