我想用C语言创建一个程序,使我可以在终端中运行命令。
我用Shell脚本编写了一个程序,该程序可以为我在浏览器中打开的任何网站提供ip。通过在终端中输入以下命令来执行此shell脚本:
sudo tcpdump -n dst port 80 -i eth
我的教授告诉我用C语言创建一个程序,该程序将打开终端并输入此命令,然后我的Shell脚本将起作用。
请告诉我如何创建这样的程序。
我想用C语言创建一个程序,使我可以在终端中运行命令。
我用Shell脚本编写了一个程序,该程序可以为我在浏览器中打开的任何网站提供ip。通过在终端中输入以下命令来执行此shell脚本:
sudo tcpdump -n dst port 80 -i eth
我的教授告诉我用C语言创建一个程序,该程序将打开终端并输入此命令,然后我的Shell脚本将起作用。
请告诉我如何创建这样的程序。
Answers:
您可以使用stdlib.h中提供的system()函数来运行命令。
描述
system()通过调用/ bin / sh -c字符串执行在字符串中指定的命令,并在命令完成后返回。在执行命令期间,SIGCHLD将被阻止,并且SIGINT和SIGQUIT将被忽略。
您可以在这里http://linux.about.com/library/cmd/blcmdl3_system.htm阅读更多有关它的信息。
您好,我会为您编写一个示例代码,向您解释它,并希望对您有所帮助。该函数的原型如下所示:
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-任何
示例:./ a.out语言环境-a
这个例子显示了我的编译器gcc支持的所有语言环境。
更多信息:
p是指向char的指针的指针(类似于argv是p =&argv [2]),指向-anything字符串,我将所有内容都保留了-指向我的cmd字符串的所有内容,当* p指向NULL时,我退出了循环:->我将使用此符号说出指向(不要将其与右箭头选择运算符混淆)。
argv [0]-> program_name
argv [1]-> command_name(在此示例中,命令名称将是语言环境,但请输入要检查的命令)
argv [2]-> -anything(在此示例中-a,它是所有语言环境)
argv [3]-> NULL(在此示例中,这退出了循环)
好吧,我想。
我将假定这是关于使用setuid-root二进制文件替换sudo,而不是仅仅执行任意命令,因此,我将包括解决方案的其他部分。
出于安全考虑,我们避免使用system(),因为它可以被劫持。
编译之后,将生成的二进制文件安装为setuid-root。
#include <unistd.h> #include <stdio.h> #include <sysexits.h> int main(int argc,char ** argv){ 如果(argc> 2){fputs(“太多的args \ n”,stderr); 返回EX_USAGE; } 如果(argc> 1 && argv [1] [0] =='-'){fputs(“ no options allowed \ n”,stderr); 返回EX_USAGE; } 如果(geteuid()!= 0){fputs(“未正确安装为setuid-root \ n”,stderr); 返回EX_UNAVAILABLE; } if(setuid(0)1)p [6] = argv [1]; / *如果一切顺利,execv将不会返回 *(因为该程序将被tcpdump替换)* / execv(p0,p); / *如果到达此处,则execv必须失败* / perror(p0); 返回EX_OSFILE; }
如果已将其保存为foo.c
,并希望将其安装为/usr/local/sbin/foo
,请运行:
使foo && install -o root -m 4511 foo / usr / local / sbin / foo