【问题标题】:How to run a bash script from C++ program如何从 C++ 程序运行 bash 脚本
【发布时间】:2010-10-13 08:55:15
【问题描述】:

Bash 脚本非常有用,可以节省大量编程时间。那么如何在 C++ 程序中启动 bash 脚本呢?另外,如果您知道如何使用户成为超级用户,那也很好。谢谢!

【问题讨论】:

    标签: c++ linux bash shell


    【解决方案1】:

    使用system 函数。

    system("myfile.sh"); // myfile.sh should be chmod +x
    

    【讨论】:

    • 谢谢,但你忘了包括这个:system("./myfile.sh");
    • 当前目录.不应该在你的$PATH中。
    • @KeithThompson 该脚本不必位于您的当前目录中。关键是,system 函数中不需要在脚本前加上“.”。
    • @MehrdadAfshari:这个怎么样。如果脚本在当前目录中,您应该使用./。如果它位于您的$PATH 中,请不要使用./。 (. 可能不应该在$PATH 中,绝对不应该在$PATH 的前面。)
    • system() 必须谨慎使用。根据它的手册页:不要在具有 set-user-ID 或 set-group-ID 权限的程序中使用system(),因为某些环境变量的奇怪值可能会被用来破坏系统完整性。请改用exec(3) 系列函数,但不要使用execlp(3)execvp(3)。事实上,system()/bin/sh 是 bash 版本 2 的系统上无法从具有 set-user-ID 或 set-group-ID 特权的程序正常工作,因为 bash 2 在启动时会放弃特权。
    【解决方案2】:
    #include <stdio.h>
    #include <stdlib.h>
    
    // ....
    
    
    system("my_bash_script.sh");
    

    【讨论】:

    • 如果 bash 脚本将某些文本回显到 tty 会怎样?例如。如果它是一只“猫”呢? c程序能有那个输出吗?
    • 这是否要等到该过程完成?
    【解决方案3】:

    由于这是一个相当古老的问题,并且尚未添加此方法(除了 system() 调用函数),我想包含使用 C 二进制文件本身创建 shell 脚本会很有用。 shell 代码将存放在file.c 源文件中。下面是代码示例:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define SHELLSCRIPT "\
    #/bin/bash \n\
    echo -e \"\" \n\
    echo -e \"This is a test shell script inside C code!!\" \n\
    read -p \"press <enter> to continue\" \n\
    clear\
    "
    
    int main() {
    
    system(SHELLSCRIPT);
    return 0;
    }
    

    基本上,简而言之(双关语),我们定义脚本名称,充实脚本,将它们括在双引号中(同时插入适当的转义符以忽略 shell 代码中的双引号),然后调用该脚本的名称,在此示例中为 SHELLSCRIPT,使用 main() 中的 system() 函数。

    【讨论】:

    • 首先,感谢您的友好分享。我发现程序不会在"read -p \"press to continue\"\n\"这一行暂停。你知道为什么吗?
    【解决方案4】:

    唯一的标准强制实现依赖方法是使用来自stdlib.hsystem() 函数。

    如果你知道如何让用户成为超级用户也很好。

    您希望脚本以超级用户身份运行还是提升 C 可执行文件的权限?前者可以使用sudo 完成,但在使用sudo 之前,您需要了解一些事项。

    【讨论】:

      【解决方案5】:

      StackOverflow: How to execute a command and get output of command within C++?

      StackOverflow: (Using fork,pipe,select): ...nobody does things the hard way any more...

      另外,如果你知道如何让用户成为超级用户,那也很好。谢谢!

      须藤。苏。 chmod 04500。(setuid() 和 seteuid(),但它们要求您已经是 root。例如 chmod'ed 04***。)

      保重。这些可以打开“有趣的”安全漏洞...

      根据您的操作,您可能不需要 root。 (例如:我经常 chmod/chown /dev 设备(串行端口等)(在 sudo root 下)所以我可以在我的软件中使用它们而无需成为 root .另一方面,在加载/卸载内核模块时效果不佳......)

      【讨论】:

        猜你喜欢
        • 2011-03-01
        • 2021-01-27
        • 1970-01-01
        • 1970-01-01
        • 2019-07-20
        • 2016-03-15
        • 1970-01-01
        相关资源
        最近更新 更多