问题描述
涉及使用系统
命令和传递变量。这是一个例子:
This question talks about using the system
command and passing variables. Here is an example it gives:
string cmd("curl -b cookie.txt -d test=");
cmd += line;
cmd += " http://example.com";
system(cmd.c_str());
其中一个意见提到如果行
已通过并载入 foo& fire_nukes.exe& REM
然后很可能发生不好的事情。
One of the comments mentions that if line
was passed and contained foo & fire_nukes.exe & REM
then it's quite possible something bad could happen.
PHP有一个很好的功能,叫做 escape_shell_args
它可以用于转义正在传递给程序的参数。 C ++有办法做到这一点吗?
PHP has a great function called escape_shell_args
which can be used to escape parameters that are being passed to the program. Does C++ have a way to do that?
推荐答案
最好的方法是不要使用 system()
。使用 fork()
和 exec()
和朋友。
这是一个例子:
The best way is not to use system()
at all. Use fork()
and exec()
and friends.Here's an example:
#include <string>
#include <unistd.h>
#include <error.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <cstdlib>
int fork_curl(char *line)
{
std::string linearg("line=");
linearg += line;
int pid = fork();
if(pid != 0) {
/* We're in the parent process, return the child's pid. */
return pid;
}
/* Otherwise, we're in the child process, so let's exec curl. */
execlp("curl", "-b", "cookie.txt", "-d", linearg.c_str());
/* exec is not supposed to return, so something
must have gone wrong. */
exit(100);
/* Note: You should probably use an exit status
that doesn't collide with these used by curl, if possible. */
}
int main(int argc, char* argv[])
{
int cpid = fork_curl("test");
if(cpid == -1) {
/* Failed to fork */
error(1, errno, "Fork failed");
return 1;
}
/* Optionally, wait for the child to exit and get
the exit status. */
int status;
waitpid(cpid, &status, 0);
if(! WIFEXITED(status)) {
error(1, 0, "The child was killed or segfaulted or something\n");
}
status = WEXITSTATUS(status);
/* Status now contains the exit status of the child process. */
}
这篇关于如何使用C ++将变量发送到'system'命令?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!