【发布时间】:2010-10-13 08:55:15
【问题描述】:
Bash 脚本非常有用,可以节省大量编程时间。那么如何在 C++ 程序中启动 bash 脚本呢?另外,如果您知道如何使用户成为超级用户,那也很好。谢谢!
【问题讨论】:
Bash 脚本非常有用,可以节省大量编程时间。那么如何在 C++ 程序中启动 bash 脚本呢?另外,如果您知道如何使用户成为超级用户,那也很好。谢谢!
【问题讨论】:
使用system 函数。
system("myfile.sh"); // myfile.sh should be chmod +x
【讨论】:
.不应该在你的$PATH中。
system 函数中不需要在脚本前加上“.”。
./。如果它位于您的$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 在启动时会放弃特权。
#include <stdio.h>
#include <stdlib.h>
// ....
system("my_bash_script.sh");
【讨论】:
由于这是一个相当古老的问题,并且尚未添加此方法(除了 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() 函数。
【讨论】:
唯一的标准强制实现依赖方法是使用来自stdlib.h 的system() 函数。
如果你知道如何让用户成为超级用户也很好。
您希望脚本以超级用户身份运行还是提升 C 可执行文件的权限?前者可以使用sudo 完成,但在使用sudo 之前,您需要了解一些事项。
【讨论】:
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 .另一方面,在加载/卸载内核模块时效果不佳......)
【讨论】: