我想用 C 语言创建一个程序,以便让我在终端中运行命令。
我用 shell 脚本编写了一个程序,它可以返回我在浏览器中打开的任何网站的 IP。通过在终端中输入以下命令来执行此 shell 脚本:
sudo tcpdump -n dst port 80 -i eth
我的教授告诉我用 C 语言创建一个程序,它将打开终端并输入此命令,然后我的 shell 脚本就可以运行了。
请告诉我如何创建这样的程序。
答案1
你可以使用系统()函数可用标准库运行命令。
描述
system() 通过调用 /bin/sh -c string 来执行 string 中指定的命令,并在命令完成后返回。在命令执行期间,SIGCHLD 将被阻塞,SIGINT 和 SIGQUIT 将被忽略。
您可以在此处阅读更多相关信息http://linux.about.com/library/cmd/blcmdl3_system.htm
答案2
您好,我将为您编写一个示例代码,向您解释它,并真心希望这对您有所帮助。该函数的原型如下:
int系统(const char* cmd);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CMN_LEN 100
int main(int argc, char *argv[])
{
char cmd[MAX_CMN_LEN] = "", **p;
if (argc < 2) /*no command specified*/
{
fprintf(stderr, "Usage: ./program_name terminal_command ...");
exit(EXIT_FAILURE);
}
else
{
strcat(cmd, argv[1]);
for (p = &argv[2]; *p; p++)
{
strcat(cmd, " ");
strcat(cmd, *p);
}
system(cmd);
}
return 0;
}
1). 打开终端并编译程序
2). 运行它(例如在 Ubuntu 中) ./program_name comman_name -anything - anything
例如: ./a.out locale -a
此示例打印了我的编译器 gcc 支持的所有语言环境。
更多信息:
p 是指向字符的指针(就像 argv 一样)p = &argv[2],指向 - 任何字符串 i cat 所有 - 任何内容到我的 cmd 字符串我退出循环当 *p 指向 NULL 看看这个:-> 我将使用这个符号来表示指向(不要将它与右箭头选择运算符混淆)。
argv[0] -> 程序名称
argv[1] -> command_name (在此示例中,命令名称将是语言环境,但请输入您要检查的命令)
argv[2] -> -anything (在这个例子中是 -a,代表所有语言环境)
argv[3] -> NULL (在此示例中,退出循环)
好的,我想就是这样。
答案3
我假设这是关于使用 setuid-root 二进制文件来替换 sudo,而不仅仅是任意命令执行,所以我将包括解决方案的其他部分。
出于安全考虑,我们避免使用 system(),因为它可能被劫持。
编译完成后,将生成的二进制文件安装为 setuid-root。
#包括 <unistd.h> #包括 <stdio.h> #包括 <sysexits.h> int main(int argc,char **argv) { if (argc > 2) { fputs("太多参数\n", stderr); 返回 EX_USAGE; } if (argc > 1 && argv[1][0] == '-') { fputs("不允许使用选项\n", stderr); 返回 EX_USAGE; } if (geteuid() != 0) { fputs("未正确安装为 setuid-root\n",stderr); 返回 EX_UNAVAILABLE; } 如果 (setuid(0) 1) p[6] = argv[1]; /* 如果一切顺利,execv 将不会返回 *(因为这个程序将被 tcpdump 替换)*/ execv(p0,p); /* 如果我们到达这里那么 execv 一定失败了 */ p错误(p0); 返回 EX_OSFILE; }
如果您已将其保存为foo.c
,并希望将其安装为/usr/local/sbin/foo
,请运行:
制作 foo && 安装 -o root -m 4511 foo /usr/local/sbin/foo