如何从C++程序运行bash脚本

Kre*_*dns 46 c++ linux bash shell

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

Meh*_*ari 61

使用该system功能.

system("myfile.sh"); // myfile.sh should be chmod +x
Run Code Online (Sandbox Code Playgroud)

  • `system()`必须谨慎使用.根据它的手册页:_不要使用具有set-user-ID或set-group-ID权限的程序中的`system()`,因为某些环境变量的奇怪值可能会被用来破坏系统完整性.使用`exec(3)`函数系列代替,而不是`execlp(3)`或`execvp(3)`.实际上,`system()`在具有set-user-ID或set-group-ID权限的程序中不会在`/ bin/sh`是bash版本2的系统上正常工作,因为bash 2在启动时删除了特权._ (6认同)
  • @MehrdadAfshari:这个怎么样.如果脚本在当前目录中,则应使用`./`.如果它在你的`$ PATH`中的某个地方,请不要使用`./`.(`.`可能不应该在`$ PATH`中,绝对不应该在`$ PATH`的前面.) (4认同)
  • 谢谢,但你忘了包含这个:system("./ myfile.sh"); (3认同)
  • 当前目录`.`*不应该在你的`$ PATH`中. (2认同)

rlb*_*ond 17

#include <stdio.h>
#include <stdlib.h>

// ....


system("my_bash_script.sh");
Run Code Online (Sandbox Code Playgroud)

  • 如果bash脚本将某些文本回显给tty怎么办?例如,如果它是一只"猫"呢?c程序可以输出吗? (5认同)
  • 这要等到该过程完成吗? (2认同)

dir*_*tly 9

唯一标准的强制实现依赖方式是使用system()函数from stdlib.h.

此外,如果你知道如何让用户成为超级用户也会很好.

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


Mr.*_*Ree 5

StackOverflow:如何在C ++中执行命令并获取命令输出?

StackOverflow :(使用fork,pipe,select):...再也没有人以困难的方式做事...

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

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

照顾自己。这些可以打开“有趣的”安全漏洞。

根据您正在执行的操作,您可能不需要root用户。(例如:我经常使用chmod / chown / dev设备(串行端口等)(在sudo root下),因此我可以在没有root的情况下从软件中使用它们。另一方面,当加载/卸载内核模块...)


Yok*_*kai 5

因为这是一个非常老的问题,并且没有添加此方法(除了system()call函数之外),所以我认为包括使用C二进制本身创建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;
}
Run Code Online (Sandbox Code Playgroud)

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