gpt4 book ai didi

C++,是否有可能(以及如何)通过 exec() 运行多 Action 、单行 curl 命令?

转载 作者:太空狗 更新时间:2023-10-29 21:39:20 25 4
gpt4 key购买 nike

我有一个 curl 命令:

curl -c cookies.txt -b cookies.txt -k https://www.example.com/ajaxauth/login -d 'identity=email@example.com&password=pa$$w0rd&query=https://example.com/data/format/json' > ~/Documents/.../myProject/bin/data/myData.json"

那个

  1. 登录 API,
  2. 管理 cookie,
  3. 获取数据集并保存到本地文件。

我把它放在一个字符数组中并发送到 system() 命令,但是由于将变量(电子邮件和密码)传递给 system() 的危险>,我必须改用 exec()。我不熟悉这个命令,文档让我感到困惑。所以我的问题:

  • 这甚至可能吗?或者我必须返回并将我的命令分解为单个调用甚至多个 exec 调用?

  • 我假设我应该使用 execv 版本,因为我传递的是整个字符数组,这是否正确?

  • 许多不同的消息来源说 exec() 命令的第一个参数必须是一个可执行文件。 For example , "按照惯例,第一个参数应该指向与正在执行的文件关联的文件名。"curl 命令如何算作这样的?

  • 为什么是this person传递 (char *) 0 作为最后一个参数?

这是我目前所拥有的:

int pid = fork();

switch(pid){
case -1:{
perror("fork"); // via https://stackoverflow.com/q/2329640/1757149
_exit(EXIT_FAILURE);
break;
}
case 0:{ // child process
//execv(cmd, ???);
break;
}
default:{ // parent process
break;
}
}

请注意,我无法使用 libcurl。任何帮助表示赞赏!

最佳答案

您可以使用 execlp 来执行您的命令,像这样拆分参数(添加 NULL 以指示参数结束):

execlp("curl","curl","-c","cookies.txt","-b","cookies.txt","-k","https://www.example.com/ajaxauth/login","-d","identity=email@example.com&password=pa$$w0rd&query=https://example.com/data/format/json",NULL);

第一个参数是将从 PATH 中搜索的可执行文件,第二个参数在 manpage 中引用作为“按照惯例,第一个参数应该指向与正在执行的文件关联的文件名。

为了将 exec 的输出重定向到一个文件,你应该用输出文件替换标准输出:

int out = creat("myData.json", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
dup2(out,STDOUT_FILENO);

放在一起:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>

int main()
{
int pid = fork();
switch(pid){
case -1:{
perror("fork");
_exit(EXIT_FAILURE);
break;
}
case 0:{ // child process
// create output file
int out = creat("myData.json", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (out == -1){
perror("creat");
_exit(EXIT_FAILURE);
} else {
// redirect stdout to output file
dup2(out,STDOUT_FILENO);
// exec the command
execlp("curl","curl","-c","cookies.txt","-b","cookies.txt","-k","https://www.example.com/ajaxauth/login","-d","identity=email@example.com&password=pa$$w0rd&query=https://example.com/data/format/json",NULL);
// close output file
close(out);
}
break;
}
default:{ // parent process
// wait for child process
int status = 0;
wait(&status);
printf("child status:%d\n",status);
break;
}
}
return 0;
}

关于C++,是否有可能(以及如何)通过 exec() 运行多 Action 、单行 curl 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33293910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com