【问题标题】:Calling "bash [script name]" in C在 C 中调用“bash [脚本名称]”
【发布时间】:2019-10-31 04:18:37
【问题描述】:

我正在尝试运行 bash 脚本来生成 OpenSSL 证书。我的 bash 脚本与我的 c 代码位于同一目录中。

相关C代码:

pid_t pid = fork();
if(pid > 0){
    char* arr[] = {"./generate_cert.sh", "direct"};
    int succ = execv(arr[0], arr);
    printf("succ: %d\n", succ);
    exit(1);
}else if(pid < 0){
    printf("Fork failed\n");
    exit(-1);
}

generate_cert.sh,我最终将扩展的测试 bash 脚本是:

#!/bin/bash
echo "$1"

看来我的权限被 ./generate_cert.sh 拒绝了。我需要改为运行 bash generate_cert.sh。如何使用 execv 执行此操作?

【问题讨论】:

  • 这不是错误。使用perror("execv failed") 获取实际错误。
  • 感谢您提供有关 perror 的提示。我确实得到了拒绝的许可。有没有办法改为运行bash generate_cert.sh
  • 如果我用“bash generate_cert.sh”代替第一个参数,我会得到错误:“没有这样的文件或目录”,因为我现在没有指向脚本位置。

标签: c linux bash


【解决方案1】:

根据execv man页面,数组必须以空指针终止。

所以有些类似(未经测试):

  char* arr[] = {"./generate_cert.sh", "direct",NULL};
  int succ = execv(arr[0], arr);

编辑

OP 的问题原来是脚本文件上没有设置执行位。 chmod +x generate_cert.sh 解决了这个问题,但是另一种选择是调用 execv 来代替 /bin/bash。即类似的东西。

char* arr[] = {"/bin/bash", "./generate_cert.sh", "direct",NULL};
int succ = execv(arr[0], arr);

【讨论】:

  • 我试过这个,但我仍然收到错误。当我尝试在终端中直接运行 ./generate_cert.sh 时,我得到“-bash: ./generate_cert.sh: Permission denied”。但是,我可以直接运行 bash generate_cert.sh 并成功运行。这可能是问题吗?
  • 是的,这是个问题,您需要chmod +x generate_cert.sh 才能使脚本可执行
  • 那是我的问题。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
相关资源
最近更新 更多